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