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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論