楊淮敏,邱樹(shù)偉
(韓山師范學(xué)院計(jì)算機(jī)與信息工程學(xué)院,潮州 521041)
游戲是一種以?shī)蕵?lè)態(tài)度解決問(wèn)題的活動(dòng),被稱為第九藝術(shù),好的游戲可以發(fā)人深省或讓玩家放松心情、提升智力。目前,國(guó)產(chǎn)優(yōu)秀的單機(jī)游戲屈指可數(shù),究其原因,除了市場(chǎng)因素之外,游戲開(kāi)發(fā)技術(shù)的復(fù)雜性也影響了國(guó)產(chǎn)單機(jī)游戲的開(kāi)發(fā)。
文獻(xiàn)[1]的研究指出,當(dāng)下越來(lái)越多的游戲已經(jīng)無(wú)法滿足廣大游戲愛(ài)好者的需求,玩家更傾向于玩法新穎、內(nèi)存占用小、加載速度快的高品質(zhì)游戲。游戲開(kāi)發(fā)者必須快速高效地開(kāi)發(fā)出成熟穩(wěn)定的產(chǎn)品來(lái)滿足玩家的需求。為了實(shí)現(xiàn)這一目的,Unity3D 引擎是首選的開(kāi)發(fā)工具。文獻(xiàn)[2]闡明Unity3D 是當(dāng)前炙手可熱的游戲引擎,由其設(shè)計(jì)的游戲能夠在PC 端和手機(jī)端等多種平臺(tái)間相互移植,并且有很全面的幫助文檔和良好的用戶交互界面,可滿足開(kāi)發(fā)者的需求。良好的可移植性與交互性使Unity3D 適合開(kāi)發(fā)各類游戲。文獻(xiàn)[3]通過(guò)結(jié)合Unity3D 游戲引擎組件與腳本、怪物智能導(dǎo)航及AssetBundle 加載技術(shù)等設(shè)計(jì)了一款角色扮演游戲。該游戲提供了打怪、升級(jí)、抽獎(jiǎng)、商城等多種玩法和相關(guān)功能。文獻(xiàn)[4]設(shè)計(jì)了一款冒險(xiǎn)闖關(guān)游戲,通過(guò)集合不同的游戲類型使關(guān)卡難度層層遞進(jìn)。文獻(xiàn)[5]通過(guò)結(jié)合碰撞體與剛體設(shè)計(jì)了對(duì)游戲人物進(jìn)行基本操控的方法。文獻(xiàn)[6]設(shè)計(jì)了一個(gè)腳本語(yǔ)言與解釋器,實(shí)現(xiàn)了一系列的AI 及關(guān)卡邏輯功能。文獻(xiàn)[7]介紹了鍵盤(pán)交互技術(shù)與碰撞檢測(cè)技術(shù),給出了游戲開(kāi)發(fā)項(xiàng)目流程。
從以上成果可以看出,目前,在基于Unity3D的游戲設(shè)計(jì)與開(kāi)發(fā)方面已取得一些成果。然而,上述成果還可以進(jìn)一步完善,具體如下:①在系統(tǒng)設(shè)計(jì)方面,可以設(shè)計(jì)多個(gè)低耦合的子系統(tǒng),使得游戲的功能更為完善與全面;②在系統(tǒng)實(shí)現(xiàn)方面,可以進(jìn)一步完善戰(zhàn)斗系統(tǒng)、增加關(guān)卡系統(tǒng)以及裝備系統(tǒng)等,以改善游戲體驗(yàn)。
本文旨在基于Unity3D 引擎技術(shù),配合DOTween 插件和C#腳本語(yǔ)言,開(kāi)發(fā)一套單機(jī)冒險(xiǎn)游戲,實(shí)現(xiàn)游戲通用的基礎(chǔ)功能模塊,通過(guò)這些功能模塊展示一個(gè)游戲軟件的基本框架,主要功能模塊包括:游戲存檔、限制玩家游戲時(shí)間、選擇關(guān)卡、戰(zhàn)斗、商店、英雄信息展示等。通過(guò)該游戲的設(shè)計(jì)與實(shí)現(xiàn),與廣大游戲開(kāi)發(fā)者分享相關(guān)技術(shù)和方法,幫助開(kāi)發(fā)者減少開(kāi)發(fā)成本,簡(jiǎn)化開(kāi)發(fā)流程,使開(kāi)發(fā)者能夠?qū)W⒂谠O(shè)計(jì)自己獨(dú)有的游戲規(guī)則,實(shí)現(xiàn)具有特色的游戲功能。
Unity 引擎具有極高的靈活性,開(kāi)發(fā)者可以為多個(gè)平臺(tái)開(kāi)發(fā)游戲,如IoS、安卓、Windows等。Unity 引擎還提供了諸多服務(wù),如內(nèi)容發(fā)布平臺(tái),Unity Asset Store(UAS)等,其中,UAS的插件、素材、開(kāi)發(fā)者社區(qū)、用戶手冊(cè)等都可以很好地幫助開(kāi)發(fā)者開(kāi)發(fā)游戲。此外,運(yùn)行Unity腳本會(huì)按預(yù)定順序執(zhí)行事件函數(shù),在腳本的生命周期內(nèi)事件函數(shù)的執(zhí)行順序會(huì)對(duì)游戲效果產(chǎn)生影響。
DOTween 插件是一個(gè)類型安全的免費(fèi)開(kāi)源面向?qū)ο髣?dòng)畫(huà)引擎,還有大量高級(jí)特性,將它導(dǎo)入U(xiǎn)nity 中可以快速地完成許多動(dòng)畫(huà)效果。這款插件可以使開(kāi)發(fā)人員快速地進(jìn)行各類動(dòng)畫(huà)的設(shè)計(jì)和創(chuàng)作,能夠有效提升游戲開(kāi)發(fā)的效率。DOTween 插件允許通過(guò)代碼以簡(jiǎn)單的方式制作流暢美觀的動(dòng)畫(huà)。使用DOTween 插件實(shí)現(xiàn)的動(dòng)畫(huà)效果與補(bǔ)間動(dòng)畫(huà)相似,它不僅可以用于UI上,還可以用于物體的移動(dòng)等。
Unity腳本主要使用C#語(yǔ)言。C#是一個(gè)簡(jiǎn)單的、通用的、面向?qū)ο蟮木幊陶Z(yǔ)言,能夠產(chǎn)生高效率的程序,可以在多種計(jì)算機(jī)平臺(tái)上編譯。C#的跨平臺(tái)特性可以解決Unity引擎的跨平臺(tái)支持問(wèn)題。實(shí)際上,跨平臺(tái)的是C#編譯后所生成的中間語(yǔ)言(CIL)。
由于本游戲是一款單機(jī)冒險(xiǎn)游戲,因此,其功能模塊的實(shí)現(xiàn)比較重要,游戲功能結(jié)構(gòu)如圖1所示。具體功能需求如下:
圖1 游戲功能結(jié)構(gòu)
(1)游戲存檔:包含開(kāi)始新游戲、繼續(xù)游戲和退出游戲。玩家無(wú)需注冊(cè)就可以進(jìn)行游戲,開(kāi)始新游戲時(shí)此前的游戲數(shù)據(jù)會(huì)消失,需要謹(jǐn)慎對(duì)待,因此會(huì)有再次確認(rèn)的提示。
(2)限制游戲時(shí)間:限制游戲時(shí)間為1 小時(shí)/天,當(dāng)剩余游戲時(shí)間為10分鐘時(shí),計(jì)時(shí)器顏色會(huì)變?yōu)榧t色以便提醒玩家,超出時(shí)間會(huì)彈出警告面板并且無(wú)法進(jìn)行游戲。
(3)選擇關(guān)卡:包含解鎖關(guān)卡、更新通關(guān)星星數(shù)、解鎖章節(jié)。在一個(gè)章節(jié)中,關(guān)卡一默認(rèn)解鎖,玩家通過(guò)關(guān)卡一后會(huì)自動(dòng)解鎖關(guān)卡二,同時(shí)記錄關(guān)卡一獲得的星星數(shù)。如果關(guān)卡一未通關(guān)則不解鎖關(guān)卡二,當(dāng)所有關(guān)卡滿星通關(guān)后會(huì)解鎖下一章節(jié)的關(guān)卡。
(4)商店功能:可以購(gòu)買武器、英雄,購(gòu)買成功與否均有反饋。玩家購(gòu)買武器時(shí)成功與否都會(huì)有提示。購(gòu)買英雄成功則會(huì)有動(dòng)畫(huà)播放,動(dòng)畫(huà)播放完后刷新商店,不允許再次購(gòu)買該英雄。
(5)英雄展示:展示已購(gòu)買的英雄信息,可以升級(jí)英雄并裝備武器,同時(shí),可以選擇是否讓英雄加入戰(zhàn)斗隊(duì)列。玩家可以通過(guò)左右兩個(gè)按鈕切換想要查看信息的英雄,可以選擇英雄出戰(zhàn)或休戰(zhàn)。升級(jí)英雄需要金幣和經(jīng)驗(yàn),點(diǎn)擊裝備槽可以展示裝備信息或者進(jìn)行裝備,技能也可以升級(jí)。
(6)戰(zhàn)斗功能:設(shè)計(jì)英雄和敵人基類,實(shí)現(xiàn)敵人AI,可以切換英雄進(jìn)行戰(zhàn)斗,同時(shí)設(shè)計(jì)遠(yuǎn)程攻擊與普通攻擊的實(shí)現(xiàn)類,通關(guān)成功與否均有反饋。
在玩家開(kāi)始游戲時(shí)會(huì)首先進(jìn)入登錄界面,玩家可以選擇繼續(xù)游戲(讀取之前保存的游戲數(shù)據(jù))或開(kāi)始新游戲,進(jìn)入游戲后會(huì)開(kāi)始計(jì)時(shí),如果累計(jì)游戲時(shí)長(zhǎng)到達(dá)一小時(shí),會(huì)出現(xiàn)提示界面并無(wú)法繼續(xù)游戲,否則每過(guò)一分鐘都會(huì)更新一次游戲時(shí)長(zhǎng)的數(shù)據(jù)并進(jìn)行游戲時(shí)長(zhǎng)的判斷。開(kāi)始游戲流程如圖2所示。
圖2 開(kāi)始游戲流程
在進(jìn)入戰(zhàn)斗場(chǎng)景后,系統(tǒng)會(huì)檢測(cè)玩家是否按下了切換鍵,按下切換鍵就會(huì)使用隊(duì)列的下一個(gè)英雄進(jìn)行戰(zhàn)斗,當(dāng)前英雄死亡也會(huì)切換為下一個(gè)英雄繼續(xù)戰(zhàn)斗,如果英雄隊(duì)列中的英雄全部死亡則游戲失??;同時(shí)每次英雄受傷與攻擊都會(huì)播放相應(yīng)動(dòng)畫(huà),每次英雄受傷時(shí)會(huì)判斷該英雄是否死亡;敵人如果受傷會(huì)播放受傷動(dòng)畫(huà)并判斷是否死亡,如果死亡就播放敵人死亡動(dòng)畫(huà)并判斷是否戰(zhàn)斗場(chǎng)景中的敵人全部死亡,如果全部死亡則游戲勝利;敵人會(huì)在游戲場(chǎng)景進(jìn)行巡邏,如果英雄走到敵人的攻擊范圍,敵人會(huì)進(jìn)行攻擊與追擊。戰(zhàn)斗流程如圖3所示。
圖3 戰(zhàn)斗流程
本系統(tǒng)實(shí)現(xiàn)了游戲的關(guān)卡子系統(tǒng)、商店子系統(tǒng)、背包子系統(tǒng)、英雄信息展示子系統(tǒng)、戰(zhàn)斗子系統(tǒng)以及存儲(chǔ)子系統(tǒng)等,各子系統(tǒng)所采用的素材引用自文獻(xiàn)[8]。
本子系統(tǒng)實(shí)現(xiàn)的功能包括:跳轉(zhuǎn)場(chǎng)景、章節(jié)選擇、關(guān)卡選擇等。系統(tǒng)實(shí)現(xiàn)的主要功能如下:①跳轉(zhuǎn)場(chǎng)景:通過(guò)使用場(chǎng)景類SceneManagement 的LoadScene()方法獲取場(chǎng)景名進(jìn)行跳轉(zhuǎn)。②章節(jié)選擇:運(yùn)行時(shí)通過(guò)本地持久化類PlayerPrefs 獲取數(shù)據(jù)判斷章節(jié)是否解鎖,若解鎖則按鈕允許交互,實(shí)現(xiàn)界面如圖4所示。③關(guān)卡選擇:每次加載關(guān)卡選擇界面時(shí)通過(guò)獲取數(shù)據(jù)更新顯示當(dāng)前關(guān)卡星星總數(shù),上一關(guān)卡解鎖則下一關(guān)卡可以進(jìn)行挑戰(zhàn),其他關(guān)卡仍無(wú)法挑戰(zhàn)。讀取出戰(zhàn)英雄隊(duì)列,若為空則遮擋住關(guān)卡選擇界面使玩家無(wú)法進(jìn)行挑戰(zhàn),當(dāng)關(guān)卡星星數(shù)等于總數(shù)時(shí)解鎖下一章,實(shí)現(xiàn)界面如圖5所示。
圖4 章節(jié)選擇界面
圖5 關(guān)卡選擇界面
本子系統(tǒng)實(shí)現(xiàn)的功能包括:商店面板切換、英雄購(gòu)買、購(gòu)買成功動(dòng)畫(huà)、武器購(gòu)買等。系統(tǒng)實(shí)現(xiàn)的主要功能如下:①商店面板切換:通過(guò)使用Transform.SetSiblingIndex()方法改變面板在Hierarchy層次上的順序,從而實(shí)現(xiàn)面板的切換。②英雄購(gòu)買:通過(guò)CanvasGroup 組件控制透明度,實(shí)現(xiàn)點(diǎn)擊購(gòu)買按鈕時(shí)打開(kāi)確認(rèn)購(gòu)買界面,通過(guò)讀取ScriptObject 保存的數(shù)據(jù)展示已設(shè)置好的英雄信息與人物圖,實(shí)現(xiàn)界面如圖6 所示。③購(gòu)買成功動(dòng)畫(huà):通過(guò)使用DOTween 插件里的聯(lián)合動(dòng)畫(huà)Sequence 的Append()方法實(shí)現(xiàn)UI動(dòng)畫(huà)的設(shè)置,實(shí)現(xiàn)界面如圖7所示。
圖6 英雄購(gòu)買界面
圖7 購(gòu)買成功界面
本子系統(tǒng)實(shí)現(xiàn)的功能包括:物品槽生成、物品槽更新和物品信息展示等功能,實(shí)現(xiàn)界面如圖8 所示。系統(tǒng)實(shí)現(xiàn)的主要功能如下:①物品槽生成:手動(dòng)創(chuàng)建一個(gè)Prefab 預(yù)制體后,通過(guò)創(chuàng)建列表List 存儲(chǔ)實(shí)例化的預(yù)制體,從而實(shí)現(xiàn)多個(gè)物品槽的制作。②物品槽更新:打開(kāi)背包界面時(shí)會(huì)對(duì)物品槽的信息進(jìn)行更新,通過(guò)ScriptObject 獲取玩家存儲(chǔ)的物品數(shù)據(jù),在物品槽中展示物品圖片與數(shù)量。③物品信息展示:點(diǎn)擊物品槽時(shí)顯示物品信息及出售按鈕,出售數(shù)量為1 時(shí)不許減少出售數(shù)量,未擁有物品數(shù)時(shí)不許增加。
圖8 背包系統(tǒng)界面
本子系統(tǒng)實(shí)現(xiàn)的功能包括:選擇更換出戰(zhàn)英雄、展示出戰(zhàn)英雄、升級(jí)英雄與武器、給英雄裝備武器等。系統(tǒng)實(shí)現(xiàn)的主要功能如下:①選擇更換出戰(zhàn)英雄:通過(guò)True 和False 設(shè)置英雄的出戰(zhàn)狀態(tài),出戰(zhàn)隊(duì)列已滿時(shí)無(wú)法增加出戰(zhàn)英雄,通過(guò)英雄圖像下方的按鈕實(shí)現(xiàn)選擇英雄或者替換英雄后,出戰(zhàn)隊(duì)列的英雄頭像會(huì)進(jìn)行更新,如圖9 所示。②升級(jí)英雄與武器:通過(guò)簡(jiǎn)單的條件判斷實(shí)現(xiàn)英雄與裝備的升級(jí),升級(jí)將會(huì)帶來(lái)屬性數(shù)值的提升。③給英雄裝備武器:給英雄裝備武器時(shí)需要從玩家背包查找多余的武器,裝備成功則背包武器少一件,同時(shí)武器屬性與角色職業(yè)掛鉤,如劍士不可裝備魔法書(shū),實(shí)現(xiàn)界面如圖10所示。
圖9 英雄出戰(zhàn)界面
圖10 英雄裝備界面
本子系統(tǒng)實(shí)現(xiàn)的功能包括:敵人AI、玩家角色控制、切換戰(zhàn)斗角色、普通攻擊與遠(yuǎn)程攻擊、游戲勝利與失敗等。系統(tǒng)實(shí)現(xiàn)的主要功能如下:①敵人AI:在進(jìn)入戰(zhàn)斗場(chǎng)景時(shí)初始化敵人的血條同時(shí)更新敵人信息,如果玩家切換了戰(zhàn)斗英雄,攻擊目標(biāo)也會(huì)轉(zhuǎn)換為玩家當(dāng)前使用的英雄。當(dāng)英雄進(jìn)入攻擊范圍時(shí)會(huì)進(jìn)行攻擊并進(jìn)行追擊,否則敵人會(huì)在兩點(diǎn)間進(jìn)行巡邏。當(dāng)敵人受傷時(shí)生命值減少,播放受傷動(dòng)畫(huà),死亡時(shí)播放死亡動(dòng)畫(huà)并銷毀自身,如圖11 所示。②玩家角色控制:設(shè)置英雄可以進(jìn)行二段跳、移動(dòng)、下蹲、攻擊、起立等行為,同時(shí)使用射線檢測(cè)英雄的左右腳是否在地面上以判斷是否可以進(jìn)行二段跳。③切換戰(zhàn)斗角色:按下F 鍵時(shí)可以切換英雄進(jìn)行戰(zhàn)斗,此時(shí)會(huì)更新當(dāng)前英雄信息,同時(shí)攝像機(jī)會(huì)跟隨當(dāng)前英雄,血條信息和出戰(zhàn)英雄面板信息也會(huì)得到更新。④普通攻擊與遠(yuǎn)程攻擊:根據(jù)英雄的職業(yè)分別設(shè)置普通攻擊和遠(yuǎn)程攻擊。普通攻擊的原理是勾選碰撞體的isTrriger屬性,在碰撞敵人的時(shí)候觸發(fā)傷害。遠(yuǎn)程攻擊創(chuàng)建了已設(shè)置好的預(yù)制體進(jìn)行水平運(yùn)動(dòng)攻擊敵人,運(yùn)動(dòng)到一定距離即自我銷毀。⑤游戲勝利與失?。寒?dāng)玩家的所有英雄都被擊敗時(shí)會(huì)暫停游戲,顯示游戲失敗面板;玩家擊敗場(chǎng)景中的所有敵人時(shí)會(huì)暫停游戲,顯示游戲勝利面板,同時(shí)根據(jù)死亡英雄的數(shù)量來(lái)判斷以幾顆星通過(guò)本關(guān)卡,在勝利面板會(huì)顯示英雄信息,顯示通關(guān)獲得的經(jīng)驗(yàn)和金幣,如圖12所示。
圖11 戰(zhàn)斗界面
圖12 戰(zhàn)斗勝利界面
存儲(chǔ)子系統(tǒng)的實(shí)現(xiàn)主要采用PlayerPrefs。PlayerPrefs是一個(gè)用于數(shù)據(jù)本地持久化保存與讀取的類,它將數(shù)據(jù)以鍵值對(duì)的形式保存在本地,使用它能夠輕松實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ),在本系統(tǒng)中使用PlayerPrefs存儲(chǔ)了關(guān)卡星星數(shù)等。
由于ScrtptObject 的特性是在編輯模式或運(yùn)行模式下修改的數(shù)據(jù)在游戲退出后不會(huì)保存,故開(kāi)始新游戲只需要?jiǎng)h除已保存的PlayerPrefs鍵值對(duì)。繼續(xù)游戲相對(duì)復(fù)雜,在保存游戲數(shù)據(jù)時(shí)需要使用Json 將ScriptObject 序列化轉(zhuǎn)換為String 類型,再將String 類型保存在PlayerPrefs鍵值對(duì)中,讀取數(shù)據(jù)則需要讀取鍵值對(duì)的String,最后將其反序列化為ScriptObject。
本文基于Unity 游戲引擎設(shè)計(jì)和實(shí)現(xiàn)了一款單機(jī)冒險(xiǎn)游戲,該游戲無(wú)需設(shè)計(jì)復(fù)雜的算法,采用C#腳本語(yǔ)言實(shí)現(xiàn),代碼只需要邏輯清晰即可實(shí)現(xiàn)。本游戲開(kāi)發(fā)過(guò)程中注重提高代碼的復(fù)用性以及降低模塊間的耦合性,節(jié)省了開(kāi)發(fā)成本。本文具體做了以下工作:
(1)在游戲?qū)崿F(xiàn)方面,主要實(shí)現(xiàn)了關(guān)卡子系統(tǒng)、商店子系統(tǒng)、背包子系統(tǒng)、英雄信息展示子系統(tǒng)、戰(zhàn)斗子系統(tǒng)、存儲(chǔ)子系統(tǒng)等,完成了游戲的基礎(chǔ)功能模塊。
(2)在素材制作方面,通過(guò)綁定骨骼,制作了多個(gè)英雄的多個(gè)骨骼動(dòng)畫(huà),通過(guò)對(duì)英雄行為動(dòng)畫(huà)進(jìn)行精細(xì)的調(diào)整,實(shí)現(xiàn)了良好的動(dòng)畫(huà)效果,同時(shí)使用序列幀制作了敵人的各種行為動(dòng)畫(huà)。
(3)在界面設(shè)計(jì)方面,積極尋找優(yōu)秀的界面設(shè)計(jì)提升審美,最終實(shí)現(xiàn)了良好的界面設(shè)計(jì),同時(shí)還增加了部分UI動(dòng)畫(huà)。
本游戲的設(shè)計(jì)和實(shí)現(xiàn)對(duì)于基于Unity 游戲引擎的單機(jī)版游戲開(kāi)發(fā)具有積極的借鑒作用。