黃章菡
桂林航天工業(yè)學(xué)院,廣西 桂林 541004
游戲引擎應(yīng)用開發(fā)是數(shù)字媒體技術(shù)專業(yè)大三下學(xué)期的一門專業(yè)課程。該課程是讓學(xué)生通過學(xué)習(xí)游戲引擎Unity 來掌握開發(fā)游戲的技能,對學(xué)生的編程能力要求很高,學(xué)生如果沒有一定的編程能力就很難學(xué)好這門課程。然而,很多學(xué)生的編程能力有限,還達(dá)不到開發(fā)游戲的要求,導(dǎo)致他們在學(xué)習(xí)游戲引擎應(yīng)用開發(fā)時出現(xiàn)困難。因此,研究游戲引擎應(yīng)用開發(fā)銜接課非常重要。目前,單純研究游戲引擎教學(xué)課程的文獻(xiàn)有很多,面向?qū)ο缶幊陶n程的文獻(xiàn)也很多。但是據(jù)文獻(xiàn)調(diào)研,目前還未發(fā)現(xiàn)游戲引擎應(yīng)用開發(fā)銜接課的相關(guān)研究。
游戲引擎應(yīng)用開發(fā)課程是一門對實踐能力要求較高的課程,不僅要求學(xué)生掌握游戲引擎的場景編輯、動畫處理、邏輯管理、視覺特效等功能,而且要求學(xué)生能利用這些功能模塊結(jié)合C#編程語言編寫游戲邏輯,制作出具有可玩性的游戲,在學(xué)生自己動手制作游戲的過程中鞏固和加深他們對游戲引擎的理解,讓知識點與實踐內(nèi)容相輔相成。對于實踐部分,掌握C#語法和面向?qū)ο蟪绦蛟O(shè)計思維是必備的前置知識。
我們對數(shù)字媒體專業(yè)學(xué)生的編程能力進(jìn)行分析后,發(fā)現(xiàn)如下情況。1.學(xué)生的編程能力參差不齊。編程相關(guān)課程前后連接緊密,一旦某個知識點跟不上,后面的課程就會越落越遠(yuǎn),導(dǎo)致部分學(xué)生失去信心,畏難情緒嚴(yán)重,在游戲引擎應(yīng)用開發(fā)課中一旦遇到與編程相關(guān)的知識就會放棄。2 數(shù)字媒體專業(yè)學(xué)生盡管之前學(xué)過一些編程語言(C、Java),但并沒有系統(tǒng)地學(xué)習(xí)Unity引擎所使用的C#語言,如果要學(xué)習(xí)Unity 引擎,就要快速上手C#語法。3.編程課程大都開在大一下學(xué)期和大二上學(xué)期,而數(shù)字媒體技術(shù)專業(yè)課程內(nèi)容繁雜,還有很多藝術(shù)方面的課程要學(xué),到了大三,學(xué)生之前培養(yǎng)起來的編程能力已逐漸退化,需要復(fù)習(xí)鞏固。
游戲引擎應(yīng)用開發(fā)課程對學(xué)生的編程能力有一定要求。Unity 引擎為開發(fā)者提供了三維渲染、物理碰撞、移動旋轉(zhuǎn)等游戲開發(fā)的核心功能,因此其不需要使用者掌握復(fù)雜的圖形學(xué)、數(shù)學(xué)、物理學(xué)知識,但游戲?qū)ο蟮男袨檫壿嬓枰肅#語言來編寫,這就需要使用者掌握基本的C#語法,包括控制流語句、變量、函數(shù)、類,等等。同時,游戲開發(fā)中充滿了游戲?qū)ο箝g的交互,在設(shè)計腳本的時候,需要使用面向?qū)ο蟪绦蛟O(shè)計思維,熟練運(yùn)用繼承、多態(tài)等特性去設(shè)計游戲腳本,否則游戲程序?qū)靵y不堪,難以維護(hù)和修改??傊?,越是熟悉C#語言和面向?qū)ο蟪绦蛟O(shè)計思維,在游戲開發(fā)中就會越得心應(yīng)手。
同時,課程后期還涉及不少需要一定編程能力和計算機(jī)知識才能做出的實踐內(nèi)容。在以往的課程教學(xué)中筆者發(fā)現(xiàn),在涉及單例模式、對象池、游戲的AI狀態(tài)機(jī)等內(nèi)容時,學(xué)生的學(xué)習(xí)和實踐存在一定的障礙,但大一、大二編程基礎(chǔ)課中動手能力較強(qiáng)、編程基礎(chǔ)較好的學(xué)生在上述內(nèi)容的學(xué)習(xí)中往往掌握得比較快。
可見,做好游戲引擎應(yīng)用開發(fā)的課程銜接是十分有必要的。我們需要一個學(xué)時短且高效的課程幫助學(xué)生快速掌握C#語法,還要通過實實在在的游戲案例重建學(xué)生對編程的信心,為學(xué)生建立“游戲編程其實并不難”的認(rèn)知。另外,Unity 游戲引擎是一個封裝好的復(fù)雜的系統(tǒng),在學(xué)習(xí)引擎時僅僅了解引擎表層工具的使用是遠(yuǎn)遠(yuǎn)不夠的,只有了解游戲引擎的內(nèi)部運(yùn)作才能去解決一些深層次的問題。作為游戲引擎應(yīng)用開發(fā)的前置課程,該課程會帶領(lǐng)學(xué)生在沒有游戲引擎的情況下只用Console控制臺去完成一個小游戲,讓學(xué)生從底層的游戲循環(huán)開始了解計算機(jī)游戲的架構(gòu),為學(xué)生以后學(xué)習(xí)游戲引擎的底層原理奠定基礎(chǔ)。
開設(shè)銜接課程是為了讓學(xué)生有更好的編程語言基礎(chǔ)和編程思維,以應(yīng)對接下來游戲引擎應(yīng)用開發(fā)課程中的編程部分。
游戲引擎應(yīng)用開發(fā)銜接課并不需要像傳統(tǒng)的C#編程課程一樣將C#的語法知識點詳細(xì)地學(xué)習(xí)一遍,學(xué)生只需掌握Unity 引擎游戲開發(fā)的必備基礎(chǔ)編程知識就足夠了。更深入的知識可以在游戲引擎的使用中邊做邊學(xué)。我們整理出了游戲引擎應(yīng)用開發(fā)課程所必備的前置編程知識點:表達(dá)式、運(yùn)算符、控制流語句、函數(shù)、類的封裝、繼承、多態(tài)、接口和泛型容器。
這些知識對數(shù)字媒體技術(shù)專業(yè)的大三學(xué)生來說并不陌生,然而在實踐中學(xué)生往往不能充分地應(yīng)用他們已經(jīng)學(xué)過的知識。最常見的情況是,他們可能知道單個語句的語法語義,但是不知道如何將他們組合成有效的程序。例如,學(xué)生們都知道for 循環(huán)的語法,也知道如何接收輸入的字符、設(shè)置控制臺游標(biāo)的位置,但讓他們實現(xiàn)一個控制臺小游戲中方向鍵控制角色(用字符代替)移動就沒有思路了。出現(xiàn)這種問題的原因主要是大多數(shù)編程書籍上的內(nèi)容往往都圍繞著特定語言的知識,編程語言的教學(xué)也以講授語法為主,學(xué)生學(xué)習(xí)時不能聯(lián)系具體的應(yīng)用場景,因而學(xué)生在學(xué)習(xí)編程語言語法時只知道知識點而掌握不了解決問題的方法策略。同時,參考書上的編程案例只針對某一具體的語法,缺乏知識點的前后貫穿,為避免這些問題,在銜接課中我們采用案例式教學(xué)。我們通過兩個游戲案例,將Unity 游戲開發(fā)中所需要的知識點全部串聯(lián)起來。這樣,學(xué)生的學(xué)習(xí)會有一個明確的目標(biāo):完整地做出游戲;在學(xué)習(xí)特定語法時能夠明確當(dāng)前所學(xué)知識點是為了解決什么問題、完成哪個功能模塊。
我們將游戲引擎應(yīng)用開發(fā)銜接課設(shè)置為24 個學(xué)時,課程采用線上視頻教學(xué)的形式,不同編程基礎(chǔ)的學(xué)生可以有選擇地學(xué)習(xí),幫助即將學(xué)習(xí)游戲引擎應(yīng)用開發(fā)課程的大三學(xué)生鞏固編程知識,做到承上啟下。
課程主要使用案例式教學(xué)。我們將游戲開發(fā)中涉及的有關(guān)知識點梳理出來,根據(jù)這些知識點設(shè)計適合展現(xiàn)這些知識點的游戲案例,引導(dǎo)學(xué)生一步步完成游戲項目。每一個步驟都有相關(guān)的C#語法知識點,當(dāng)游戲項目完成時,一個個零散的知識點就被串聯(lián)起來了,從而讓學(xué)生掌握C#面向?qū)ο缶幊痰恼Z法和編程思路,為接下來游戲引擎應(yīng)用開發(fā)課程做準(zhǔn)備。
作為案例的游戲項目叫《勇者救公主》,這是一個簡化版《魔塔》類的游戲。該游戲是一個控制臺應(yīng)用程序,所有的游戲?qū)ο蠼詾樽址?。玩家通過ASDW 四個按鍵控制勇者在迷宮的移動并與魔王戰(zhàn)斗,打敗魔王救出公主。游戲流程和游戲界面如圖1、圖2所示。
為了保證知識點難度的循序漸進(jìn),我們使用兩種思路來分別實現(xiàn)游戲——面向過程的思路和面向?qū)ο蟮乃悸?。面向過程的實現(xiàn)方式涉及的語法知識點較為簡單,對象為編程基礎(chǔ)較差,甚至是沒有編程基礎(chǔ)的學(xué)生。該案例使用面向過程的程序設(shè)計思路,按照游戲的運(yùn)行過程,僅使用控制流語句和函數(shù)這些面向過程編程的語法來實現(xiàn)游戲項目。這個案例會讓學(xué)生著重理解表達(dá)式、運(yùn)算符、控制流語句、函數(shù)還有游戲框架的幀循環(huán)。而面向?qū)ο髮崿F(xiàn)思路的案例會用面向?qū)ο蟮乃季S將這個游戲重新實現(xiàn)一遍。在這個案例中我們不再講程序的運(yùn)行邏輯,而是著重講解用類的概念,從游戲?qū)ο蟮膶傩院凸δ艹霭l(fā)設(shè)計程序。面向?qū)ο蟀咐齻?cè)重于類的概念、面向?qū)ο缶幊痰乃季S方式、類的繼承和多態(tài)等面向?qū)ο蟮暮诵闹R。
在視頻課程中,我們會將整個游戲的實現(xiàn)過程拆解為多個小問題,或者說是功能模塊,按實現(xiàn)步驟讓學(xué)生把問題解決,從而完成功能模塊。我們盡量做到每個功能模塊對應(yīng)一到兩個C#知識點,讓學(xué)生循序漸進(jìn)地接受知識。以面向過程的程序案例為例,游戲功能與拆分出來的小知識點對應(yīng)關(guān)系如表1所示。
教學(xué)過程以問題為主導(dǎo)。參考文獻(xiàn)[10]中提出的教學(xué)方式——“學(xué)生們不僅僅是聽講座,他們還制定問題,設(shè)計自己的方法來回答問題并找到解決方案”,被后續(xù)很多教學(xué)研究證明是一種更為有效的計算機(jī)編程教學(xué)方式。我們的教學(xué)過程基于這樣的方式:首先展示這個章節(jié)要實現(xiàn)的游戲功能,并提出學(xué)生實現(xiàn)該功能應(yīng)解決的問題,這樣學(xué)生就能明確當(dāng)前的學(xué)習(xí)目標(biāo)。接著,講解這個功能所涉及的C#語法,當(dāng)學(xué)生了解這些語法規(guī)則之后,鼓勵學(xué)生運(yùn)用這些知識制訂方案以解決前面所提出的問題。如果學(xué)生無法獨(dú)立完成,我們就提供功能模塊實現(xiàn)的講解視頻供學(xué)生參考。這樣學(xué)生就能夠第一時間將知識點運(yùn)用在游戲項目上,有利于他們更好地掌握和吸收已學(xué)的知識。然后,再布置一個關(guān)于這個知識點的拓展練習(xí),讓學(xué)生獨(dú)立完成,以檢查學(xué)生對知識點的掌握情況。
以面向?qū)ο髮崿F(xiàn)思路案例中的戰(zhàn)斗對象這個章節(jié)為例,這個章節(jié)需要實現(xiàn)的功能是玩家和不同種類敵人之間的戰(zhàn)斗,需要學(xué)生在已經(jīng)掌握的知識的基礎(chǔ)上學(xué)習(xí)多態(tài)中的函數(shù)重載。首先,我們會對學(xué)生明確這個章節(jié)的目標(biāo)——實現(xiàn)一個戰(zhàn)斗管理類,這個類負(fù)責(zé)處理回合制戰(zhàn)斗的邏輯,并且還要能處理玩家與不同敵人之間的戰(zhàn)斗。不同的敵人有著不同的攻擊方式,被打敗之后也會有不同的處理方式。為了實現(xiàn)這個功能,我們會使用多態(tài)的知識點。其次,開始講解多態(tài)讓繼承同一父類的子類們在執(zhí)行相同方法時有不同的表現(xiàn)這一概念,再講解如何用虛函數(shù)、函數(shù)重寫、抽象類等多態(tài)語法來實現(xiàn)多態(tài)。最后,課程將帶著學(xué)生將多態(tài)應(yīng)用到實際的游戲案例中,讓同一個父類中的攻擊函數(shù)表現(xiàn)出不同的運(yùn)算邏輯,實現(xiàn)魔王和小怪對玩家不同方式的攻擊。當(dāng)學(xué)生掌握這部分內(nèi)容后,給學(xué)生布置一個作為拓展的思考題:擊敗一個小怪之后會隨機(jī)出現(xiàn)三種掉落物,分別能強(qiáng)化玩家的不同屬性,要求學(xué)生用多態(tài)的思想來實現(xiàn)這個功能。
文章針對目前游戲引擎應(yīng)用開發(fā)課程學(xué)生編程基礎(chǔ)薄弱這一現(xiàn)狀進(jìn)行了分析,以銜接課程為切入點,用游戲案例的形式將使用Unity引擎所需要用到的C#知識點串聯(lián)起來,以彌補(bǔ)學(xué)生的不足,同時讓學(xué)生了解游戲程序的架構(gòu),為接下來的游戲引擎應(yīng)用開發(fā)打下基礎(chǔ)。在今后的教學(xué)實踐中,筆者還需進(jìn)一步了解學(xué)生對該課程的反饋,積極改進(jìn)教學(xué)內(nèi)容,以提升學(xué)生的學(xué)習(xí)興趣。