本科畢業(yè)論文_第1頁(yè)
本科畢業(yè)論文_第2頁(yè)
本科畢業(yè)論文_第3頁(yè)
本科畢業(yè)論文_第4頁(yè)
本科畢業(yè)論文_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

緒論1.1背景及意義在所有的游戲類型中,飛行射擊游戲可以說(shuō)是最古老,也是最深入人心的一種游戲。在飛行射擊游戲中,玩家往往操作著一架普通飛機(jī),在漫天密集的彈幕中驚險(xiǎn)地消滅敵人,充當(dāng)世界的救世主?;蛘咭杂钪孀鳛楸尘埃{駛高科技戰(zhàn)機(jī)在太空中探險(xiǎn)。世界上第一款街機(jī)游戲就是飛行射擊游戲《太空大戰(zhàn)》,它是由麻省理工學(xué)院學(xué)生史蒂夫拉塞爾在1961年設(shè)計(jì)出來(lái),是真正運(yùn)行在電腦上的第一款交互游戲。到70年代,F(xiàn)C(紅白機(jī))時(shí)代,《小蜜蜂》和《沙陀曼蛇》的出現(xiàn),前者畫面上得到顯著的提示,后者首次引入吃能量球,通過(guò)積攢來(lái)升級(jí)飛機(jī)屬性和槍械導(dǎo)彈。90年代初,《雷電》和《彩京》系列相繼出世,把“躲子彈,打飛機(jī)”推向一個(gè)極端的高潮。兩者憑借多樣戰(zhàn)機(jī)選擇,武器升級(jí)設(shè)定和高難度彈幕吸引了大多數(shù)游戲玩家,很快成為風(fēng)靡全球的街機(jī)游戲。再到后來(lái)的《東方project》系列,從彈幕、關(guān)卡設(shè)計(jì)、劇情、畫面、音樂(lè)等多方面革新,時(shí)至如今《東方project》的同人作品還在涌現(xiàn)。 飛行射擊游戲是集娛樂(lè)、即時(shí)操作、鍛煉反應(yīng)力的一類游戲,游戲面對(duì)的主要人群是青少年或者需要釋放壓力的職工。玩法豐富,面對(duì)飛向自己戰(zhàn)機(jī)的敵人和炮火,不禁會(huì)讓人感到緊張刺激,玩家通過(guò)操作躲避子彈并且擊敗敵機(jī)從而釋放壓力。游戲過(guò)程中,隨著玩家獲得更多經(jīng)驗(yàn),解鎖不同的戰(zhàn)機(jī)和子彈,增加游戲可玩性,隨著關(guān)卡難度的逐漸提升,可以激發(fā)玩家的好勝心,獲得更好的游戲體驗(yàn)。所以綜上所述,基于Unity3D引擎開(kāi)發(fā)一款豎版飛行射擊游戲具有重要意義。1.2課題研究現(xiàn)狀 隨著時(shí)代發(fā)展,游戲作為一種娛樂(lè)方式,進(jìn)入我們的生活,幫助我們釋放壓力,豐富我們的休閑時(shí)間。而如今5G網(wǎng)絡(luò)在普及,VR、AR技術(shù)在逐漸成熟,游戲行業(yè)作為這幾個(gè)方面都能獲益的一方,不久的將來(lái)一定會(huì)有一次重大的變革。 如今國(guó)內(nèi)比較流行的游戲引擎有Unity3D、虛幻(Unreal)、白鷺(Egret)、Cocos2D等。虛幻引擎注重于數(shù)據(jù)生成和編程方面,在做FPS和TPS時(shí)有完善、集成和統(tǒng)一的工具鏈。白鷺引擎是一個(gè)基于HTML5技術(shù)的游戲引擎,具有高效的渲染模塊,完善的配套工具。Cocos2D是一個(gè)免費(fèi)開(kāi)源的游戲引擎,注重于移動(dòng)端游戲開(kāi)發(fā)。相對(duì)于上面幾款開(kāi)發(fā)引擎而言,Unity3D引擎支持多種格式的導(dǎo)入,給開(kāi)發(fā)者省去不必要的麻煩。擁有3A級(jí)圖像渲染引擎,簡(jiǎn)單易用,靈活高效。支持NVIDIAPhysX物理引擎,支持Java,C#,Boo三種腳本語(yǔ)音等優(yōu)點(diǎn)。在對(duì)于入門者而言,Unity官方能提供個(gè)人免費(fèi)版支持學(xué)習(xí),還有在Unity社區(qū)里面有很多官方優(yōu)秀教程。而對(duì)于專業(yè)開(kāi)發(fā)人員,Unity商店可以提供各色各樣的插件,大大減少了開(kāi)發(fā)者的工作量。在游戲發(fā)布方面,Unity3D引擎支持多平臺(tái)發(fā)布。對(duì)于使用者,Unity3D能滿足大部分的需求以及提供足夠的便利性。也正是因?yàn)槿绱耍撘嬖诠δ苡螒蛞媸袌?chǎng)上占據(jù)了45%的市場(chǎng)份額,具有良好的發(fā)展前景。因此熟練掌握和理解和應(yīng)用Unity3D引擎具有一定意義。1.3論文組織結(jié)構(gòu) 論文從最初構(gòu)思到分析實(shí)踐,結(jié)合專業(yè)游戲開(kāi)發(fā)資料,進(jìn)行一個(gè)豎版飛行射擊游戲的設(shè)計(jì)制作。主要具體介紹游戲的制作步驟,包括游戲的系統(tǒng)功能設(shè)計(jì)和主要代碼的編寫。論文分為六章,各章節(jié)安排如下: 第一章節(jié):緒論,主要闡述了畢業(yè)設(shè)計(jì)制作的背景目的、課題研究現(xiàn)狀以及畢業(yè)設(shè)計(jì)的大概介紹; 第二章節(jié):大致介紹Unity3D和本文制作游戲所用到的開(kāi)發(fā)工具; 第三章節(jié):游戲需求分析和總體設(shè)計(jì)方案,規(guī)劃開(kāi)發(fā)方向; 第四章節(jié):游戲詳細(xì)設(shè)計(jì)和實(shí)現(xiàn),細(xì)化各個(gè)模塊并且實(shí)現(xiàn); 第五章節(jié):運(yùn)行游戲并測(cè)試,封裝打包; 第六章節(jié):總結(jié)和對(duì)游戲今后的改進(jìn)方向規(guī)劃;

第二章開(kāi)發(fā)工具和技術(shù)簡(jiǎn)介 這一章主要介紹游戲?qū)崿F(xiàn)過(guò)程中Unity3D引擎的部分功能,以及對(duì)其他使用到的工具做一個(gè)簡(jiǎn)單的介紹。2.1Unity3D游戲引擎2.1.1軟件介紹 Unity3D是由UnityTechnologies開(kāi)發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫等類型互動(dòng)內(nèi)容的綜合型游戲開(kāi)發(fā)工具,是一個(gè)全面整合的專業(yè)游戲引擎。支持Windows、Mac、Android、IOS、PS等共10余種平臺(tái),提供非常完美的跨平臺(tái)系統(tǒng),大大減少了開(kāi)發(fā)者在平臺(tái)移植上花費(fèi)的不必要時(shí)間。 Unity的可視化模式為開(kāi)發(fā)者提供直觀的圖形化程序接口,開(kāi)發(fā)者可以用玩游戲的形式開(kāi)發(fā)游戲。在眾多視圖窗口中最常見(jiàn)的有5個(gè),分別是Scene、Game、Hierarchy、Project、Inspector。Scene窗口:擺放模型文件,編輯游戲界面。Game窗口:根據(jù)攝像機(jī)的拍攝,對(duì)Scene場(chǎng)景的游戲運(yùn)行的播放。Hierarchy窗口:負(fù)責(zé)管理在游戲中使用的相關(guān)組件。Project窗口:工程文件窗口,存放放所有工程文件資源。Inspector窗口:顯示所有選中對(duì)象的組件信息,可以進(jìn)行編輯。 2.1.2物理引擎介紹 游戲設(shè)計(jì)都應(yīng)該具有其物體特性的合理性,游戲才能給人一種真實(shí)的感覺(jué)。Unity的NVIDIAPhysX的物理引擎系統(tǒng)為開(kāi)發(fā)人員提供了如剛體、碰撞器等游戲組件。在開(kāi)發(fā)的過(guò)程中,渲染,光線,顏色的對(duì)比度,材質(zhì)等一系列的組件給我們帶來(lái)的是視覺(jué)上的逼真效果。而在操作上想要獲得真實(shí)反饋效果則需要物理引擎系統(tǒng),運(yùn)用組件修改對(duì)象受到的重力,摩檫力,空氣阻力等具有物理特性因素外力從而獲得在碰撞等物理變化后如同現(xiàn)實(shí)世界發(fā)生的真實(shí)效果體驗(yàn)。 2.1.3GUI(圖形用戶界面)介紹 GUI是圖像用戶界面GraphicalUserInterface的縮寫,Unity的內(nèi)置GUI系統(tǒng)被稱作UGUI,本文主要使用UGUI來(lái)制作界面的開(kāi)發(fā)。UGUI中有大量的界面組件,開(kāi)發(fā)者只需要?jiǎng)?chuàng)建實(shí)例,就可以在Scene窗口對(duì)其進(jìn)行大小形狀的調(diào)整,在Inspector窗口對(duì)選中組件進(jìn)行進(jìn)一步的細(xì)化設(shè)置,如錨點(diǎn)定位、交互反饋等。 2.1.4Unity的保存讀取數(shù)據(jù)方式介紹 眾多游戲中,玩家們致力于最高的分?jǐn)?shù)、更強(qiáng)的裝備和角色進(jìn)階的屬性,允許玩家主動(dòng)保存和加載成為了很多游戲必不可少的功能之一。Unity中比較常見(jiàn)的保存讀取數(shù)據(jù)的方法有四種,分別是PlayerPerfs數(shù)據(jù)持久化方案、數(shù)據(jù)序列化與反序列化中的:二進(jìn)制方法,JSON方法和XML方法。PlayerPerfs方法,通過(guò)構(gòu)建一個(gè)鍵,對(duì)應(yīng)的鍵名存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù),需要讀取數(shù)據(jù)的時(shí)候只需要查找對(duì)應(yīng)的鍵名就可以,適用于保存少量數(shù)據(jù)。是一種特殊的CaChingSystem緩存系統(tǒng),可以在不同的場(chǎng)景之間,有效的保存一些簡(jiǎn)單的設(shè)置和變量。序列化就是把對(duì)象的狀態(tài)或者各個(gè)屬性轉(zhuǎn)換為另一種格式的自動(dòng)化過(guò)程。二進(jìn)制方法方便能存儲(chǔ)更多的數(shù)據(jù),但這方法存儲(chǔ)文件的可讀性幾乎為0,但卻能保護(hù)數(shù)據(jù)防止別人篡改。JSON方法傳輸速度快,占用空間小,可讀性比二進(jìn)制要好。但僅支持簡(jiǎn)單類型,不支持集合。XML方法,存儲(chǔ)文件重復(fù)信息多,占用空間大,解析XML文件需要花費(fèi)較多的資源和時(shí)間。本文需要存儲(chǔ)數(shù)據(jù)量較少,因此主要使用PlayerPerfs數(shù)據(jù)持久化方案來(lái)儲(chǔ)存游戲數(shù)據(jù)。 2.1.5Unity常用生命周期函數(shù)介紹 Unity3D游戲引擎不像常規(guī)程序從Main函數(shù)入口運(yùn)行,而是有一套自己的生命周期函數(shù)運(yùn)行方式順序,下面會(huì)從基本函數(shù)運(yùn)行順序介紹。 Awake():當(dāng)一個(gè)對(duì)象初始實(shí)例化時(shí)Awake函數(shù)被調(diào)用; Start():在Awake函數(shù)調(diào)用后執(zhí)行,Start函數(shù)只在腳本實(shí)例被啟用時(shí)才會(huì)執(zhí)行; Update():在對(duì)象運(yùn)行之后,Update函數(shù)每一幀都會(huì)被調(diào)用; FixedUpdate():固定幀執(zhí)行函數(shù),跟Update一樣,不過(guò)能通過(guò)設(shè)置FixedTime來(lái)決定調(diào)用次數(shù); OnEnable():對(duì)象激活的情況下才能調(diào)用; OnDisable():對(duì)象未啟用或未激活時(shí)調(diào)用; OnDestroy():銷毀對(duì)象時(shí)調(diào)用; 2.2AdobePhotoshopCC2017AdobePhotoshop,簡(jiǎn)稱“PS”,是由AdobeSystems開(kāi)發(fā)和運(yùn)行的圖像處理軟件。Photoshop主要處理以像素所構(gòu)成的數(shù)字圖像。它是一個(gè)集圖像掃描、編輯修改、圖像制作、廣告創(chuàng)意、圖像合成、圖像輸入/輸出、網(wǎng)頁(yè)制作于一體的專業(yè)圖形處理軟件。本文主要使用它完成戰(zhàn)機(jī)的受損圖片制作。2.3C#語(yǔ)言介紹C#語(yǔ)言是微軟公司推出的一種高級(jí)的、面向?qū)ο蟮恼Z(yǔ)言,它簡(jiǎn)化了C++語(yǔ)言在類、命名空間、方法重載和異常處理方面的操作,它摒棄了C++的復(fù)炸性,更容易使用,更少出錯(cuò)。C#與Java類似,是一種語(yǔ)言,一種工具。在Unity引擎中,C#語(yǔ)言通過(guò)Mono的重新實(shí)現(xiàn),讓Unity能夠使用C#來(lái)作為開(kāi)發(fā)語(yǔ)言。2.4VisualStudio2017VisualStudio2017開(kāi)發(fā)環(huán)境是微軟公司自主推出的。VisualStudio2017集成開(kāi)發(fā)環(huán)境是一種創(chuàng)新啟動(dòng)板,可用于編輯、調(diào)試并生成代碼,然后發(fā)布應(yīng)用。集成開(kāi)發(fā)環(huán)境(IDE)是一個(gè)功能豐富的程序,可用于軟件開(kāi)發(fā)的許多方面。除了大多數(shù)IDE提供的標(biāo)準(zhǔn)編輯器和調(diào)試器之外,VisualStudio2017還包括編譯器、代碼完成工具、圖形設(shè)計(jì)器和許多其他功能,以簡(jiǎn)化軟件開(kāi)發(fā)過(guò)程。

第三章游戲的需求分析及總體設(shè)計(jì)方案 編寫游戲需求分析和總體設(shè)計(jì)方案,規(guī)劃游戲開(kāi)發(fā)方向。3.1豎版飛行射擊游戲的需求分析3.1.1玩家需求分析 無(wú)論是哪一款游戲,不管它是以什么方式實(shí)現(xiàn),或者出現(xiàn)在某一個(gè)領(lǐng)域之中,它最直接的使用者永遠(yuǎn)都是游戲玩家。而玩家最想要得到的需求就是與游戲有交互性和交互的簡(jiǎn)易性,即是玩家在做出每一步操作之后都希望能到明顯的反饋信息和操作過(guò)程中的簡(jiǎn)便性。此外增加游戲的可玩性和挑戰(zhàn)性等,都能更一步滿足游戲玩家對(duì)玩下去游戲的欲望。3.1.2功能分析 本飛行射擊游戲擁有兩個(gè)核心,自己操作的戰(zhàn)機(jī)和需要擊敗的敵機(jī)。圍繞兩個(gè)核心去做功能分析,添加功能,完善核心。 首先就戰(zhàn)機(jī)核心來(lái)做分析。戰(zhàn)機(jī)作為玩家操縱的個(gè)體,需要有一個(gè)固定的飛行區(qū)域,玩家不能把戰(zhàn)機(jī)開(kāi)出這個(gè)區(qū)域。作為個(gè)體應(yīng)該擁有自己的屬性,如血量、飛行速度、攻擊力等等。單一不會(huì)變動(dòng)的屬性是不能吸引玩家的,所以需要添加一個(gè)戰(zhàn)機(jī)升級(jí)系統(tǒng),戰(zhàn)機(jī)通過(guò)擊敗敵機(jī)后獲得經(jīng)驗(yàn),然后使用經(jīng)驗(yàn)去升級(jí),升級(jí)之后戰(zhàn)機(jī)的屬性提升。戰(zhàn)機(jī)在不同等級(jí)的時(shí)候有不同的子彈槍械和戰(zhàn)機(jī)外貌。不同的槍械搭配各自對(duì)應(yīng)的子彈,形成新的彈幕。在屬性提升和擁有新彈幕之后便可以挑戰(zhàn)更難的關(guān)卡,亦或去刷新以前的挑戰(zhàn)記錄。 其次就敵機(jī)核心來(lái)做分析。敵機(jī)作為飛行射擊游戲的另外一個(gè)主角,在面對(duì)玩家時(shí)如果太容易被擊殺那便失去了游戲的挑戰(zhàn)性。所以敵機(jī)應(yīng)該如同主角戰(zhàn)機(jī)一樣擁有屬性,并且可以把敵機(jī)分類別,例如小敵機(jī)、中敵機(jī)、大敵機(jī)以及最后要戰(zhàn)勝的Boss領(lǐng)主。不同類型的敵機(jī)各自擁有自己的屬性,不同的槍械和彈幕。在屬性和彈幕等方面分析后,需要思考敵機(jī)的生成方式。敵機(jī)可以從屏幕的上方生成,向下方飛行。如果只是簡(jiǎn)單的飛行是滿足不了玩家需求的,因此需要一個(gè)敵機(jī)智能AI系統(tǒng),敵機(jī)與戰(zhàn)機(jī)兩者之間距離少于一定是,敵機(jī)會(huì)向戰(zhàn)機(jī)飛去。與普通的敵機(jī)不同,Boss應(yīng)該在一定范圍內(nèi)移動(dòng),直到被玩家消滅,所以Boss也應(yīng)該有自己的移動(dòng)路線,在該路線上循環(huán)移動(dòng)。最后,分析一下在游戲過(guò)程中需要的功能需求。在游戲過(guò)程中的菜單暫停功能,給玩家處理其他事情時(shí)帶來(lái)方便。道具功能,戰(zhàn)機(jī)在獲得道具后可以切換成超級(jí)武器,增加攻擊。局域限制功能,如果敵機(jī)未被玩家擊敗而是飛出了區(qū)域外,需要銷毀這個(gè)對(duì)象,減少Unity的資源消耗,同理戰(zhàn)機(jī)和敵機(jī)的子彈也需要。游戲結(jié)束的條件判定功能,如果戰(zhàn)機(jī)血量為0游戲失敗,敵機(jī)Boss血量為0游戲勝利。游戲數(shù)據(jù)存儲(chǔ)讀取功能,在每次游戲結(jié)束時(shí)保存獲得的經(jīng)驗(yàn),每次游戲開(kāi)始時(shí)讀取戰(zhàn)機(jī)的屬性。 綜上所訴,將本文探究研發(fā)的游戲功能大致劃分為如下幾個(gè)模塊。場(chǎng)景模塊:根據(jù)上訴玩家需求分析,在場(chǎng)景中,當(dāng)玩家通過(guò)鼠標(biāo)鍵盤輸入對(duì)應(yīng)指令時(shí),游戲場(chǎng)景內(nèi)的組件應(yīng)該做出對(duì)應(yīng)的反應(yīng),給出反饋;戰(zhàn)機(jī)模塊:戰(zhàn)機(jī)控制,飛行有區(qū)域限制,具備屬性,槍械子彈,戰(zhàn)機(jī)外貌;敵機(jī)模塊:敵機(jī)分類別,具備屬性、槍械子彈,有AI控制其行為;游戲功能模塊:暫停功能、道具功能、勝負(fù)條件判斷、區(qū)域限制、保存讀取功能;游戲大體功能劃分如下圖3-1所示。圖3-1游戲大體功能規(guī)劃圖3.2游戲的總體方案設(shè)計(jì)3.2.1游戲結(jié)構(gòu)方案設(shè)計(jì)基于考慮玩家接觸游戲不同類型的時(shí)間各有不同,為讓玩家能快速上手,本文游戲大體結(jié)構(gòu)不能太過(guò)復(fù)雜,結(jié)合參考大部分游戲,得出結(jié)構(gòu)如下圖3-2所示。圖3-2游戲大體結(jié)構(gòu)圖3.2.2總體結(jié)構(gòu)方案設(shè)計(jì) 結(jié)合上述結(jié)論,本游戲總體結(jié)構(gòu)模塊框架圖如下圖3-3所示。

圖3-3游戲總體結(jié)構(gòu)模塊圖 結(jié)合上述需求分析,按照游戲總體結(jié)構(gòu)模塊圖,以Unity3D游戲開(kāi)發(fā)引擎和C#腳本為基礎(chǔ),實(shí)現(xiàn)游戲的研發(fā)。

第四章游戲詳細(xì)設(shè)計(jì)及實(shí)現(xiàn) 按照需求分析和總體設(shè)計(jì)方案,對(duì)游戲進(jìn)行詳細(xì)設(shè)計(jì),細(xì)化完善各個(gè)模塊并且實(shí)現(xiàn)。4.1場(chǎng)景模塊 本游戲場(chǎng)景模塊主要使用Unity3D引擎自帶的GUI系統(tǒng)UGUI制作,結(jié)合C#腳本實(shí)現(xiàn)如場(chǎng)景跳轉(zhuǎn)等功能。為了統(tǒng)一游戲顏色基調(diào),在非游戲場(chǎng)景中,需要把MainCamera中的ClearFlags由Skybox改為SolidColor,把背景顏色調(diào)成黑色。然后在Hierarchy面標(biāo)中點(diǎn)擊Create-->UI-->Canvas創(chuàng)建一個(gè)畫布。 4.1.1開(kāi)始場(chǎng)景 在開(kāi)始場(chǎng)景中,在畫布組件上鼠標(biāo)右擊UI-->Text創(chuàng)建文本作為游戲名字標(biāo)題,把Text的錨點(diǎn)固定在中上方。為了開(kāi)始界面不那么單調(diào)適當(dāng)添加一些游戲角色圖片,放在標(biāo)題下方。右擊Canvas-->UI-->Panel,在Panel面板里添加水平布局組,方便為后面放入圖片后能自動(dòng)調(diào)整位置,在Panel里面添加三個(gè)Image,更換Image精靈。添加三個(gè)游戲按鈕右擊Canvas-->UI-->Button,startgame、resetgame、exitgame。分別對(duì)應(yīng)開(kāi)始游戲,重置游戲,退出游戲。為了給玩家?guī)?lái)點(diǎn)擊按鈕反饋,在Button組件面板上進(jìn)行調(diào)整。添加點(diǎn)擊音效,在OnClick()上添加聲音點(diǎn)擊事件。在Transition上選擇ColorTint,把HighLightedColor的透明度調(diào)低,實(shí)現(xiàn)當(dāng)鼠標(biāo)放在上面時(shí)有顏色反饋的效果。如圖4-1所示。按照上述操作,開(kāi)始界面制作如下圖4-2開(kāi)始場(chǎng)景所示。圖4-1按鈕設(shè)置圖圖4-2開(kāi)始場(chǎng)景 4.1.2戰(zhàn)機(jī)屬性場(chǎng)景 戰(zhàn)機(jī)屬性場(chǎng)景主要是展示當(dāng)前戰(zhàn)機(jī)的外貌和所有屬性,在Canvas上右擊選擇UI-->Panel創(chuàng)建一個(gè)板作為大畫板,管理全部的UI。為了顯示戰(zhàn)機(jī)外貌,需要?jiǎng)?chuàng)建圖片來(lái)顯示戰(zhàn)機(jī)外貌,右鍵選擇UI-->Image,創(chuàng)建Image更名為PlayerImage。把PlayerImage圖片精靈更換成戰(zhàn)機(jī)外貌,錨點(diǎn)設(shè)置在左邊,調(diào)整位置。為了反饋戰(zhàn)機(jī)當(dāng)前經(jīng)驗(yàn)進(jìn)度,在PlayerImage上右鍵選擇UI-->Text,創(chuàng)建的文本用作后期實(shí)現(xiàn)反饋的文本。如圖4-3所示。圖4-3戰(zhàn)機(jī)外貌設(shè)置圖戰(zhàn)機(jī)屬性分為名字、等級(jí)、血量、速度、攻擊力、當(dāng)前經(jīng)驗(yàn)。為了完善經(jīng)驗(yàn)方面的反饋,再增加升級(jí)下一級(jí)需要經(jīng)驗(yàn)和當(dāng)前擁有可用來(lái)升級(jí)的經(jīng)驗(yàn)。在Panel上右鍵UI-->Panel創(chuàng)建一個(gè)新板,改名為Text。在Text板內(nèi)添加文本,每一個(gè)文本對(duì)應(yīng)上述屬性的名字。在Text板的Inspector面板上添加組件水平布局組,選擇UpperLeft對(duì)齊。如圖4-4所示圖4-4Text板設(shè)置圖復(fù)制一份Text板,改名為Display,用作顯示屬性對(duì)應(yīng)的數(shù)值,水平移動(dòng)到Text板的右邊,為與Text板區(qū)分開(kāi),把Display板內(nèi)的文字顏色換成其他顏色。按照上述按鈕創(chuàng)建方法,添加一個(gè)按鈕改名為Start,作為跳轉(zhuǎn)到下一個(gè)選擇關(guān)卡場(chǎng)景的載體。按照上訴操作,戰(zhàn)機(jī)屬性界面如下圖4-5所示。圖4-5戰(zhàn)機(jī)屬性場(chǎng)景圖 4.1.3關(guān)卡選擇場(chǎng)景 游戲關(guān)卡一共設(shè)置為三關(guān),分別為綠色峽谷,天空廢墟,沙漠戈壁。玩家可以自行選擇任一關(guān)卡進(jìn)行游戲。右擊Canvas,選擇UI-->創(chuàng)建Panel,在Panel中加入水平布局組件,在水平布局組件中選擇MiddleCenter。右擊Panel,選擇UI-->Image,添加三張圖片,分別把每張圖片的精靈換成對(duì)應(yīng)關(guān)卡的背景圖。在圖片下方添加文本組件,用來(lái)描述關(guān)卡名字。文本下面添加上述制作的按鈕,用來(lái)給后續(xù)進(jìn)入關(guān)卡做載體,如下圖4-6所示。圖4-6關(guān)卡選擇界面Panel設(shè)置圖添加一個(gè)按鈕作為回退到戰(zhàn)機(jī)屬性場(chǎng)景的載體,錨點(diǎn)定在左上角。按照上訴操作,關(guān)卡選擇界面如下圖4-7所示。圖4-7關(guān)卡選擇界面圖 4.1.4加載場(chǎng)景 在Unity中如果需要加載的游戲場(chǎng)景體積過(guò)大,在普通的場(chǎng)景跳轉(zhuǎn)的時(shí)候顯示屏?xí)谄猎S久,帶來(lái)不友好的體驗(yàn)。為了在場(chǎng)景加載中給玩家一些反饋信息,本游戲設(shè)定在加載游戲場(chǎng)景的時(shí)候使用異步加載的方式,而跳轉(zhuǎn)非游戲場(chǎng)景時(shí)則使用普通的跳轉(zhuǎn)方式。為了實(shí)現(xiàn)異步加載場(chǎng)景,需要新建一個(gè)場(chǎng)景,因此便有了加載場(chǎng)景。 在加載場(chǎng)景中,在Canvas畫布上如同開(kāi)始場(chǎng)景制作了三個(gè)卡通人物人Panel,增加了場(chǎng)景的趣味性。加載場(chǎng)景最需要給出玩家反饋信息便是加載進(jìn)度,右擊Canvas,選擇UI-->Text創(chuàng)建文本,用作顯示進(jìn)度條加載百分比數(shù)字。選擇UI-->Slider創(chuàng)建滑動(dòng)條,點(diǎn)開(kāi)Slider刪除HandleSlideArea,修改FillArea下的Fill顏色變成黃色,作為進(jìn)度條加載時(shí)的顏色,如下圖4-8所示。圖4-8Slider設(shè)置圖調(diào)整Slider長(zhǎng)度大小,把固定在Canvas正下方。把Text文本組件移動(dòng)到Slider上方。按照上訴操作,加載界面如下圖4-9所示。圖4-9加載界面 4.1.5游戲場(chǎng)景 本游戲共有三個(gè)關(guān)卡,以制作第一個(gè)關(guān)卡為例,其余兩個(gè)關(guān)卡UI只與第一個(gè)背景圖片不一樣。 游戲場(chǎng)景中左邊為游戲界面,右邊為顯示其他內(nèi)容UI。先從左邊游戲界面制作開(kāi)始。作為一個(gè)豎版飛行射擊游戲,背景是一直在滾動(dòng)的,為了實(shí)現(xiàn)這一個(gè)功能在Hierarchy窗口點(diǎn)擊Create-->CreateEmpty創(chuàng)建一個(gè)空物體,名字改為Background用來(lái)存放背景圖片。把背景圖片拉進(jìn)Background物體,在背景圖片的Inspector窗口下的圖片屬性下添加幾個(gè)圖層Background層、UI層、Play層,把背景圖片的圖層選擇成Background層。復(fù)制粘貼一份,上下調(diào)整位置,連成一張大圖片。如下圖4-10所示。圖4-10背景圖片設(shè)置圖 背景滾動(dòng)需要C#腳本支持,創(chuàng)建一個(gè)腳本BackgroundMove.cs。定義一個(gè)圖片移動(dòng)速度,當(dāng)圖片的Y軸移動(dòng)到快要出去攝像機(jī)畫面的時(shí)候,改變它的位置,讓它回去到一開(kāi)始在它上一張圖片的位置。這樣兩張圖片交替,形成無(wú)限滾動(dòng)的效果。 右邊游戲界面,右擊Cavans選擇UI-->Panel,觀察Game窗口調(diào)整Panel的大小,讓其與左邊游戲腳面緊湊在一起,把圖片精靈換成圖片,游戲中設(shè)有計(jì)時(shí)器和分?jǐn)?shù)顯示,右擊Panel選擇UI-->Text,創(chuàng)建兩個(gè)文本作為顯示時(shí)間和分?jǐn)?shù)的載體。按照4.1.4的進(jìn)度條制作方法,用Slider制作兩個(gè)血條,BossHpBar和PlayerHpBar用來(lái)反饋血條變化。調(diào)整它們之間的位置,游戲界面如下圖4-11所示。圖4-11游戲界面圖 菜單界面制作:菜單的功能有重開(kāi)游戲和退出游戲。右擊Canvas選擇UI-->Panel,創(chuàng)建Panel改名為menu。修改menu大小錨點(diǎn)固定Canvas在中間,在menu內(nèi)添加Text文本,用作提示玩家游戲暫停,文本錨點(diǎn)固定在menu中上方。添加兩個(gè)按鈕一個(gè)重玩一個(gè)退出。按照上述操作菜單界面如下圖4-12所示。圖4-12菜單界面圖 勝利界面制作:勝利界面主要反饋玩家在這一次戰(zhàn)役中獲得的經(jīng)驗(yàn)和分?jǐn)?shù)以及通關(guān)時(shí)間。右擊Canvas選擇UI-->Panel,創(chuàng)建Panel改名為Victory并調(diào)整大小放置在Canvas中央。添加四個(gè)文本,第一個(gè)作為標(biāo)題,第二個(gè)顯示獲得經(jīng)驗(yàn),第三個(gè)顯示分?jǐn)?shù),第四個(gè)顯示通關(guān)時(shí)間。第一個(gè)文本字體調(diào)大放置在中上方,后三個(gè)文本垂直排序放在中左邊。添加一個(gè)退出按鈕作為返回戰(zhàn)機(jī)屬性場(chǎng)景的載體。按照上述操作,勝利界面如圖4-13所示圖4-13勝利界面圖 失敗界面制作:失敗界面與勝利界面大致一樣,不過(guò)不需要顯示分?jǐn)?shù)和通關(guān)時(shí)間。復(fù)制一份勝利界面,改名為defeat,把分?jǐn)?shù)文本和時(shí)間文本刪除,調(diào)整一下經(jīng)驗(yàn)文本位置,如圖4-14失敗界面圖所示。圖4-14失敗界面圖4.2戰(zhàn)機(jī)模塊 把戰(zhàn)機(jī)的一張圖片拖拽進(jìn)Hierarchy窗口,把名字改為Player,添加剛體Rigidbody2D和碰撞體PolygonCollider2D組件。因?yàn)槭?D游戲,在Rigidbody2D中把GravityScale設(shè)為0,在PolygonCollider2D中把isTrigger勾選上。 4.2.1操縱模塊 給Player添加腳本Player.cs,使玩家可以通過(guò)鍵盤操縱戰(zhàn)機(jī)移動(dòng)。當(dāng)按下鍵盤WASD或者上下左右鍵戰(zhàn)機(jī)進(jìn)行移動(dòng),通過(guò)剛體控制戰(zhàn)機(jī)發(fā)生運(yùn)動(dòng)。創(chuàng)建三個(gè)變量分別紀(jì)錄水平左邊,垂直坐標(biāo)和速度。把坐標(biāo)賦予給新的二維坐標(biāo)發(fā)生移動(dòng)。 戰(zhàn)機(jī)飛行區(qū)域是有限制的,戰(zhàn)機(jī)只能在固定區(qū)域移動(dòng)。區(qū)域的大小取決于左邊游戲界面的大小。在每一幀的判斷中,如果機(jī)位置超出區(qū)域限制時(shí),會(huì)強(qiáng)制戰(zhàn)機(jī)位置變回在限制區(qū)域邊緣,每一次判斷最后重置當(dāng)前位置。 4.2.2屬性模塊 在游戲場(chǎng)景中戰(zhàn)機(jī)的屬性有血量,速度,等級(jí),攻擊力,戰(zhàn)機(jī)每升一級(jí)的屬性都有所增加。在開(kāi)始游戲時(shí),會(huì)讀取在戰(zhàn)機(jī)屬性場(chǎng)景中戰(zhàn)機(jī)的屬性,然后賦予給游戲場(chǎng)景中的Player。在Player.cs腳本中有兩個(gè)血量變量,一個(gè)是最大血量playerMaxHp,一個(gè)當(dāng)前血量playerCurrentHp,playerCurrentHp的值與戰(zhàn)機(jī)血條掛鉤。速度限制戰(zhàn)機(jī)的移動(dòng)。等級(jí)與戰(zhàn)機(jī)的外觀有關(guān),戰(zhàn)機(jī)一共擁有12級(jí),每隔三級(jí)戰(zhàn)機(jī)會(huì)更新外觀和子彈槍械。攻擊力與戰(zhàn)機(jī)子彈傷害有關(guān)。 4.2.3外觀模塊 戰(zhàn)機(jī)一共擁有擁有4個(gè)外觀,每隔3級(jí)更換一次。在Player.cs腳本中創(chuàng)建一個(gè)Sprite數(shù)組用來(lái)存放戰(zhàn)機(jī)不同階段的外觀。在游戲開(kāi)始時(shí),根據(jù)傳過(guò)來(lái)的等級(jí)劃分,對(duì)應(yīng)階段對(duì)應(yīng)外觀,如下圖4-15。圖4-15戰(zhàn)機(jī)外觀精靈數(shù)組 4.2.4槍口子彈模塊戰(zhàn)機(jī)不同階段有不同的槍口,隨著等級(jí)的提升槍口會(huì)越來(lái)越多。第一階段時(shí)只有1個(gè)正常槍口和1個(gè)特殊槍口。二階段時(shí)有1個(gè)正常槍口和2個(gè)特殊槍口。三階段有2個(gè)正常槍口和2個(gè)特殊槍口。四階段有3個(gè)正常槍口2個(gè)特殊槍口。在Player組件下創(chuàng)建空物體用作槍口,槍口放置如下圖4-16所示。圖4-16戰(zhàn)機(jī)槍口放置圖 在進(jìn)入游戲后戰(zhàn)機(jī)先會(huì)判斷自身在那個(gè)階段,判斷完成后會(huì)根據(jù)所在階段,把該階段的普通槍口打開(kāi)。創(chuàng)建腳本Gun.cs,通過(guò)實(shí)例化函數(shù)Instantiate(),實(shí)例化子彈預(yù)制體,再用InvokeRepeating()函數(shù)委托機(jī)制來(lái)重復(fù)實(shí)例化子彈。 當(dāng)玩家操縱戰(zhàn)機(jī)獲得道具的時(shí)候,戰(zhàn)機(jī)會(huì)改變槍口或增加槍口的數(shù)量,從而得到強(qiáng)化。道具具有時(shí)效性,超過(guò)時(shí)間便由超級(jí)槍口變回普通槍口。在Player.cs腳本中定義變量specialGunTime特殊槍口時(shí)間,resetGunTime重置時(shí)間,gunLevel槍口等級(jí)。構(gòu)建兩個(gè)方法SpecialGun()特殊槍口,NormalGun()正常槍口。獲得道具后,切換成特殊武器,超出時(shí)間切換成正常武器。 不同階段的槍口有不同的子彈,把子彈的圖片拖拽進(jìn)Hirearchy窗口,添加Rigidbody2D和BoxCollider2D組件。把Rigidbody2D里的GravityScale設(shè)置為0,BoxCollider2D里勾選上isTrigger。創(chuàng)建PlayerBullet.cs腳本掛載在自己身上。在腳本里設(shè)置變量子彈速度bulletSpeed和子彈傷害bulletHit。子彈傷害繼承戰(zhàn)機(jī)選擇場(chǎng)景中的攻擊。因?yàn)樽訌検怯蓱?zhàn)機(jī)發(fā)射,使用transform.Translate()方法向上運(yùn)動(dòng)。當(dāng)子彈超過(guò)一定Y軸距離之后用Destroy()方法銷毀自己,從而節(jié)省資源。當(dāng)子彈碰到敵機(jī)的時(shí)候使用OnTriggerEnter2D()方法檢測(cè)碰撞物體的標(biāo)簽,如果標(biāo)簽是“Enemy”或是“Boss”的時(shí)候,顯示判斷敵機(jī)是否死亡,不是死亡則調(diào)用Enemy腳本里面的BeHit方法,并銷毀自己。 4.2.5碰撞模塊 在游戲中,戰(zhàn)機(jī)會(huì)與其他物體發(fā)生碰撞。在不考慮與自己子彈碰撞的情況下,會(huì)與戰(zhàn)機(jī)發(fā)生碰撞的有道具,敵機(jī),敵機(jī)子彈。在這里分析前兩者,戰(zhàn)機(jī)獲得道具后道具消失并播放一段音效。碰到敵機(jī)時(shí),戰(zhàn)機(jī)當(dāng)前生命值減一。碰撞檢測(cè)使用OnTriggerEnter2D()的方法來(lái)處理。給道具加上“Award”標(biāo)簽,敵機(jī)加上“Enemy”標(biāo)簽。4.3敵機(jī)模塊 4.3.1類別屬性模塊敵機(jī)類別大體分為兩類,非Boss敵機(jī),Boss敵機(jī)。為了增加游戲可玩性,把非Boss敵機(jī)細(xì)分成三種小敵機(jī),中敵機(jī),大敵機(jī)。Boss敵機(jī)根據(jù)關(guān)卡數(shù)量設(shè)置等數(shù)量Boss。把全部敵機(jī)圖片拖拽Hierarchy窗口,均添加Rigidbody2D和碰撞體BoxCollider2D組件。創(chuàng)建Enemy.cs腳本并掛載在敵機(jī)上,在腳本中使用枚舉的方法把敵機(jī)類別列出,方便后續(xù)敵機(jī)區(qū)分。敵機(jī)主要屬性有生命值,飛行速度,分?jǐn)?shù),經(jīng)驗(yàn)。當(dāng)戰(zhàn)機(jī)子彈與敵機(jī)發(fā)生碰撞后,通過(guò)BeHit方法進(jìn)行生命扣除,當(dāng)生命值小于等于0敵機(jī)銷毀。敵機(jī)從頂部生成通過(guò)transform.Translate方法向底部運(yùn)動(dòng)。在敵機(jī)本銷毀后玩家得到相應(yīng)的分?jǐn)?shù)和經(jīng)驗(yàn)。分?jǐn)?shù)會(huì)實(shí)時(shí)在UI界面更新,經(jīng)驗(yàn)需要在游戲結(jié)束后才能查看。4.3.2槍口子彈模塊 不同類別的敵機(jī)有不用的槍口,小敵機(jī)只有一個(gè)槍口,中敵機(jī)有兩個(gè)槍口,大敵機(jī)有三個(gè)槍口,而Boss敵機(jī)因具有特殊彈幕只需一個(gè)槍口即可。和戰(zhàn)機(jī)槍口制作類似,通過(guò)在敵機(jī)組件下創(chuàng)建空物體來(lái)作為槍口,在空物體上掛載上Gun腳本。敵機(jī)槍口設(shè)置如下圖4-17所示。圖4-17敵機(jī)槍口設(shè)置圖 非Boss敵機(jī)槍口開(kāi)槍原理與戰(zhàn)機(jī)槍口原理一樣,都是通過(guò)Instantiate(),實(shí)例化子彈預(yù)制體,InvokeRepeating()委托來(lái)重復(fù)實(shí)例化子彈。非Boss敵機(jī)子彈與戰(zhàn)機(jī)子彈的不同有兩點(diǎn),敵機(jī)子彈是向下運(yùn)動(dòng),敵機(jī)子彈碰撞檢測(cè)的對(duì)象是戰(zhàn)機(jī)。新建腳本EnemyBullet.cs掛載在敵機(jī)子彈的預(yù)制體上,修改函數(shù)transform.Translate()的方向和OnTriggerEnter2D()方法里面的標(biāo)簽判讀修改為“Player”即可。與戰(zhàn)機(jī)子彈一樣,在敵機(jī)子彈運(yùn)動(dòng)到游戲區(qū)域外就會(huì)自動(dòng)銷毀節(jié)省資源。為了增加游戲的挑戰(zhàn)難度,每一個(gè)Boss擁有自己的彈幕,本游戲一共制作了三種彈幕,分別是散彈彈幕,圓形彈幕,組合圓形彈幕。創(chuàng)建腳本BulletMode.cs,彈幕的實(shí)現(xiàn)使用了協(xié)程方法。先構(gòu)造一個(gè)子彈生成方法CreatBullet,方法有兩個(gè)參數(shù)方向和生成位置。散彈彈幕:發(fā)射方向初始值為槍口方向,構(gòu)建兩個(gè)四元素變量,一個(gè)向左一個(gè)向右。使用for循環(huán)嵌套switch循環(huán),發(fā)射第一顆子彈后旋轉(zhuǎn)到另外一個(gè)位置,如此類推來(lái)實(shí)現(xiàn)散彈槍子彈的發(fā)射。圓形彈幕:發(fā)射方向初始化為槍口方向,構(gòu)建一個(gè)四元數(shù)變量來(lái)記錄旋轉(zhuǎn)的角度,使用用for循環(huán)在發(fā)射一顆子彈后,槍口按照四元數(shù)變量的角度進(jìn)行旋轉(zhuǎn)發(fā)射下一顆,形成圓形彈幕。 組合彈幕:發(fā)射方向初始化為槍口方向,設(shè)置一個(gè)四元數(shù)變量作為子彈一階段旋轉(zhuǎn)發(fā)射角度,建立一個(gè)列表來(lái)存放一階段發(fā)射的子彈。按照?qǐng)A形單發(fā)射的原理發(fā)射子彈,把一階段發(fā)射出去的子彈放在列表中。使用協(xié)程功能停頓1s后在一階段發(fā)射子彈的位置上,調(diào)用圓形彈幕生成,讓子彈形成2階段的圓形彈幕。4.3.3敵機(jī)AI模塊 敵機(jī)AI模塊分為兩個(gè)部分,非Boss敵機(jī)的尋敵功能和Boss的巡邏功能和彈幕變化功能。 尋敵功能:把敵機(jī)當(dāng)前位置與戰(zhàn)機(jī)當(dāng)前位置視為兩點(diǎn),使用Distance()方法來(lái)計(jì)算他們的間距,當(dāng)間距少于跟隨距離預(yù)設(shè)值時(shí),敵機(jī)通過(guò)MoveTowards()方法先戰(zhàn)機(jī)移動(dòng)。為了避免當(dāng)敵機(jī)在戰(zhàn)機(jī)下方時(shí)還繼續(xù)跟隨,需先判斷敵機(jī)的Y軸坐標(biāo)是否大于戰(zhàn)機(jī)Y軸坐標(biāo),大于則判斷是否跟隨。 巡邏功能:因?yàn)橛螒驌碛腥齻€(gè)關(guān)卡,所以需要在boss巡邏前判斷當(dāng)前關(guān)卡。在判斷結(jié)束后執(zhí)行預(yù)定的路線巡邏功能。巡邏功能與上訴跟隨功能相似,先確定向一個(gè)巡邏點(diǎn)移動(dòng),然后使用方法Distance()來(lái)判讀是否到達(dá)巡邏點(diǎn),MoveTowards()方法來(lái)向下一個(gè)巡邏點(diǎn)移動(dòng)。 彈幕變化功能:通過(guò)訪問(wèn)圖片的fillAmount屬性來(lái)得到Boss的血條百分比。當(dāng)百分比大于60%的時(shí)候彈幕簡(jiǎn)單,少于等于60%的時(shí)候先把前一個(gè)協(xié)程關(guān)掉再重新運(yùn)行一個(gè)新的彈幕協(xié)程,更改協(xié)程的參數(shù)讓彈幕變得復(fù)雜。4.4游戲功能模塊4.4.1敵機(jī)與道具生成模塊 制作道具預(yù)制體:把道具圖片Hirearchy窗口,添加Rigidbody2D和BoxCollider2D組件。道具向下運(yùn)動(dòng),在超出游戲場(chǎng)景范圍后銷毀自生。創(chuàng)建Award腳本,實(shí)現(xiàn)上述功能。 道具與非boss敵機(jī)都在游戲場(chǎng)景上方出現(xiàn),因此可以創(chuàng)建一個(gè)新物品作為孵化點(diǎn)放在游戲場(chǎng)景上方。生成的方式與子彈生成一樣使用Instantiate()實(shí)例化預(yù)制體,InvokeRepeating()委托機(jī)制重復(fù)生成。創(chuàng)建Spawn腳本,定義敵機(jī)與道具生成頻率變量,關(guān)卡變量。更具關(guān)卡的不同,生成的敵機(jī)也不同。為了讓戰(zhàn)機(jī)生成位置隨機(jī)在實(shí)例化時(shí)把X軸的坐標(biāo)變成一個(gè)隨機(jī)數(shù),實(shí)現(xiàn)隨機(jī)位置生成。 在Boss出現(xiàn)的時(shí)候,孵化點(diǎn)停止孵化敵機(jī)。構(gòu)建StopSpawn()方法,調(diào)用CancelInvoke()方法來(lái)停止委托。 Boss是一直存在在游戲界面上的,一開(kāi)始通過(guò)GetComponent獲取Renderer組件和BoxCollider2D組件,把組件里面的enabled值設(shè)置成false進(jìn)行隱藏。當(dāng)時(shí)間超過(guò)60秒和布爾值isBoss等于false時(shí),Boss兩個(gè)組件的enabled值和isBoss變?yōu)閠rue,boss顯示出來(lái),同時(shí)調(diào)用StopSpawn方法停止敵機(jī)的孵化。4.4.2游戲場(chǎng)景UI更新模塊 為了給玩家游戲過(guò)程中帶來(lái)實(shí)時(shí)的反饋體驗(yàn),游戲場(chǎng)景中需要實(shí)時(shí)更新的UI有計(jì)時(shí)器,分?jǐn)?shù),boss血量和戰(zhàn)機(jī)血量。創(chuàng)建腳本GameManage.cs用來(lái)管理UI的更新,定義兩個(gè)文本變量來(lái)獲取計(jì)時(shí)器和分?jǐn)?shù)組件,兩個(gè)int類型變量playscore和exp為后續(xù)做好準(zhǔn)備。在Awake方法里面先單例化,然后在Update方法里面實(shí)現(xiàn)實(shí)時(shí)更新。 當(dāng)敵機(jī)生命值少于0后銷毀自身,通過(guò)BeHit方法實(shí)現(xiàn)玩家分?jǐn)?shù)和經(jīng)驗(yàn)的增加 戰(zhàn)機(jī)血條與Boss血條更新功能一樣,通過(guò)start方法獲得血條的組件,然后獲得目標(biāo)當(dāng)前生命值與最大生命值的百分比值,把值賦予給滑動(dòng)條的fillAmount,實(shí)現(xiàn)血條的更新。為了能更好的反映血條剩余的值,使用判斷語(yǔ)句,當(dāng)血量在30%以上60%一下的時(shí)候顯示黃色,少于30%的時(shí)候顯示紅色。4.4.3場(chǎng)景跳轉(zhuǎn)模塊 創(chuàng)建LoadingScene.cs腳本,本游戲中除跳轉(zhuǎn)到游戲場(chǎng)景中使用異步加載外,其余均使用SceneManager中LoadScene方法實(shí)現(xiàn)場(chǎng)景轉(zhuǎn)換。 實(shí)現(xiàn)異步加載場(chǎng)景需要獲得想要跳轉(zhuǎn)的的場(chǎng)景名字,把目標(biāo)場(chǎng)景名字傳遞給LoadSceneAsync中從而實(shí)現(xiàn)異步加載。為了能反饋加載的進(jìn)度,在start方法中把a(bǔ)llowSceneActivation的值設(shè)為false,防止場(chǎng)景在進(jìn)度條沒(méi)加載完就跳轉(zhuǎn)。在Update方法中臨時(shí)進(jìn)度使用線性插值函數(shù)Lerp來(lái)回去進(jìn)度條加載百分比的值,加載條的填充值根據(jù)臨時(shí)進(jìn)度來(lái)填充。當(dāng)填充之到1之后allowSceneActivation值變?yōu)閠rue,從Loading場(chǎng)景跳轉(zhuǎn)到目標(biāo)場(chǎng)景。 在按鈕的OnClick事件中選擇對(duì)應(yīng)的跳轉(zhuǎn)場(chǎng)景功能。4.4.4暫停與結(jié)束功能模塊 在GameManager.cs腳本內(nèi)添加三個(gè)Image變量gameMenu,victory,defeat,對(duì)應(yīng)游戲菜單界面,勝利界面,失敗界面,在游戲開(kāi)始時(shí)三個(gè)界面的SetActive值均設(shè)置false。當(dāng)玩家按下esc鍵時(shí),通過(guò)判斷布爾值isPaused,來(lái)判讀現(xiàn)在是否出于暫停。如果是true,gameMenu的SetActive變?yōu)閒alse菜單消失,timeScale等于1游戲回到正常運(yùn)行。如果是false,gameMenu的Setactive值變?yōu)閠rue菜單顯示,timeScale等于0游戲暫停。 勝負(fù)條件的判斷在于戰(zhàn)機(jī)的血量和Boss的血量,戰(zhàn)機(jī)血量變?yōu)?游戲失敗,Boss血量小于等于0游戲勝利。構(gòu)建Victory和Defeat方法,無(wú)論是那種方式結(jié)束游戲,把timeScale的值設(shè)為0游戲暫停,把對(duì)應(yīng)的勝利失敗界面顯示出來(lái),更新界面上的文本信息。4.4.5數(shù)據(jù)保存讀取模塊 在本游戲中需要保存數(shù)據(jù)的地方有兩個(gè),一個(gè)是游戲結(jié)束后點(diǎn)擊exit按鈕退出時(shí)需要保存這次游戲過(guò)程中獲得的經(jīng)驗(yàn)值。另一個(gè)是在戰(zhàn)機(jī)屬性場(chǎng)景中點(diǎn)擊Start按鈕后跳轉(zhuǎn)到關(guān)卡場(chǎng)景時(shí)需要保存戰(zhàn)機(jī)的各種屬性。而需要讀取數(shù)據(jù)的地方有兩個(gè),一個(gè)在進(jìn)入戰(zhàn)機(jī)屬性場(chǎng)景時(shí)需要讀取當(dāng)前戰(zhàn)機(jī)的屬性和擁有可支配經(jīng)驗(yàn)并顯示出來(lái)。另一個(gè)在進(jìn)入游戲場(chǎng)景時(shí)戰(zhàn)機(jī)的屬性要讀取在戰(zhàn)機(jī)屬性場(chǎng)景中保存到的屬性。 游戲中因?yàn)樾枰4娴膶傩詳?shù)量較少,所以選擇使用PlayerPerfs方法。創(chuàng)建SaveAndLoad.cs腳本,使用PlayerPerfs中的setInt方法保存數(shù)據(jù),保存經(jīng)驗(yàn)方法與保存屬性方法分開(kāi)編寫。 編寫兩個(gè)方法SaveExp和SavePlay,方便再按鈕的OnClick中調(diào)用。在方法中分別調(diào)用SaveByOverExp(),SaveByPlayer()。在上述場(chǎng)景中的按鈕上添加各自需要的功能。 讀取數(shù)據(jù)使用PlayerPerfs中的Haskey方法,在戰(zhàn)機(jī)屬性場(chǎng)景中新建一個(gè)空物體,在空物體上掛載一個(gè)新腳本PlayerStatus.cs用來(lái)管理戰(zhàn)機(jī)屬性。在腳本內(nèi)按照戰(zhàn)機(jī)屬性場(chǎng)景中名字為Display組件中所有元素創(chuàng)建對(duì)應(yīng)變量。在start方法里面在把保存數(shù)據(jù)賦值給變量前需要先做判斷,在擁有那對(duì)應(yīng)名字的鍵時(shí)才賦予值,否則變量的值為原設(shè)置的值。這樣做的目的是為了放置第一次進(jìn)入游戲時(shí),在沒(méi)通關(guān)游戲時(shí)保存數(shù)據(jù),在讀取時(shí)沒(méi)有對(duì)應(yīng)的鍵而發(fā)生報(bào)錯(cuò)。 在游戲界面在開(kāi)始時(shí),在Player.cs腳本中戰(zhàn)機(jī)讀取屬性。4.4.6戰(zhàn)機(jī)升級(jí)模塊 在戰(zhàn)機(jī)屬性界面中玩家可以通過(guò)按下空格鍵給戰(zhàn)機(jī)分配經(jīng)驗(yàn),當(dāng)經(jīng)驗(yàn)滿了之后戰(zhàn)機(jī)升級(jí),在每次升級(jí)后戰(zhàn)機(jī)屬性更新。戰(zhàn)機(jī)最高等級(jí)為12級(jí),擁有四個(gè)外觀,每隔三個(gè)等級(jí)便會(huì)發(fā)生外觀上的變化。戰(zhàn)機(jī)每一級(jí)升級(jí)所需經(jīng)驗(yàn)通過(guò)for循環(huán)以1.1倍來(lái)增加,并用數(shù)組存儲(chǔ)起來(lái)。 在按下空格鍵增加經(jīng)驗(yàn)時(shí)需要判斷當(dāng)前擁有可支配經(jīng)驗(yàn)是否大于200并且戰(zhàn)機(jī)等級(jí)少于12級(jí)。滿足條件后才能調(diào)用加經(jīng)驗(yàn)方法。在加經(jīng)驗(yàn)方法中每按下一次戰(zhàn)機(jī)經(jīng)驗(yàn)增加,擁有可支配經(jīng)驗(yàn)減少。再判斷當(dāng)前經(jīng)驗(yàn)是否超過(guò)升級(jí)需要經(jīng)驗(yàn)并且當(dāng)前等級(jí)少于12級(jí),如果是則調(diào)用升級(jí)方法,完成后調(diào)用更新屬性方法對(duì)面板進(jìn)行更新。在升級(jí)方法中,升級(jí)后當(dāng)前經(jīng)驗(yàn)減需要減去升級(jí)所需經(jīng)驗(yàn),戰(zhàn)機(jī)等級(jí)和其他屬性需要發(fā)生變化并調(diào)用更新戰(zhàn)機(jī)外觀方法更新外觀。

第五章游戲?qū)С雠c測(cè)試 導(dǎo)出運(yùn)行游戲并對(duì)其進(jìn)行游戲測(cè)試,確保游戲內(nèi)容的完善和功能的實(shí)現(xiàn)。 5.1游戲?qū)С?游戲設(shè)計(jì)已經(jīng)完成,接下來(lái)便是把游戲打包導(dǎo)出。點(diǎn)擊工具欄上方的File,選擇BuildSettings,把制作好的場(chǎng)景拖進(jìn)ScenesInBuild中,然后點(diǎn)擊右下方的Build按鈕,等待游戲?qū)С?。圖5-1游戲?qū)С鰣D 5.2游戲測(cè)試 雙擊打開(kāi)上面導(dǎo)出游戲的exe文件,游戲正常運(yùn)行。使用黑盒測(cè)試對(duì)游戲中各個(gè)功能做可行性測(cè)試,經(jīng)過(guò)多次游戲功能測(cè)試后,總結(jié)測(cè)試結(jié)果結(jié)果如下表5-1所示。表5-1游戲功能測(cè)試結(jié)果測(cè)試項(xiàng)目描述/操作執(zhí)行結(jié)果可行性戰(zhàn)機(jī)移動(dòng)按下WASD/方向鍵戰(zhàn)機(jī)發(fā)生移動(dòng)可行場(chǎng)景跳轉(zhuǎn)點(diǎn)擊跳轉(zhuǎn)按鈕場(chǎng)景發(fā)生跳轉(zhuǎn)可行戰(zhàn)機(jī)升級(jí)按下升級(jí)鍵戰(zhàn)機(jī)升級(jí)屬性更新可行敵機(jī)尋敵控制戰(zhàn)機(jī)接近敵機(jī)敵機(jī)跟隨戰(zhàn)機(jī)可行Boss巡邏游戲中等待Boss出現(xiàn)Boss按照規(guī)劃路線移動(dòng)可行游戲場(chǎng)景UI更新進(jìn)行游戲場(chǎng)景中各UI更新正??尚袛?shù)據(jù)保存讀取更新一次戰(zhàn)機(jī)屬性后再進(jìn)入游戲

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論