基于unity3d的塔防游戲的設計與實現(xiàn)_第1頁
基于unity3d的塔防游戲的設計與實現(xiàn)_第2頁
基于unity3d的塔防游戲的設計與實現(xiàn)_第3頁
基于unity3d的塔防游戲的設計與實現(xiàn)_第4頁
基于unity3d的塔防游戲的設計與實現(xiàn)_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE28基于unity3d的塔防游戲的設計與實現(xiàn)摘要塔防,即炮塔防御(TowerDefence),也統(tǒng)稱TD,指一類通過在地圖上建造炮塔或類似建筑物,以阻止游戲中敵人進攻的策略型游戲,要有陣圖。塔防受眾很廣,游戲模式簡單而且可玩性極強,時至今日,塔防在游戲應用中依然是最熱門的下載類型之一,比較經(jīng)典的像《植物大戰(zhàn)僵尸》。本設計使用當前流行的跨平臺游戲引擎Unity3d,編程語言為C#。在游戲中,玩家可以在任何空白的地塊上建造各種防御塔用于攻擊不同類型的怪物,怪物會按照預定的路線前進,當進入目的地的怪物到達一定數(shù)量后游戲會失??;當進入目的地的怪物沒有到達指定數(shù)量且所有怪物都被擊殺后游戲通關。使用Unity3d引擎來設計讓UI、游戲地圖的布置大幅簡化。并通過使用拓展性強的類,使得開發(fā)者能快速添加新的怪物、防御塔等,提高開發(fā)效率的同時,還降低了游戲的開發(fā)成本。本文主要從選題背景與意義、可行性與需求分析、游戲設計與功能實現(xiàn)、測試等四個方面,按照制作的流程對本次設計進行論述,對開發(fā)的思路、實現(xiàn)以及實現(xiàn)過程中的主要問題都予以描述記錄。關鍵詞:游戲;塔防;Unity3d;PC

DesignandImplementationofavirtualcitybuildinggameAbstractTowerdefense,thatis,turretdefense,alsoknownasTD,referstoakindofstrategicgamethatblockstheenemy'sattackinthegamebybuildingturretsorsimilarbuildingsonthemap.Towerdefensehasawideaudience,simplegamemodeandstrongplayability.Today,towerdefenseisstilloneofthemostpopulardownloadtypesingameapplications,suchastheclassic"Plantsvs.Zombies".Thisdesignusesthecurrentpopularcrossplatformgameengineunity3d,andtheprogramminglanguageisC.Inthegame,playerscanbuildvariousdefensetowersonanyblanklandtoattackdifferenttypesofmonsters.Monsterswilladvanceaccordingtothepredeterminedroute.Whenthenumberofmonstersenteringthedestinationreachesacertainnumber,thegamewillfail.Whenthenumberofmonstersenteringthedestinationdoesnotreachaspecifiednumberandallmonstersarekilled,thegamewillpassthecustoms.Useunity3denginetodesignandsimplifythelayoutofUIandgamemap.Andthroughtheuseofexpandingclasses,developerscanquicklyaddnewmonsters,defensetowers,etc.,improvedevelopmentefficiency,butalsoreducethedevelopmentcostofthegame.Thispaperselectedtopicbackgroundandthesignificance,feasibilityandrequirementanalysis,gamedesignandfunctionimplementation,testing,andsoonfouraspects,accordingtotheproductionprocessofthisdesignisdiscussed,thedevelopmentideaandthemainproblemsintheprocessofimplementationandtheimplementationofallrecordsshallbedescribed.Keywords:Virtualgame;Unity3Dgameengine;Theinteractiveofgames目錄TOC\o"1-3"\h\u143151前言 1252911.1論文結(jié)構安排 1250781.2研究的目的與意義 1254692可行性研究 398522.1技術可行性 3309012.2經(jīng)濟可行性 368132.3操作可行性 4278072.4總結(jié) 428403游戲概要設計 5325453.1總體概述 5199303.2游戲功能設計 5219283.2.1地圖與路線 5176673.2.2敵人 6313783.2.3防御塔 6182273.2.4武器系統(tǒng) 8288833.2.5特效設計 8325383.2.6各種UI 9178534游戲具體實現(xiàn) 1193724.1程序?qū)崿F(xiàn) 1166804.1.1建造管理模塊 11174204.1.2游戲進程管理模塊 1194514.1.3敵人模塊 12113374.1.4敵人生成器模塊 1214514.1.5游戲菜單模塊 1289024.1.6可建造地塊模塊 13104004.1.7防御塔模塊 13135054.1.8防御塔數(shù)據(jù)模塊 13224704.1.9游戲視角控制模塊 14305114.1.10敵人進攻波次模塊 1490824.1.8敵人行進路線模塊 14213005測試 14270485.1交互界面 14110305.2游戲過程 15141715.3測試總結(jié) 17174226總結(jié) 1824542參考文獻 19872謝辭 2015819附錄 201前言Unity,也稱Unity3D,是近幾年非常流行的一個3D游戲開發(fā)引擎,跨平臺能力強,使用它開發(fā)的手機游戲數(shù)不勝數(shù)。REF_Ref7337\r\h[8]Unity3d是如今游戲開發(fā)過程中比較流行的虛擬現(xiàn)實和跨平臺游戲開發(fā)的虛擬交互式引擎。這幾年,不僅Web應用、移動設備的App應用等得到迅猛發(fā)展,而且軟件開發(fā)模式及其管理也發(fā)生了較大的變化。REF_Ref26503\r\h[9]Unity3d引擎為游戲開發(fā)者提供了易用的可視化編輯器、資源導入導出、動畫與物理系統(tǒng)、光照與音效系統(tǒng)以及對多達21個平臺的發(fā)布支持等等的功能。除此之外,在Unity3d從發(fā)布至今的多年發(fā)展中,網(wǎng)絡上對于開發(fā)者提供的教材文檔十分的豐富,官方的AssetStore里面也提供十分豐富多樣的插件,由而多年來Unity3d引擎深受開發(fā)者的喜愛、逐步成為全球開發(fā)者普遍試用的交互式引擎。1.1論文結(jié)構安排本論文共有六章。結(jié)構安排如下:第一章:對游戲現(xiàn)狀和發(fā)展前景、項目的研究目的和意義進行了簡要介紹。第二章:對此項目的可行性分析,包括技術、經(jīng)濟、操作三個方面,并做出總結(jié)。第三章:對游戲的概要設計和游戲的主要功能進行介紹。第四章:對游戲的類的詳細闡述,介紹了游戲功能的具體實現(xiàn),對游戲架構的各個部分與其相對于的代碼部分進行分析。第五章:對游戲進行測試,包括測試的方法與測試的功能,并對此作出總結(jié)。第六章:總結(jié)本次項目的實現(xiàn)過程與體會。1.2研究的目的與意義隨著智能化電子產(chǎn)品的普及,游戲產(chǎn)業(yè)已成為經(jīng)濟市場中增長速度最快的熱點,近幾年來,Android平臺游戲以及Web的網(wǎng)頁游戲迅速發(fā)展,已經(jīng)成為帶動游戲產(chǎn)業(yè)發(fā)展的中堅力量。REF_Ref22904\r\h[10]知識經(jīng)濟的核心內(nèi)容之一是創(chuàng)意經(jīng)濟,創(chuàng)意經(jīng)濟也是知識經(jīng)濟的重要表現(xiàn)形式,可以說,沒有創(chuàng)意,就沒有新經(jīng)濟。作為文化創(chuàng)意產(chǎn)業(yè)中重要的部分,游戲設計是商品生產(chǎn)與文化藝術創(chuàng)意的一次碰撞下的產(chǎn)物,在中國的經(jīng)濟發(fā)展中,游戲產(chǎn)業(yè)占據(jù)著十分重要的的地位。截至2015年上半年,中國游戲市場實際銷售收入達到605.1億元人民幣,同比增長21.9%。REF_Ref23319\r\h[2]國內(nèi)的首款自主研發(fā)的3d游戲是在2003年,相對于美國最早的第一人稱3d射擊游戲《重返德軍總部》晚了十年左右,雖然目前國內(nèi)3d技術日益加強,但畢竟起步較晚,與國外存在著不小的差距,只有少數(shù)大型的互聯(lián)網(wǎng)公司能夠從設計理念出發(fā)并應用到開發(fā)制作上,其余大部分游戲公司和游戲開發(fā)者依舊使用國外的游戲引擎,比較出名的有:虛幻引擎、寒霜引擎以及Unity3d引擎,要想開發(fā)一款優(yōu)秀的游戲,人工智能必不可少。REF_Ref3513\r\h[1]不過,隨著智能化設備的快速普及,現(xiàn)階段國內(nèi)的游戲市場競爭很激烈,尤其是移動端,自2017年國內(nèi)移動游戲市場進入黃金時代以來,游戲APP從種類到數(shù)量皆呈現(xiàn)爆發(fā)式增長,玩家人數(shù)與日俱增,涵蓋的玩家年齡段也越來越廣。2可行性研究2.1技術可行性本設計基于Unity3d引擎,采用C#開發(fā)腳本,C#是由Microsoft公司開發(fā)的一種面向?qū)ο蟮木幊陶Z言。作為使用.NETFramework的Windows和Web開發(fā)人員無可爭議的首選語言,C#語言提供了VisualBasic的簡單易用性,同時也提供了Java和C++語言的靈活性和強大功能。REF_Ref5632\r\h[4]目前比較流行的開發(fā)引擎有Unity3d、Cocos2d-x、UnrealEngine3等。虛幻3引擎具有高優(yōu)先級的動態(tài)演示管道和其他演示效果,但對多核CPU的支持很差,而且大多數(shù)插件都必須付費,而且國內(nèi)這方面的學習資源也較少,這對學生個人開發(fā)群體來說不是很合適。但是Cocos2d-x是為2T游戲開發(fā)的游戲引擎,不適合這種設計。與前兩個相比,Unity3d在技術支持和技術可見性方面更適合像作者這樣的學生開發(fā)人員。自從2012年Unity正式進入中國市場以來,中國越來越多的業(yè)內(nèi)知名企業(yè)開始將選擇Unity引擎開發(fā)作為其移動端戰(zhàn)略部署的重要組成部分,使用Unity開發(fā)的諸多游戲都在市場上大方異彩。REF_Ref24315\r\h[6]Unity3d是一個綜合性的游戲開發(fā)工具,用于創(chuàng)建交互式多媒體內(nèi)容,如3D視頻、視頻、實時3D動畫等。同時,unity3d擁有免費的開發(fā)資源和免費的強大插件,非常適合常用的3D類應用。如果你正在為尋找合適的開發(fā)工具而焦頭爛額時,不妨嘗試一下Unity3D這個引擎。如果需要制作2D/3D的游戲產(chǎn)品,那么它是一個不可多得的游戲引擎工具;如果需要制作AAA級畫質(zhì)的數(shù)字交互產(chǎn)品,那么它可以為你提供高效優(yōu)質(zhì)的渲染效果。REF_Ref3438\r\h[5]從上可以看出,unity3d加入可視化引擎視圖為初級的開發(fā)者提供了很大的方便,由于其能夠?qū)㈨椖堪l(fā)布于多平臺,它使開發(fā)者能夠更加關注游戲技術的研究,而不是代碼平臺兼容性上需要時間問題的問題。綜上所述,本設計基于一個使用C#腳本開發(fā)的unity3d引擎,在技術上是可行的。2.2經(jīng)濟可行性此次塔防游戲設計是單機游戲,開發(fā)引擎使用的是Unity3d,使用的是免費的個人版,將游戲打包至PC或手機端上即可游玩。此次設計的開發(fā)是獨立開發(fā),開發(fā)人員是筆者,沒有團隊上的開銷,游戲所投入的成本很低,主要集中在游戲資源(如模型、材質(zhì))的收集以及游戲本體的開發(fā)。Unity是一款標準的商業(yè)游戲引擎,而商業(yè)引擎的主要特點有收費、封閉源碼和功能強大。關于收費情況,Unity的使用費用非常昂貴,最便宜的普通版許可證也需要400美元,加強版本為1500美元。當然許可證的版本不同,引擎支持的功能也就截然不同。具有加強版許可證的引擎的很多強大功能是有普通版許可證的引擎所不具備的。但是從學習的角度來說,無須購買許可證同樣可以進行,因為許可證更大的用處在于游戲制作完成后的打包與發(fā)布,不購買許可證制作的游戲是無法發(fā)售的,不過,單就學習而言,我們完全無須購買許可證,選擇免費的Unity即可。REF_Ref25559\r\h[7]綜上所述,本次設計在經(jīng)濟上可行。2.3操作可行性此次塔防游戲在操作界面采用極簡的風格,操作十分的簡易明了,unity3d引擎為游戲界面的設計提供了良好的設計平臺。游戲里所使用的圖標如炮塔的圖標皆取自炮塔本身使用的模型的貼圖,在配合上與游戲界面風格相似的文本文字,游戲整體的風格是連貫一致的,玩家對游戲的操作僅僅只需點擊或放大縮小,加上本次游戲規(guī)則采用傳統(tǒng)塔防的游戲機制,因此玩家能夠迅速掌握游戲要領,輕松便捷的暢游。綜上所述,本次設計在操作上可行。2.4總結(jié)本次塔防游戲的設計,在技術層面、經(jīng)濟層面以及操作層面三個層面上看,都具有高度可行性。Unity3D引擎給此次設計提供了技術層面的支持,C#語言是腳本功能運行的保障;單機小游戲的設計規(guī)模使得個人獨立開發(fā)成為可能,開發(fā)成本很低,經(jīng)濟上沒有太大問題;而簡單的操作和極簡的風格在如今電腦、智能機普及的當下掌握起來不過幾分鐘,經(jīng)典的塔防模式也降低了游戲門檻和學習成本。綜合以上論述表明,本次設計在基于Unity3D引擎下,使用C#腳本開發(fā)一款經(jīng)典塔防類的游戲,是可行的。3游戲概要設計3.1總體概述游戲題材:經(jīng)典塔防游戲游戲類別:策略類游戲游戲玩法:顏色不同的圓球形狀的敵人從地圖的藍色正方體中進入地圖,經(jīng)過預設的黑色道路行進,進入地圖的粉色正方體(即目的地),玩家需要在這些敵人行進的路線附近建造各種類型的防御塔,用以攻擊經(jīng)過的敵人,在敵人進入粉色正方體前將敵人擊殺。敵人有若干進攻波次,在每一波過后敵人都會變得更強,玩家也需要通過建造更多的防御塔或升級已有的防御塔來加強防御力。當進入粉色正方體的敵人到達一定數(shù)量后,游戲會失敗。要想通關,玩家需頂住敵人的進攻,直到最后一波敵人被殲滅。3.2游戲功能設計本設計的主要功能包括:游戲地圖與敵人的行進路線、各種各樣的敵人以及敵人的生成器、各種防御塔、資金的顯示以及各種特效。3.2.1地圖與路線游戲地圖的構成要素包括:可建造地塊、敵人的行進路線、敵人生成位置、敵人進攻目的地。圖3.1游戲場景圖此圖顯示的視角即為游戲內(nèi)攝像機的位置,其中,白色方格為可建造地塊,即防御塔建造的位置,黑色道路為敵人行進路線,藍色正方體為敵人生成器,游戲內(nèi)的敵人均從此處生成并以此為行進路線的起點,而紅色正方體即為敵人行進的終點,當敵人到達此處時,游戲宣布失敗。3.2.2敵人此次共設計了五種敵人,外形皆以圓球形狀,以不同顏色分為普通型(紅色)、速度型(橙色)、極速型(黃色)、加強型(綠色)、Boss(藍色)。敵人最重要的屬性,是敵人的血量、生成速度以及其行進速度。 圖3.2各種類型的敵人示意圖以普通型敵人為標準,速度型敵人在行進速度和生成速度上有較強的提升,但同時弱化了它的生命值;而極速型敵人則更進一步的作此改變,因此,極速型敵人是游戲里行進速度最快、生成位置最密集的敵人,同時也是游戲里最脆弱的敵人,選用攻速快傷害低的機槍塔能對其進行有效的打擊;而加強型敵人是敵人中的精英,在速度上只有較小的提升,但在血量上有極大的提升,與Boss不同的是,Boss只是單獨出現(xiàn),但加強型敵人是成群結(jié)對的,不過,其弱點于生成時間較慢,導致加強型敵人之間的間隔較大,陣型散亂,使用攻速慢傷害高的重炮塔,配合上能夠造成減速效果的激光塔是打敗加強型敵人的關鍵。Boss,游戲最后的敵人,打敗它是游戲通關的關鍵。Boss的最大的特點就是其無與倫比的血量,但其行進速度是敵人中最慢的,且只單一出現(xiàn),因此只需集中火力,盡量多的建造重炮塔配合激光塔,少建造機槍塔,盡可能加大對其造成的傷害。打敗Boss后,游戲宣布勝利。3.2.3防御塔此次設計中共有三種類型的防御塔,分別為機槍塔、重炮塔以及激光塔。防御塔的屬性有:使用的武器系統(tǒng)、攻擊傷害、攻擊頻率、子彈飛行速度、攻擊范圍、特殊效果。圖3.3機槍塔示意圖 圖3.4升級版機槍塔示意圖 圖3.5機槍塔購買圖標機槍塔是游戲中最廉價的防御塔,使用的武器系統(tǒng)是炮彈系統(tǒng),雖然傷害不高,但其攻擊頻率高、子彈飛行速度快的特點能夠有效對付移動迅速且血量低的敵人,而其廉價的特點能使其被大量建造,彌補其傷害低、攻擊范圍小的缺陷,將其放置在各個點位能對集群的敵人進行有效的攔截。升級版機槍塔在原基礎上大幅提升了其攻擊頻率,對攻擊傷害、攻擊范圍也有小幅的提升。 圖3.6重炮塔示意圖 圖3.7升級版重炮塔示意圖 圖3.8重炮塔購買圖標重炮塔是游戲中傷害最高、攻擊范圍最大的防御塔,使用的武器系統(tǒng)也是炮彈系統(tǒng),其巨額的攻擊傷害所付出的代價是其攻擊頻率的低下,巨大的炮彈飛行的速度也受到了影響,適合攻擊移動速度較慢、生命值較高且單獨行動或陣型間隔較大的敵人。升級版重炮塔在原基礎上大幅提升攻擊傷害和攻擊范圍,攻擊頻率不變。 圖3.9激光塔示意圖 圖3.10升級版激光塔示意圖 圖3.11激光塔示意圖激光塔是游戲中一種特殊的防御塔,它搭載了不同于機槍塔和重炮塔的武器系統(tǒng)——激光武器系統(tǒng),該武器最大的特點在于它造成傷害的方式不是瞬時的,而是持續(xù)性的,且能夠?qū)φ诠舻哪繕嗽斐蓽p速效果,適合對付單獨行動的或陣型間隔較大的敵人,不過,由于價格昂貴,且殺傷力較于重炮塔還是稍顯不足,不適合大量建造,只需在幾個關鍵路口建造即可,主要用于降低敵人的行進速度。升級版激光塔在原基礎上提升了攻擊傷害與攻擊范圍,著重增強其對敵人的減速能力。3.2.4武器系統(tǒng)在此次炮彈系統(tǒng)的設計中,共分為兩大武器系統(tǒng),分別是炮彈武器系統(tǒng)以及激光武器系統(tǒng)。 圖3.12重炮塔開火示意圖 圖3.13激光塔開火示意圖炮彈武器系統(tǒng)是瞬時傷害的攻擊系統(tǒng),有攻擊頻率的屬性,機槍塔與重炮塔皆搭載此攻擊系統(tǒng),是主要的武器系統(tǒng)。激光武器系統(tǒng)是持續(xù)傷害的攻擊系統(tǒng),專為激光塔而設計,采用激光射線代替子彈和炮彈,能對目標持續(xù)造成傷害,最大的特點是其擁有減速能力,提供戰(zhàn)術上的支持。3.2.5特效設計在特效設計方面,主要包括三大類:動畫類特效、粒子類特效、線渲染類特效。動畫類特效主要應用于游戲開始界面、玩家資金提示、防御塔升級面板、游戲結(jié)束界面等。粒子類特效主要應用于防御塔的建造、炮彈武器系統(tǒng)、擊殺敵人、升級和拆除防御塔等。線渲染類特效專為激光武器系統(tǒng)服務,是實現(xiàn)激光武器系統(tǒng)的構成要素。3.2.6各種UI此次設計的UI包括:游戲初始界面、游戲結(jié)束界面、升級面板、玩家資金面板、防御塔購買面板。圖3.14游戲開始界面示意圖圖3.15游戲內(nèi)場景示意圖圖3.16游戲結(jié)束界面示意圖

4游戲具體實現(xiàn)4.1程序?qū)崿F(xiàn)4.1.1建造管理模塊類名:BuildManager說明:控制游戲內(nèi)建造防御塔、升級防御塔、拆除防御塔相關的操作。方法:voidChangeMoney()、voidStart()、voidUpdate()、publicvoidOnLaserTurretSelected()、publicvoidOnMissileTurretSelected()、publicvoidOnStandarTurretSelected()、voidShowUpgradeUI()、IEnumeratorHideUpgradeUI()、publicvoidOnUpgradeButtonDown()、publicvoidOnDestroyButtonDown()。分析:voidChangeMoney()記錄了玩家資金的變化;voidStart()用于開啟與防御塔升級界面相關的狀態(tài)機;voidUpdate()用于控制防御塔的建造、升級、拆操作;publicvoidOnLaserTurretSelected()用于判斷激光塔是否被鼠標選擇;publicvoidOnMissileTurretSelected()用于判斷重炮塔是否被鼠標選擇;publicvoidOnStandarTurretSelected()用于判斷機槍塔是否被鼠標選擇;voidShowUpgradeUI()用于顯示防御塔的升級面板;IEnumeratorHideUpgradeUI()用攜程的方式來讀取升級面板的顯示與隱藏的變化并控制其隱藏;publicvoidOnUpgradeButtonDown()鼠標監(jiān)聽升級按鈕的點擊;publicvoidOnDestroyButtonDown()鼠標監(jiān)聽拆除按鈕的點擊。4.1.2游戲進程管理模塊類名:GameManager說明:控制游戲內(nèi)菜單、場景切換、游戲流程切換。方法:publicvoidAwake()、publicvoidWin()、publicvoidFailded()、publicvoidOnButtonReplay()、publicvoidOnButtonMenu()。分析:publicvoidAwake()控制游戲開始時的各種操作如啟動敵人生成器;publicvoidWin()控制游戲勝利時的UI顯示與文本;publicvoidFailded()控制游戲失敗時的UI顯示與文本;publicvoidOnButtonReplay()監(jiān)聽游戲結(jié)束時“重玩”按鈕是否被點擊;publicvoidOnButtonMenu()監(jiān)聽游戲結(jié)束時“菜單”按鈕是否被點擊。4.1.3敵人模塊類名:Enemy說明:記錄敵人各種屬性,包括行進行為、承受傷害以及死亡銷毀。方法:voidStart()、voidUpdate()、voidMove()、voidReachDestination()、voidOnDestroy()、publicvoidTakeDamage()、voidDie()。分析:voidStart()初始化敵人屬性、控制敵人開始從起點移動;voidUpdate()更新敵人行進狀態(tài);voidMove()控制敵人移動;voidReachDestination()用于銷毀到達終點的敵人,同時宣布游戲失敗;publicvoidTakeDamage()控制記錄敵人承受的傷害,并作出承傷行為;voidDie()敵人血量為0時銷毀敵人。4.1.4敵人生成器模塊類名:EnemySpawner說明:控制敵人在起點生成、每一波次的生成時間、生成的敵人類型和數(shù)量。方法:voidStart()、publicvoidStop()、IEnumeratorSpawnEnemy()。分析:voidStart()用于啟動敵人生成器;publicvoidStop()停止敵人的生成(當游戲失敗時);IEnumeratorSpawnEnemy()用攜程控制每一波生成的敵人,判斷條件以作出是否進行下一波敵人的進攻,敵人全部被消滅時宣布游戲勝利。4.1.5游戲菜單模塊類名:GameMenu說明:控制游戲的菜單、場景加載以及其相關事件。方法:publicvoidOnstartGame()、publicvoidOnExitGame()。分析:publicvoidOnstartGame()用于加載游戲開始時進入游戲內(nèi)的場景;publicvoidOnExitGame()控制游戲暫停與退出。4.1.6可建造地塊模塊類名:MapCube說明:控制游戲的菜單、場景加載以及其相關事件。方法:voidStart()、publicvoidBuildTurret()、publicvoidUpgradeTurret()、publicvoidDestroyTurret()、voidOnMouseOver()、voidOnMouseExit()。 分析:voidStart()初始化地塊;publicvoidBuildTurret()將建造防御塔時的特效實例化并控制其顯示時間;publicvoidUpgradeTurret()用于判斷當前地塊能否升級防御塔,并控制其升級行為和相關特效;publicvoidDestroyTurret()用于判斷當前地塊能否拆除防御塔,并控制其拆除行為和相關特效;voidOnMouseOver()監(jiān)聽鼠標懸停于地塊上;voidOnMouseExit()監(jiān)聽鼠標懸停離開地塊。4.1.7防御塔模塊類名:StandardTurret說明:控制防御塔的攻擊行為。方法:voidOnTriggerEnter()、voidOnTriggerExit()、voidStart()、voidUpdate()、voidAttack()、voidUpdateEnemies()。 分析:voidOnTriggerEnter()用于判斷敵人是否進入防御塔的射程之內(nèi);voidOnTriggerExit()用于判斷敵人是否離開防御塔的射程之內(nèi);voidStart()用于啟動防御塔攻擊計時器;voidUpdate()控制防御塔炮口的朝向,發(fā)動攻擊指令,以及決定使用何種武器系統(tǒng)進行攻擊;voidAttack()記錄攻擊指令;voidUpdateEnemies()更新防御塔發(fā)現(xiàn)的敵人數(shù)量。4.1.8防御塔數(shù)據(jù)模塊類名:TurretData說明:記錄防御塔的類型和各項屬性。方法:publicenumTurretType。 分析:publicenumTurretType用于記錄激光塔、重炮塔、機槍塔的類型。4.1.9游戲視角控制模塊類名:ViewController說明:控制顯示游戲場景的攝像機。方法:voidUpdate()。 分析:voidUpdate()控制鍵盤上“A”、“W”、“S”、“D”四個鍵對應的鏡頭移動,賦予鼠標滾輪放大縮小的功能。4.1.10敵人進攻波次模塊類名:Wave說明:記錄每波敵人的類型、數(shù)量和生成速度。方法:無,非主類。 分析:記錄每波敵人的類型、數(shù)量和生成速度。4.1.8敵人行進路線模塊類名:WayPoints說明:控制防御塔的攻擊行為。方法:voidAwake()。 分析:voidAwake()用于獲取路徑點,對每一段行進路線進行賦值操作。5測試5.1交互界面測試:游戲運行,顯示游戲主界面,如下圖。圖5.1游戲開始界面測試圖測試結(jié)果:游戲主界面加載成功。測試:點擊“START”按鈕開始游戲,加載游戲場景。圖5.2加載游戲場景測試圖測試結(jié)果:游戲場景加載成功,“START”按鈕交互成功。測試:點擊“EXIT”按鈕退出游戲。測試結(jié)果:成功退出游戲。5.2游戲過程測試:敵人生成器生成敵人,敵人開始沿進攻路線從起點出發(fā)。圖5.3敵人生成及行進測試圖測試結(jié)果:敵人生成器成功生成敵人,敵人成功按路線行進。測試:防御塔建造并攻擊敵人。圖5.4防御塔建造并攻擊敵人測試圖測試結(jié)果:防御塔成功建造并扣除相應的玩家資金,成功攻擊范圍內(nèi)的敵人。測試:防御塔升級及拆除。圖5.5防御塔升級及拆除測試圖測試結(jié)果:防御塔成功升級并扣除玩家資金;防御塔拆除成功。測試:游戲視角控制。測試結(jié)果:放大縮小及平移皆成功。測試:游戲勝利宣布。圖5.6游戲勝利測試圖測試結(jié)果:成功。測試:游戲失敗宣布。圖5.7游戲失敗測試圖測試結(jié)果:成功。5.3測試總結(jié)本次測試的主要部分,如交互界面(包括游戲主菜單、游戲場景加載、升級面板、玩家資金)以及游戲過程(從敵人生成并行進到游戲結(jié)束的所有過程)測試都沒問題,所有流程、功能正常運行。6總結(jié)這此的畢業(yè)設計是大學階段的最后一個大作業(yè)。對我來說,這更像是在完成這項任務的過程中對我四年大學生涯的一種成果查驗。在這之前,我對unity3d引擎的理解比較淺,這次的設計讓我更加熟練去使用unity3d,對這些方面的認識也比以前更加深入。對于我來說,這次一個人完成整個游戲確實是很大的挑戰(zhàn)。很多的功能、實現(xiàn)我在一開始都沒有很好的考慮到,在制作的過程中發(fā)現(xiàn)很多的問題,比如說特效、動畫的制作,以及攜程的使用等等,常常為制作過程一個小小的BUG而費時很久,也由于是第一次獨立開發(fā)項目,在整個設計的過程中對于開發(fā)進度的掌握還是太過稚嫩,導致許多創(chuàng)意只能停留在計劃上,而根本沒有去實施,過程中加強對unity3d的使用的同時,也學習C#編程語言,目前,Unity引擎的API有好幾千個,并且隨著Unity版本的更新,API的數(shù)量還會不斷增長。對API的熟悉程度直接影響著程序的開發(fā)效率,熟悉API也成了新手進階的必經(jīng)之路。REF_Ref5244\r\h[3]為此查閱了很多的資料,也得益于老師不厭其煩的幫助。其中讓我覺得受益最大的地方在于,我對游戲開發(fā),或者說獨立游戲開發(fā)的過程有了一個最初級卻比較清晰的了解。我在這個游戲開發(fā)的過程中得到了很大的成長,很大程度的提高了自己的開發(fā)能力。但是在這過程中對于時間的掌控還是沒有做到十分的充分合理,這一點我會牢牢記在心里好好改進。

參考文獻王洪源,Unity3D人工智能編程精粹[M].清華大學出版社,2014.11Unity5.X從入門到精通[M].中國鐵道出版社,2016.1陳泉宏,UnityAPI解析[M].北京:人民郵電出版社,2014張冬旭,C#編程從基礎到應用[M].北京:清華大學出版社,2014張帆,Unity3D游戲開發(fā)基礎[M].浙江工商大學出版社,2013.8穆海明,劉盼,劉華興.基于Unity的游戲開發(fā)[J].通訊世界,2016.8宣雨松.Unity3D游戲開發(fā)[M].北京:人民郵電出版社,2012金璽曾.Unity3D手機游戲開發(fā)[M].北京:清華大學出版社,2013朱少民,軟件測試方法和技術第2版[M].北京:清華大學出版社,2010劉俊,郭祖.基于Unity3D的塔防游戲的設計與實現(xiàn)[J].科技傳播,2015.5

謝辭為時一個學期的畢業(yè)設計即將結(jié)束了,這也意味者我在北京理工大學珠海學院的大學生涯也即將結(jié)束。在畢業(yè)設計這段時間里,我得到了很大的自身提高,其中包含了對游戲設計流程的理解、對Unity3d游戲引擎的使用、對C#編程語言的學習以及對有關這方面書籍的認識等等,這些都得益于老師和同學的大力幫助。附錄程序源代碼BuildManager建造管理模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.EventSystems;usingUnityEngine.UI;publicclassBuildManager:MonoBehaviour{//各種類型炮塔的數(shù)據(jù);publicTurretDatalaserTurretData;//激光炮臺數(shù)據(jù);publicTurretDatamissileTurretData;//導彈炮塔數(shù)據(jù);publicTurretDatastandardTurretData;//機槍炮塔數(shù)據(jù);privateTurretDataselectedTurretData;//當前選擇的炮塔的數(shù)據(jù);privateMapCubeselectedMapCube;//當前選擇的場景中的地塊;publicTextmoneyText;//資金的文本;publicGameObjectupgradeCanvas;//升級的UI;publicButtonbuttonUpgrade;publicAnimatormoneyAnimator;//資金的動畫;privateAnimatorupgradeCanvasAnimator;//升級UI的狀態(tài)機;privateintmoney=10000;//玩家擁有的資金;//玩家擁有的資金的變化;voidChangeMoney(intchange=0){money+=change;moneyText.text="擁有資金:¥"+money;}voidStart(){upgradeCanvasAnimator=upgradeCanvas.GetComponent<Animator>();}voidUpdate(){if(Input.GetMouseButtonDown(0))//判斷鼠標是否按下;{if(EventSystem.current.IsPointerOverGameObject()==false)//判斷鼠標按下的的位置是否在UI上;{//新炮臺的建造;Rayray=Camera.main.ScreenPointToRay(Input.mousePosition);//將鼠標點的位置轉(zhuǎn)化為射線;RaycastHithit;//射線預檢測;boolisCollider=Physics.Raycast(ray,outhit,1000,LayerMask.GetMask("MapCube"));//射線碰撞檢測;//判斷是否發(fā)碰撞;if(isCollider){MapCubemapCube=hit.collider.GetComponent<MapCube>();//得到了點擊的mapCube;if(selectedTurretData!=null&&mapCube.turretGo==null){//可以建造;if(money>=selectedTurretData.cost){//錢足夠;ChangeMoney(-selectedTurretData.cost);mapCube.BuildTurret(selectedTurretData);}else{//錢不夠;moneyAnimator.SetTrigger("Flicker");}}elseif(mapCube.turretGo!=null){//TODO升級處理;//if(mapCube.isUpgraded)//{////如果已升級,則禁用升級;//ShowUpgradeUI(mapCube.transform.position,true);//}//else//{////如果未升級,則不禁用升級;//ShowUpgradeUI(mapCube.transform.position,false);//}//以上代碼可簡化為如下代碼://ShowUpgradeUI(mapCube.transform.position,mapCube.isUpgraded);//判斷當前地塊炮臺是否為選擇的炮臺,并且升級UI是否已經(jīng)顯示;if(mapCube==selectedMapCube&&upgradeCanvas.activeInHierarchy){StartCoroutine(HideUpgradeUI());}else{ShowUpgradeUI(mapCube.transform.position,mapCube.isUpgraded);}selectedMapCube=mapCube;//更新所選擇的地塊為當前地塊;}}}}}publicvoidOnLaserTurretSelected(boolisOn){if(isOn){selectedTurretData=laserTurretData;//激光塔被選擇;}}publicvoidOnMissileTurretSelected(boolisOn){if(isOn){selectedTurretData=missileTurretData;//導彈塔被選擇;}}publicvoidOnStandarTurretSelected(boolisOn){if(isOn){selectedTurretData=standardTurretData;//機槍塔被選擇;}}//顯示升級UI;voidShowUpgradeUI(Vector3pos,boolisDisableUpgrade=false)//讀取即將升級的炮塔位置,升級是否禁用設置初始值為不可用;{StopCoroutine("HideUpgradeUI");//暫停攜程;upgradeCanvas.SetActive(false);//初始化upgradeCanvas.SetActive(true);//升級UI的顯示;upgradeCanvas.transform.position=pos;buttonUeractable=!isDisableUpgrade;//升級是否禁用,如果禁用,則不顯示升級UI;}//隱藏升級UI;IEnumeratorHideUpgradeUI(){upgradeCanvasAnimator.SetTrigger("Hide");//upgradeCanvas.SetActive(false);//隱藏UI的顯示;yieldreturnnewWaitForSeconds(0.8f);upgradeCanvas.SetActive(false);}publicvoidOnUpgradeButtonDown(){if(money>=selectedMapCube.turretData.costUpgraded){ChangeMoney(-selectedMapCube.turretData.costUpgraded);selectedMapCube.UpgradeTurret();}else{moneyAnimator.SetTrigger("Flicker");}StartCoroutine(HideUpgradeUI());}publicvoidOnDestroyButtonDown(){selectedMapCube.DestroyTurret();StartCoroutine(HideUpgradeUI());}}GameManager游戲進程管理模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;usingUnityEngine.SceneManagement;publicclassGameManager:MonoBehaviour{publicGameObjectendUI;//游戲結(jié)束畫面;publicTextendMessage;//游戲結(jié)束時顯示的文本;publicstaticGameManagerInstance;publicEnemySpawnerenemySpawner;publicvoidAwake(){Instance=this;enemySpawner=GetComponent<EnemySpawner>();}publicvoidWin(){endUI.SetActive(true);endMessage.text="VICTORY";} publicvoidFailded(){enemySpawner.Stop();endUI.SetActive(true);endMessage.text="GAMEOVER";}publicvoidOnButtonReplay(){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);}publicvoidOnButtonMenu(){SceneManager.LoadScene(0);}}Enemy敵人模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassEnemy:MonoBehaviour{privateTransform[]positions;//子路徑點;privateintindex=0;//子路徑點索引數(shù)字;publicGameObjectexplosionEffect;//爆炸效果節(jié)點;privateSliderhpSlider;//敵人的血條顯示UI;privatefloattotalHp;//敵人的生命值上限;publicfloatspeed=10;//移動速度預設值;publicfloathp=100;//敵人的實時生命值; //Usethisforinitialization voidStart(){positions=WayPoints.positions;//從WayPoints腳本中獲取子路徑點;totalHp=hp;hpSlider=GetComponentInChildren<Slider>();//獲取所有類型的敵人的血條顯示UI; } //Updateiscalledonceperframe voidUpdate(){Move(); }voidMove()//構建敵人移動的方法;{//判斷是否還有下一個子路徑;if(index>positions.Length-1){return;//若沒有則返回;}//設置移動路徑與速度,敵人參考系本身就是世界坐標系,因此無需重新設置參考系;transform.Translate((positions[index].position-transform.position).normalized*Time.deltaTime*speed);//到達目標子路徑點后搜索下一子路徑點;if(Vector3.Distance(positions[index].position,transform.position)<0.2f){index++;//索引值+1;}//判斷敵人是否到達目的地;if(index>positions.Length-1){ReachDestination();//調(diào)用銷毀方法;}}voidReachDestination()//銷毀敵人;{GameManager.Instance.Failded();GameObject.Destroy(this.gameObject);//銷毀當前敵人;}voidOnDestroy()//記錄已被銷毀的敵人;{EnemySpawner.EnemyAliveCount--;//敵人存活數(shù)量-1;}publicvoidTakeDamage(floatdamage){//先判斷敵人是否還能繼續(xù)承受傷害;if(hp<=0){return;}//敵人承受傷害;hp-=damage;hpSlider.value=(float)hp/totalHp;//敵人生命值的百分比;//判斷敵人承受傷害后是否死亡;if(hp<=0){Die();//調(diào)用死亡方法;}}//死亡方法;voidDie(){GameObjecteffect=GameObject.Instantiate(explosionEffect,transform.position,transform.rotation);//敵人的死亡特效;Destroy(effect,1);Destroy(this.gameObject);}}EnemySpawner敵人生成器模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassEnemySpawner:MonoBehaviour{publicWave[]waves;//敵人的進攻波數(shù);publicTransformSTART;//敵人初始位置;publicfloatwaveRate=0.2f;//每一波的間隔;publicstaticintEnemyAliveCount=0;//敵人存活數(shù)量;privateCoroutinecoroutine;voidStart(){coroutine=StartCoroutine(SpawnEnemy());//啟動敵人生成器;}publicvoidStop(){StopCoroutine(coroutine);}//通過攜程來創(chuàng)建敵人生成器;IEnumeratorSpawnEnemy(){//設置每一波敵人;foreach(Wavewaveinwaves){//每一波敵人的數(shù)量和位置;for(inti=0;i<wave.count;i++){GameObject.Instantiate(wave.enemyPrefab,START.position,Quaternion.identity);//生成敵人;EnemyAliveCount++;//敵人存活數(shù)量+1;//判斷當前生成的敵人是否為最后一個,依次生成當前波數(shù)的所有敵人;if(i!=wave.count-1){yieldreturnnewWaitForSeconds(wave.rate);//暫停生成間隔時間,生成當前波數(shù)的下一個敵人;}}//當有敵人存活時,暫停下一波的生成;while(EnemyAliveCount>0){yieldreturn0;//暫停;}yieldreturnnewWaitForSeconds(waveRate);//暫停每波的間隔時間,開始下一波;}while(EnemyAliveCount>0){yieldreturn0;}GameManager.Instance.Win();}}GameMenu游戲菜單模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.SceneManagement;publicclassGameMenu:MonoBehaviour{ publicvoidOnstartGame(){SceneManager.LoadScene(1);}publicvoidOnExitGame(){#ifUNITY_EDITORUnityEditor.EditorApplication.isPlaying=false;#elseApplication.Quit();#endif}}MapCube可建造地塊模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.EventSystems;publicclassMapCube:MonoBehaviour{[HideInInspector]publicGameObjectturretGo;//保存地塊當前已有的炮臺;[HideInInspector]publicTurretDataturretData;[HideInInspector]publicboolisUpgraded=false;//默認炮臺還未升級過;publicGameObjectbuildEffect;//建造特效;privateRendererrender;voidStart(){render=GetComponent<Renderer>();}publicvoidBuildTurret(TurretDataturretData){//特效實例化;this.turretData=turretData;isUpgraded=false;//炮臺還未升級過;//turretGo=Instantiate(turretData.turretPrefab,transform.position,Quaternion.identity);turretGo=GameObject.Instantiate(turretData.turretPrefab,transform.position,Quaternion.identity);GameObjecteffect=GameObject.Instantiate(buildEffect,transform.position,Quaternion.identity);Destroy(effect,1.5f);//特效持續(xù)一秒后銷毀;}publicvoidUpgradeTurret()//防御塔升級;{if(isUpgraded==true){return;}Destroy(turretGo);isUpgraded=true;turretGo=GameObject.Instantiate(turretData.turretUpgradedPrefab,transform.position,Quaternion.identity);GameObjecteffect=GameObject.Instantiate(buildEffect,transform.position,Quaternion.identity);Destroy(effect,1.5f);//特效持續(xù)一秒后銷毀;}publicvoidDestroyTurret(){Destroy(turretGo);isUpgraded=false;turretGo=null;turretData=null;GameObjecteffect=GameObject.Instantiate(buildEffect,transform.position,Quaternion.identity);Destroy(effect,1.5f);//特效持續(xù)一秒后銷毀;}//鼠標懸停方法;voidOnMouseOver(){if(turretGo==null&&EventSystem.current.IsPointerOverGameObject()==false){render.material.color=Color.gray;}}//鼠標懸停離開方法;voidOnMouseExit(){render.material.color=Color.white;}}StandardBullet武器模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassStandardBullet:MonoBehaviour{publicintdamage=10;//子彈傷害;publicfloatspeed=100;//子彈飛行速度;publicGameObjectexplosionEffectPrefab;//爆炸效果;privateTransformtarget;//子彈攻擊目標;//子彈當前攻擊的目標;publicvoidSetTarget(Transform_target){this.target=_target;}//更新目標位置,子彈攻擊目標;voidUpdate(){//如果子彈追擊途中失去目標;if(target==null){Die();//子彈自行銷毀;return;//不在向下執(zhí)行;}transform.LookAt(target.position);transform.Translate(Vector3.forward*speed*Time.deltaTime);}voidOnTriggerEnter(Collidercol){if(col.tag=="Enemy"){col.GetComponent<Enemy>().TakeDamage(damage);Die();}}voidDie(){GameObjecteffect=GameObject.Instantiate(explosionEffectPrefab,transform.position,transform.rotation);Destroy(this.gameObject);//銷毀子彈;Destroy(effect,0.2f);//銷毀特效;}}StandardTurret防御塔模塊usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassStandardTurret:MonoBehaviour{privateList<GameObject>enemies=newList<GameObject>(); voidOnTriggerEnter(Collidercol){if(col.tag=="Enemy"){enemies.Add(col.gameObject);}}voidOnTriggerExit(Collidercol){if(col.tag=="Enemy"){enemies.Remove(col.gameObject);}}publicfloatattackRateTime=0.1f;//攻擊冷卻;privatefloattimer=0;//計時器;publicGameObjectbulletPrefab;//子彈;publicTransformfirePosition;//開火口位置;publicTransformhead;//炮塔頂部;publicbooluseLaser=false;//是否使用激光,默認不使用;publicfloatdamageRate=30;publicLineRendererlaserRenderer;//激光系統(tǒng);publicGameObjectlaserEffect;//調(diào)用激光特效;voidStart(){timer=attackRateTime;//炮塔在遇到敵人前就已準備就緒,無需再等待冷卻;}voidUpdate(){//調(diào)轉(zhuǎn)炮口方向;if(enemies.Count>0&&enemies[0]!=null){Vector3targetPosition=enemies[0].transform.position;//讀取當前敵人的位置;targetPosition.y=head.position.y;//將敵人的垂直方向位置與炮塔頂部保持一致;head.LookAt(targetPosition);//炮塔頂部的炮口指向當前敵人;}if(useLaser==false){//計時

溫馨提示

  • 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

提交評論