版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Unity3D的多人在線射擊游戲設(shè)計(jì)與實(shí)現(xiàn)MultiplayerOnlineshootingGamedevelopmentwithUnity3D內(nèi)容摘要隨著生活水平與科技的發(fā)展,游戲已經(jīng)成為現(xiàn)代人緩解壓力的一大利器,使用好這一利器,有利于鍛煉自己的反應(yīng)能力拓寬自己的朋友圈等等,而市面上游戲引擎五花八門,其中最吸引眼球的是Unity引擎,它憑借三大優(yōu)勢,孕育了成百上千款高品質(zhì)游戲,而這三大優(yōu)勢為:第一,Unity引擎功能豐富,插件資源龐大,大大地減少了開發(fā)者的對游戲的開發(fā)時(shí)間;第二,它的可視化界面對開發(fā)新手老手都十分友好,容易上手;第三,支持跨平臺的開發(fā)。本文將構(gòu)思并實(shí)現(xiàn)一個(gè)基于Unity引擎技術(shù)的多人在線射擊游戲,并將其實(shí)現(xiàn)。之所以會選擇這個(gè)課題,是因?yàn)槲艺J(rèn)為射擊游戲在過去,現(xiàn)在,未來都是屬于不會沒落的游戲類型,在世面上,各種射擊游戲讓人眼花繚亂,反恐精英、穿越火線、絕地逃生、守望先鋒等游戲都深受人們喜歡,而聯(lián)機(jī)游戲,既可以讓玩家感受游戲內(nèi)容,還可以與小伙伴一起享受開黑的樂趣,在開發(fā)過程中,我使用了Unity中一套稱為Mutiplayer的網(wǎng)絡(luò)體系結(jié)構(gòu),以局域網(wǎng)的形式進(jìn)行聯(lián)機(jī),是一種基于UDP協(xié)議的高性能傳輸層,包含以NetworkManager為核心的管理工具,我可以在腳本中進(jìn)行網(wǎng)絡(luò)開發(fā),在開發(fā)過程中,這個(gè)網(wǎng)絡(luò)架構(gòu)非常有效地降低了程序在時(shí)間上的復(fù)雜度,提高了游戲運(yùn)行時(shí)的實(shí)效性,解決了開發(fā)聯(lián)機(jī)游戲過程中常會發(fā)生的同步問題。關(guān)鍵詞:Unity3D;射擊類游戲;多人聯(lián)機(jī);功能實(shí)現(xiàn)
AbstractWiththedevelopmentoflivingstandardsandtechnology,gameshavebecomeagreatweaponformodernpeopletorelievestress.Theuseofthisweaponisgoodforexercisingtheirresponsivenessandwideningtheircircleoffriends.Thegameenginesonthemarketarediverse.Oneofthemosteye-catchingUnityengines,ithasnurturedhundredsofthousandsofhigh-qualitygamesbyvirtueofthreeadvantages,andthesethreeadvantagesare:First,theUnityengineisrichinfunctionsandtheplug-inresourcesarehuge,greatlyreducingthenumberofdevelopersThedevelopmenttimeofthegame;second,itsvisualinterfaceisveryfriendlytonovicesandveterans,easytogetstarted;third,one-timedevelopmentsupportsmulti-platformdevelopment.
ThisarticlewillconceiveandimplementamultiplayeronlineshootinggamebasedonUnityenginetechnologyandimplementit.IuseanetworkarchitecturecalledMutiplayerinUnity,whichcontainsNetworkManagerasthecoremanagementtool.Developerscanperformnetworkdevelopmentinscripts,forexample:NetworkIdentitycanbeusedfornon-playergameobjects,aseriesofcomponentsForexample,NetworkTransformandNetworkAnimatorcanbeusedforassistance.ClientRpc,SynCarandotherpackagesareverycomprehensive.Secondly,intermsofhowtomakethegamerun,thisnetworkarchitectureeffectivelyreducesthecomplexityoftheprogramintime,improvestheeffectivenessofthegamewhenitruns,andgreatlysolvesthisproblem.Keywords:Unity3D;shootinggame;Multiplayer;Functionrealization
目錄第一章 緒論 緒論選題的目的和意義隨著生活水平與科技的發(fā)展,游戲已經(jīng)成為現(xiàn)代人緩解壓力的一大利器,使用好這一利器,有利于鍛煉自己的反應(yīng)能力,拓寬自己的朋友圈。所以當(dāng)人們對游戲要求提高,開發(fā)游戲的要求也隨之變高。市面上開發(fā)游戲的引擎五花八門,根據(jù)GameTracker數(shù)據(jù)排行榜顯示,Unity3d與Cocos2D系列引擎,成為全球最主流的兩大第三方引擎的供應(yīng)商,其中最吸引眼球的Unity引擎,它憑借三大優(yōu)勢,孕育了成百上千款高品質(zhì)游戲,根據(jù)有效數(shù)據(jù)顯示,Unity用戶超過330萬人,每月活躍用戶高大70萬,市場比例接近百分之四十五,它的優(yōu)勢分為三部分,第一,Unity引擎功能豐富,插件資源龐大,大大的減少了開發(fā)者所需的對游戲的開發(fā)時(shí)間;第二,它的可視化界面對開發(fā)新手老手都十分友好,即便是不會編程的人也能快速適應(yīng)并上手;第三,高度的可跨越平臺性,減少了為了適應(yīng)平臺所投入的人力物力資源,作為開發(fā)者來說,不管是哪個(gè)引擎,都必須為愛好者提供交流的平臺,盡量給開發(fā)者自己的空間,可以提供豐富的開源組件,也能提供開發(fā)者自行設(shè)計(jì)編輯器的組件。研究現(xiàn)狀中國人口基數(shù)大,游戲的市場需求大,玩游戲的人口基數(shù)大,但大多數(shù)人都圍繞著熱門游戲玩,所以熱門游戲就占據(jù)了游戲市場中較大的份額,而熱門游戲中,例如絕地求生(TPS類)和英雄聯(lián)盟(MOBA類)就屬于國內(nèi)熱門游戲,已經(jīng)變成了大家交流的一個(gè)媒介。游戲除了讓人們緩解生活帶來的壓力外,還能以此為話題進(jìn)行溝通交流,而游戲市場也是圍繞著這兩大類去更新玩法,給人帶來新鮮的東西,吸引別人進(jìn)行游戲,本文就TPS類游戲展開設(shè)計(jì)開發(fā),第三人稱射擊游戲,也就是我們說的TPS游戲類型,玩家可以看到自己的角色進(jìn)行行走射擊等操作,即為TPS游戲,該類游戲收獲了國內(nèi)外許多玩家的喜愛。相對于第一人稱游戲的緊張感和操作感,TPS游戲往往更加有策略性和操作性,玩家通過第三視角全方位的進(jìn)行掌握局勢,通過擊殺大量敵人產(chǎn)生刺激感、成就感,從而獲得游戲體驗(yàn)。研究內(nèi)容從最初的小想法到寫需求分析、游戲文檔,到分析游戲并進(jìn)行最終開發(fā)測試,閱讀了許多Unity專業(yè)知識書籍以及許多基于Unity3D技術(shù)的開發(fā)者論壇博客,設(shè)計(jì)并實(shí)現(xiàn)了多人在線射擊游戲。首先,為了實(shí)現(xiàn)多人聯(lián)機(jī),我用的是UnityNetworking網(wǎng)絡(luò)技術(shù)?;赨DP的高性能傳輸層是他最大的特點(diǎn),可以支持所有游戲類型,底層通過LLPI進(jìn)行全面控制,在面臨如何改善游戲的網(wǎng)絡(luò)同步問題上,我查閱了非常多的資料,解決了游戲運(yùn)行時(shí)的服務(wù)器端與客戶端的實(shí)效性問題,該游戲在保證運(yùn)行效果的同時(shí),可以實(shí)現(xiàn)客戶端與服務(wù)器的同步,具有設(shè)備要求低,跨平臺性能好,運(yùn)行流暢穩(wěn)定的特點(diǎn),其次,為了提高游戲體驗(yàn),使用TextMeshpro字體組件,有效地豐富玩家的視覺效果,還通過NavMeshAgent組件,用來實(shí)現(xiàn)角色進(jìn)行尋路導(dǎo)航的功能開發(fā),在開發(fā)過程中根據(jù)游戲功能進(jìn)行邏輯推理,實(shí)現(xiàn)功能后測試中調(diào)整游戲數(shù)值參數(shù),使游戲更加完善。章節(jié)安排本論文分為七章,結(jié)構(gòu)安排如下:第一章:緒論,將會從本課題研究的目的及意義出發(fā),講述研究現(xiàn)狀與研究課題。第二章:介紹開發(fā)環(huán)境和Unity引擎、還有其他涉及到本次開發(fā)的插件和軟件。第三章:介紹本次游戲開發(fā)在前期的需求設(shè)計(jì)和構(gòu)想,包括于設(shè)定的游戲背景和游戲玩法規(guī)則,考慮該游戲需要擁有的功能和如何實(shí)現(xiàn)。第四章:介紹游戲的開發(fā)階段,從功能出發(fā),講述如何編寫腳本實(shí)現(xiàn),包括使用Unity中一套稱為Mutiplayer的網(wǎng)絡(luò)體系結(jié)構(gòu),以NetworkManager為核心的管理工具,從創(chuàng)建人物、敵人角色,編輯控制腳本,角色的血條控制、子彈的形成、計(jì)數(shù)器的邏輯,聯(lián)網(wǎng)的代碼邏輯,服務(wù)器端和客戶端之間的同步問題等。第五章:場景、UI、音效、燈光等的設(shè)計(jì)與實(shí)現(xiàn),從尋找合適的模型到,進(jìn)行搭建場景,對界面UI的設(shè)計(jì)、合適的游戲音效和背景音樂、添加燈光渲染氣氛。第六章:游戲完成后,對游戲進(jìn)行多次的測試,包括界面測試、功能測試,打包封裝。第七章:結(jié)論和感想,作為論文最后一章,對本次畢業(yè)設(shè)計(jì)開發(fā)中的總結(jié),包括學(xué)到的知識,開發(fā)中的感想。開發(fā)工具介紹Unity引擎Unity引擎來源Unity擁有著交互舒適的操作界面,讓開發(fā)者能夠快速上手[4],Scene場景窗口是開發(fā)者最熟悉的部分,你可以在這里進(jìn)行大膽創(chuàng)作,例如攝影機(jī)、光源、模型、材質(zhì)、粒子系統(tǒng)、天空盒等,你可以在這里對你的游戲預(yù)制體進(jìn)行編輯,包括不限于選擇物體、旋轉(zhuǎn)物體、移動物體、縮放物體;Game游戲窗口,這個(gè)窗口主要用來呈現(xiàn)出完整的動畫效果,不能進(jìn)行編輯,用來渲染Scene中的動畫;如果你想知道你正在編輯的對象的具體數(shù)據(jù),你對應(yīng)在Inspector編輯窗口查找,包括不限于名字、標(biāo)簽坐標(biāo)、角度、大小、身上的組件、腳本等各種屬性信息;Hierarchy清單窗口,陳列所有Scene中的預(yù)制體;Project項(xiàng)目窗口,你的所有模型素材、組件、腳本等都在這。Unity引擎的特點(diǎn)Unity具備著高效、高度優(yōu)化、高度集成等優(yōu)點(diǎn)。Unity引擎的優(yōu)勢第一,Unity引擎功能齊全,插件資源龐大,大大縮短了開發(fā)時(shí)間,Unity引擎在開發(fā)上,為開發(fā)人員提供了可視化工具和3D補(bǔ)償引擎;在腳本上,有著多樣的語言環(huán)境,還有著非常龐大的IDE社區(qū),在用戶體驗(yàn)上,提供了嚴(yán)謹(jǐn)?shù)南到y(tǒng)用于處理項(xiàng)目,給合作開發(fā)的團(tuán)隊(duì)提供了版本管理,只要用過這個(gè)引擎的人都會知道Assetstore,這個(gè)是他們公司自己所經(jīng)營的,包含著超過三千種工具、組件。為后續(xù)的開發(fā)工作提供了非常大的便利,特別注意的是,里面的免費(fèi)產(chǎn)品的質(zhì)量也及其高。擁有高度集成的特點(diǎn),帶有粒子、物理、簡單模型系統(tǒng),調(diào)用方便,全程可視化調(diào)整。第二,所謂所見即所得,即便是不會編程的人也能快速適應(yīng)并上手,例如說開發(fā)時(shí)你并不需要對物理了解得多深,引擎的物理系統(tǒng)已經(jīng)接近完善了;當(dāng)你想有碰撞檢測時(shí),你不需要自行編輯代碼,你只需要通過組件和鼠標(biāo),就可以實(shí)現(xiàn)自己想要的效果;當(dāng)你希望你的人物可以進(jìn)行導(dǎo)航尋路,敵人可以自動巡邏,都可以用unity里面強(qiáng)大的組件進(jìn)行設(shè)計(jì)嗎,雖然不足與3dmax相比專業(yè),但是unity進(jìn)行初步場景設(shè)計(jì)也是綽綽有余的,包括場景的烘焙,渲染,制作粒子效果,無論是哪個(gè)單拿出來都屬于比較有技術(shù)性的模塊功能,但在該引擎中,你只需要下載幾個(gè)組件,進(jìn)行操作設(shè)置就能實(shí)現(xiàn)大部分你想要的功能,這樣也是在減少開發(fā)游戲的資金、資源,降低開發(fā)游戲的難度,縮短開發(fā)游戲的時(shí)長。而官方也提供了非常詳細(xì)的文檔說明,并且在18年版本之后新增了中文語言,方便我們進(jìn)行開發(fā)游戲。第三,高度的可跨越平臺性,減少了為了適應(yīng)平臺所投入的人力物力資源。該引擎在常見的Win、Linux和Mac系統(tǒng)上都可以進(jìn)行開發(fā),開發(fā)的游戲可以發(fā)布到對應(yīng)的平臺。甚至你也可以通過他發(fā)布網(wǎng)頁游戲,支持常用系統(tǒng)的網(wǎng)頁瀏覽。它的\t"/item/Unity3D/_blank"網(wǎng)頁播放器也被Mac所支持。Unity引擎重點(diǎn)常用函數(shù)介紹表2-1函數(shù)表函數(shù)名內(nèi)容Update當(dāng)MonoBehaviour啟用時(shí),其Update在每一幀被調(diào)用。LateUpdate當(dāng)Behaviour啟用時(shí),其LateUpdate在每一幀被調(diào)用FixedUpdate當(dāng)MonoBehaviour啟用時(shí),其FixedUpdate在每一幀被調(diào)用,常用與物理引擎的調(diào)用,以及需要固定時(shí)間更新的函數(shù)Awake一個(gè)初始化函數(shù),當(dāng)一個(gè)腳本勢力被載入時(shí),Awake被調(diào)用,一般用于創(chuàng)建變量。State一個(gè)初始化函數(shù),僅在Update函數(shù)第一次被調(diào)用前調(diào)用,一般用于富裕變量值。Reset重置與默認(rèn)值。OnTriggerEnterCollider進(jìn)入trigger時(shí)調(diào)用OnTriggerEnter,一般用于判定物體碰撞到角色。OnTriggerExitCollider停止觸發(fā)trigger時(shí)調(diào)用OnTriggerExit。OnTriggerStay當(dāng)碰撞體接觸觸發(fā)器時(shí),OnTriggerStay將在每一幀都調(diào)用。插件介紹TextMeshpro:是該引擎Unity收購的插件,足以看出他的強(qiáng)大,強(qiáng)大的UI功能受不少開發(fā)者喜愛,這款組件解決了國內(nèi)開發(fā)者在Unity里無法進(jìn)行文字渲染,不會出現(xiàn)亂碼情況,你可以經(jīng)過網(wǎng)格渲染,也可以經(jīng)過UI渲染,其中最著名的一個(gè)技術(shù)——SDF,在我們傳統(tǒng)的渲染技術(shù)中,都是通過像素代表字符形狀,而這個(gè)新技術(shù)是是把輸入的字符串放到一個(gè)集合中,形成字符狀態(tài),它的優(yōu)點(diǎn)是字符不管如何縮放都可以精準(zhǔn)的渲染出清晰的字符。NavMeshAgent:作為尋路系統(tǒng)的核心組件,有了這個(gè)容器,可以生成導(dǎo)航網(wǎng)格,這個(gè)NavMesh可以設(shè)置我們預(yù)制體的活動范圍。開發(fā)過程中使用的軟件介紹1、Unity3D:功能插件資源都非常成熟,能有效的縮減開發(fā)時(shí)間,該引擎界面交互友好,及時(shí)不懂編程的人也可以輕松做出一款小游戲,常見的平臺都可支持。2、3dsMax:如果說到3dmax三維動畫渲染和制作的軟件,我想3dmax有它自己的一席之地,開發(fā)中可以通過他建造各種場景模型和人物模型,可以對材質(zhì)進(jìn)行處理。3、VisualStudio:擁有非常成熟的開發(fā)工具,在主流的編碼軟件算得上是非常成熟了,擁有著開發(fā)者所需要的工具,例如代碼管控、UML、IDE等等,VS對各種平臺有著高度的適應(yīng)性。4、Photoshop:PS是一款可以處理圖像的工具,可以利用他對圖片做需要的編輯操作,PS支持多個(gè)常用平臺。輸出游戲平臺通過調(diào)查,Windows平臺性能游戲在性能的限制和平臺使用量占有優(yōu)勢,所以決定將會輸出為Windows。游戲需求設(shè)計(jì)游戲基本介紹主角Henry是宇宙中一萬億顆星球中的一員,作為一名維護(hù)自己星球和平的保衛(wèi)隊(duì)員,他的日常就是在自己的領(lǐng)域上巡邏,有天他接到總部的通知,稱Tw-1空間站失去了連接,在最后一次連接時(shí),總部收到了該空間站的求救信號,信息表明,空間站被外星種族MAX突襲,并侵占了所有資源,Henry的任務(wù)就是到達(dá)Tw-1空間站,消滅所有敵人,并收集所有被搶占的資源,當(dāng)然你可以邀請你的戰(zhàn)友Jack與你協(xié)同作戰(zhàn)!在游戲菜單中選擇開始游戲,一名玩家作為局域網(wǎng)中的主機(jī),以參數(shù)的形式建立主機(jī)名,其他玩家尋找該局域網(wǎng)并進(jìn)行連接,連接完成后進(jìn)行數(shù)據(jù)的傳遞與同步,聯(lián)機(jī)完成則玩家會出生在停機(jī)坪,等待小伙伴們連接成功,就可以和小伙伴控制自己的角色進(jìn)行上下左右移動,空格鍵為射擊鍵,穿過一座橋,就到達(dá)空間站,空間站里有不少敵人,玩家需要操作自己的人物消滅所有的敵人,同時(shí)玩家還需要收集空間站中因掠奪散落一地的資源,操控人物觸碰即可拾取,當(dāng)所有敵人被消滅,資源都回收,游戲就獲得勝利。游戲功能局域網(wǎng)的建立、連接主服務(wù)器端建立后,通過UDP協(xié)議廣播地址,內(nèi)容包括服務(wù)器的id、服務(wù)器組、主機(jī)的名字還有ip地址,而客戶端通過接受到廣播后,會在列表中添加相關(guān)信息,同時(shí)同步自身信息到主服務(wù)器端,從而建立連接。游戲界面游戲需要一個(gè)游戲菜單來引導(dǎo)玩家進(jìn)行開始和退出游戲,在游戲過程中,有血條的顯示,讓玩家清晰的知道自己的血量和敵人的血量,也能知道已經(jīng)收集多少被強(qiáng)占的資源。圖3-1游戲菜單圖3-2血條設(shè)想游戲控制玩家控制鍵盤,控制上下左右,空格射擊,觸碰資源即拾取。游戲設(shè)計(jì)玩家需要控制角色進(jìn)行射擊敵人,躲避敵人攻擊,通過上下左右移動,空格射出子彈,敵人自動巡邏并檢測到角色進(jìn)入特定范圍內(nèi)會主動進(jìn)行攻擊玩家和敵人顯示血條,當(dāng)死亡時(shí)銷毀并播放死亡音效當(dāng)檢測碰撞到資源時(shí),玩家資源數(shù)+1玩家清理完敵人,收集完全部空間站中的資源即游戲勝利圖3-3游戲邏輯圖游戲功能實(shí)現(xiàn)UnityNetworkNetworkManager[1](如圖1),就如他的名字,是一個(gè)網(wǎng)絡(luò)管理器,用于管理從預(yù)制體進(jìn)行實(shí)例化網(wǎng)絡(luò)對象,開發(fā)者可從派生一個(gè)類去繼承又HLAPI實(shí)現(xiàn)的NetworkManager,這個(gè)組件可以進(jìn)行游戲的狀態(tài)管理、游戲的派生管理、游戲的場景管理、游戲中網(wǎng)絡(luò)的各項(xiàng)自定義等等。UnityManager添加網(wǎng)絡(luò)管理器,NetworkManager是unity的組件(如圖1),就如他的名字是一個(gè)網(wǎng)絡(luò)管理器,開發(fā)者可從派生一個(gè)類去繼承又HLAPI實(shí)現(xiàn)的NetworkManager,并且可以通過自己的需求去編寫任何他可以提供的虛擬函數(shù),這個(gè)組件可以進(jìn)行游戲的狀態(tài)管理、游戲的派生管理、游戲的場景管理、游戲中網(wǎng)絡(luò)的各項(xiàng)自定義等等。圖4-1網(wǎng)絡(luò)管理器UnityManagerHUD首先創(chuàng)建如圖2的網(wǎng)絡(luò)管理器,需要在Inspector面板上配置和編輯網(wǎng)絡(luò)相關(guān)狀態(tài),有一個(gè)網(wǎng)絡(luò)管理器可視化組件,后綴是HUD,為開發(fā)者打開了一個(gè)高效率的操作界面,十分友好,在游戲中控制顯示當(dāng)前的網(wǎng)絡(luò)狀態(tài),方便開發(fā)時(shí)進(jìn)行測試,圖里host為本機(jī)的服務(wù)器段,client為客戶端,當(dāng)我們要處理一些事件時(shí),只需要在服務(wù)器上處理,不需要重復(fù)處理。圖4-2網(wǎng)絡(luò)可視化組件創(chuàng)建Player角色角色模型及控制腳本1、角色模型如圖,進(jìn)行注冊聯(lián)網(wǎng)對象,找到SpawnInfo屬性集從組件面板中,掛上我們的玩家預(yù)制體在playerprefab上圖4-3角色模型編寫角色控制移動腳本、空格發(fā)射子彈,我們的前提是UnityEngine.Networking,再改為NetworkBehaviour,識別到本地玩家后進(jìn)行區(qū)分,不然會控制到不同的客戶端的玩家對象。void
Update
()
{
if
(isLocalPlayer
==
false)
{
return;
}
float
h
=
Input.GetAxis("Horizontal");
float
v
=
Input.GetAxis("Vertical");
transform.Rotate(Vector3.up
*
h
*
120
*
Time.deltaTime);
transform.Translate(Vector3.forward
*
v
*
3
*
Time.deltaTime);
if
(Input.GetKeyDown(KeyCode.Space))
{
CmdFire();
}
}
角色綁定網(wǎng)絡(luò)并進(jìn)行Transfrom同步由于是多人聯(lián)機(jī),角色不管在服務(wù)器端生成還是客戶端生成,都需要進(jìn)行角色的位置同步,而NetworkSendRate是表示網(wǎng)絡(luò)數(shù)據(jù)的同步,如果頻率太高會使游戲的幀數(shù)過高導(dǎo)致網(wǎng)絡(luò)延遲,但是頻率低又會影響玩家游玩體驗(yàn),具體代碼如下:1.
[Command]
2.
void
CmdFire()//這個(gè)方法需要在server里面調(diào)用
3.
{
4.
GameObject
bullet
=
Instantiate(bulletPrefab,
bulletSpawn.position,
b ulletSpawn.rotation)
as
GameObject;
5.
bullet.GetComponent<Rigidbody>().velocity
=
bullet.transform.forward
*
10;
6.
Destroy(bullet,
2);
7.
NetworkServer.Spawn(bullet);
8.
}
9.
}
角色隨機(jī)出生點(diǎn)和重生點(diǎn)有兩個(gè)隨機(jī)的出生點(diǎn)和重生點(diǎn),NetworkStartPosition組件可以用來控制玩家的出生點(diǎn),原理是訪問NetworkStartPosition可以讓列表通過Network.StartPositions,幫助在NetworkManager實(shí)現(xiàn)OnServerAddPlayer,如圖圖4-4隨機(jī)出生點(diǎn)重生時(shí),第一步應(yīng)檢測是否為本地角色,第二步進(jìn)行血量檢測,當(dāng)血量<=0時(shí),則死亡,代碼如下:public
void
TakeDamage(int
damage)
{
if
(isServer
==
false)
return;//
檢測血量這部分只在服務(wù)器端
currentHealth
-=
damage;
if
(currentHealth
<=
0)
{
if
(destroyOnDeath)
{
Destroy(this.gameObject);
return;
}
currentHealth
=
maxHealth;
Debug.Log("Dead");
RpcRespawn();
}
}
檢測到角色死亡后,檢測重生的隨機(jī)點(diǎn),在這里添加ClientRpc,是為了是調(diào)用雙端同步以執(zhí)行任務(wù),方法是序列化客戶端的數(shù)據(jù)并將其發(fā)送給客戶端以執(zhí)行,首先服務(wù)器將檢測到掛在對象Components上的NetworkIdentity然后將RPC命令發(fā)送大各個(gè)所監(jiān)視的客戶端上,代碼如下:[ClientRpc]
void
RpcRespawn()//客戶端調(diào)用
{
if
(isLocalPlayer
==
false)
return;
Vector3
spawnPosition
=
Vector3.zero;
if
(spawnPoints
!=
null
&&
spawnPoints.Length
>
0)
{
spawnPosition
=
spawnPoints[Random.Range(0,
spawnPoints.Length)].transform.position;
}
transform.position
=
spawnPosition;
}
角色血條控制并進(jìn)行檢測同步當(dāng)前角色血量為100,首先要做一個(gè)碰撞檢測,當(dāng)子彈碰撞到角色后,子彈需要自我銷毀,再處理角色的血量,調(diào)用takedamage這個(gè)方法,把血量-10,這里有一種邏輯,當(dāng)銷毀某些東西時(shí),應(yīng)該調(diào)用NetworkIdentity.OnDestroy,最好的方法是在服務(wù)器端銷毀它,然后與每個(gè)客戶端同步,這樣就可以減少如果客戶端銷毀時(shí),服務(wù)器端的物體會突然消失的問題,調(diào)用服務(wù)器檢測到后,預(yù)制件銷毀,服務(wù)器端也同步銷毀。public
class
Bullet
:
MonoBehaviour
{
void
OnCollisionEnter(Collision
col)
{
GameObject
hit
=
col.gameObject;
Health
health
=
hit.GetComponent<Health>();
if
(health
!=
null)
{
health.TakeDamage(10);
}
Destroy(this.gameObject);
}
}
血條始終保持面向相機(jī),代碼如下:void
Update
()
{
transform.LookAt(Camera.main.transform);
}
射擊功能子彈的生成首先實(shí)例化子彈,子彈的位置,子彈的攻擊力為10,當(dāng)子彈射出并碰撞后,銷毀子彈public
GameObject
bulletPrefab;//子彈
public
Transform
bulletSpawn;//子彈位置
3.
void
OnCollisionEnter(Collision
col)
{
4.
GameObject
hit
=
col.gameObject;
5.
Health
health
=
hit.GetComponent<Health>();
6.
if
(health
!=
null)
{
7.
health.TakeDamage(10);
}
8.
Destroy(this.gameObject);
9.
}10.
}
子彈綁定網(wǎng)絡(luò)并進(jìn)行同步做完前面的工作后,測試發(fā)現(xiàn),子彈射中后可以出發(fā)掉血,但是當(dāng)由于涉及后回觸發(fā)TakeDamage方法,如果其中一方接觸到對方并且銷毀時(shí),由于網(wǎng)絡(luò)延遲,另一方在打中對方前就進(jìn)行了銷毀處理,導(dǎo)致雙方數(shù)據(jù)的不同步,這是因?yàn)橄惹白訌椫皇窃诳蛻舳松桑]有進(jìn)行同步,所以我們需要把子彈綁定網(wǎng)格再同步到各個(gè)客戶端,首先,子彈要在網(wǎng)絡(luò)生成,需要把子彈注冊到網(wǎng)絡(luò)管理器中,在此之前,要在子彈上掛上NetworkIdentify,增加Command特性,原理是代碼在服務(wù)器端運(yùn)轉(zhuǎn),但需要在客戶段調(diào)用,把子彈同步到各個(gè)客戶端,這時(shí)候可以用Spawn方法,可以把指定生成在各個(gè)客戶端,當(dāng)具有網(wǎng)絡(luò)徽標(biāo)的預(yù)制件掛在服務(wù)器Spawn上時(shí),該預(yù)制件將調(diào)用OnstarServer,而后進(jìn)行調(diào)配netid,當(dāng)完成這個(gè)注冊這個(gè)流程后,會更改對應(yīng)的網(wǎng)絡(luò)物體列表,接著查找所有客戶端帶有網(wǎng)絡(luò)標(biāo)識的物體,如果狀態(tài)為TRUE,則將MsgType.ObjectSpawn或是MsgType.ObjectSpawnScene傳遞到預(yù)制體上,在注冊列表中的預(yù)制體里面尋找對應(yīng)的物體,找到后更新注冊到NetworkScene的列表中,需要更新相關(guān)信息,這時(shí)客戶端上的子彈沒有速度,我們得先進(jìn)行數(shù)據(jù)的同步,先在子彈上掛上組件獲取他的位置和狀態(tài),同步剛體組件。因?yàn)樽訌椀乃俣炔皇菚r(shí)刻變化,所以只需要同步一次即可,從客戶端調(diào)用參數(shù)的前提條件是可以對網(wǎng)絡(luò)進(jìn)行序列化,以便可以對參數(shù)進(jìn)行反序列化。在開發(fā)時(shí),由于我的粗心,發(fā)生了無法調(diào)用的錯誤,在我查閱資料后發(fā)現(xiàn),我的客戶端上忘記了掛上NetworkIdentity組件,像spawn、destroy這些都需要有一個(gè)NetworkIScene為前提。SynCar特性是解決這個(gè)方法的核心,通過這個(gè)方法,如此一來可以使服務(wù)器的值同步到客戶端上,讓雙端數(shù)據(jù)保持一致,防止因?yàn)橐欢烁淖兌绊懥硗庖欢耍霈F(xiàn)錯誤。1.
[Command]
2.
void
CmdFire()//這個(gè)方法需要在server里面調(diào)用
3.
{
4.
GameObject
bullet
=
Instantiate(bulletPrefab,
bulletSpawn.position,
bulletSpawn.rotation)
as
GameObject;
5.
bullet.GetComponent<Rigidbody>().velocity
=
bullet.transform.forward
*
10;
6.
Destroy(bullet,
2);
7.
NetworkServer.Spawn(bullet);
8.
}
9.
}
創(chuàng)建敵人預(yù)制體敵人模型設(shè)置有兩種敵人,一種血量為100,一種血量為200,為了增加難度,不同敵人的傷害也不同。圖4-5敵人模型敵人綁定網(wǎng)格并進(jìn)行同步作為網(wǎng)絡(luò)對象的一個(gè)非?;镜慕M成部分,雙端必須確定它甚少有沒有networkID,這是用來指示對象的網(wǎng)絡(luò)狀態(tài),例如它是屬于雙端中的哪一端,相對于具體是客戶端的哪個(gè),擁有什么權(quán)限等圖4-6網(wǎng)絡(luò)狀態(tài)敵人隨機(jī)生成實(shí)例化隨機(jī)生成點(diǎn),并設(shè)置隨機(jī)數(shù)量,代碼如下:public
GameObject
enemyPrefab;
public
int
numberOfEnemies;
public
override
void
OnStartServer()
{
for
(int
i
=
0;
i
<
numberOfEnemies;
i++)
{
Vector3
position
=
new
Vector3(Random.Range(-6f,
6f),
0,
Random.Range(-6f,
6f));
Quaternion
rotation
=
Quaternion.Euler(0,
Random.Range(0,
360),
0);
GameObject
enemy
=
Instantiate(enemyPrefab,
position,
rotation)
as
GameObject;
NetworkServer.Spawn(enemy);
}
}
美術(shù)實(shí)現(xiàn)場景外部場景游戲中的場景,擁有神秘的飛船和隕石,圍繞著主題科幻搭建,燈光也改為較為昏暗,讓玩家游玩時(shí)有種神秘的感覺,設(shè)置玩家的出生點(diǎn)和重生點(diǎn)都在飛船坪上隨機(jī)生成,從這里開始進(jìn)行游戲圖5-1場景1內(nèi)部場景在內(nèi)部裝飾上,從地磚到墻,再到每一樣?xùn)|西,都是一個(gè)個(gè)搭建出來的,房間內(nèi)飾有控制室、各類科技用品圖5-2-場景2菜單UI開始菜單,有PLAY、exit等按鈕,當(dāng)點(diǎn)擊PLAY即進(jìn)入場景2,為游戲主界面。當(dāng)通過鼠標(biāo)按下該按鈕,就可以載入所要進(jìn)行的游戲圖5-3-TEXTMESHPRO首先導(dǎo)入TEXTMESHPRO組件,設(shè)計(jì)好菜單字體與顏色如圖,其次,為了給玩家,按鈕按下后的回饋,進(jìn)行調(diào)節(jié)按鈕圖5-4-調(diào)節(jié)面板制作結(jié)束菜單,有繼續(xù)游戲和退出按鈕。圖5-5-菜單血條UI編輯血條UI永遠(yuǎn)面向攝像機(jī)的代碼using
UnityEngine;
using
System.Collections;
public
class
LookAtCamera
:
MonoBehaviour
{
void
Update
()
{
transform.LookAt(Camera.main.transform);
}
}
圖5-6-血條游戲音效本游戲的風(fēng)格關(guān)鍵詞是“外太空”、“科幻”“神秘”所以在選擇游戲音效時(shí)遵循這樣的風(fēng)格,在游戲前期和后期,菜單部分,選擇了比較舒緩的背景音樂,而在游戲進(jìn)行中,選擇為比較緊張刺激的背景音樂,營造出一種十分緊張的刺激氛圍,增加玩家游戲的沉浸感和代入感[3]。為了提高玩家的用戶體驗(yàn),游戲時(shí),射擊時(shí)伴有聲音、角色和敵人死亡后的音效聲都進(jìn)行設(shè)置。游戲燈光燈光是經(jīng)常被開發(fā)者或玩家忽視的一樣游戲感受,但是燈光在游戲中屬于非常重要的部分,好的游戲的燈光要求非常高,燈光可以被用來營造出特定氛圍的環(huán)境,也可以引出需要被關(guān)注的物體,燈光不僅僅只是用來照亮場景,而是需要好好利用起來,喚起一種玩家游玩時(shí)的現(xiàn)實(shí)感,有目的的照亮該場景的建筑與物體甚至是角色,提高玩家游玩時(shí)的沉浸感,讓玩家能更深刻的被吸引到故事和游戲情景當(dāng)中。圖是初始游戲場景時(shí)的燈光,圖是增加了三個(gè)燈光組件后的場景,對比非常明顯,由于本游戲是設(shè)定在太空當(dāng)中,神秘、科幻、夢幻是該游戲的關(guān)鍵詞。圖5-7燈光對比游戲測試游戲測試游戲測試的重要新就相當(dāng)于人身體中的一個(gè)器官,這個(gè)器官可以保證著人體(游戲)的健康(游戲質(zhì)量),并且在現(xiàn)在的開發(fā)行業(yè)里,游戲測試是不可或缺的一個(gè)崗位,目的是為了發(fā)現(xiàn)游戲中存在或者可能存在的缺陷,需要進(jìn)行模擬操作一遍,通過測試發(fā)現(xiàn)問題后,有利于開發(fā)者進(jìn)行改善。總之,游戲測試是為了發(fā)現(xiàn)問題后進(jìn)行提高游戲質(zhì)量,按以往我們說的傳統(tǒng)的軟件測試包括黑盒測試或白盒測試,并且游戲比其他軟件更特殊,他的測試含有可玩性、游戲世界的平衡性、游戲文化風(fēng)格等都是游戲測試中的一部分,這是相對于其他軟件所不一樣的。從游戲的開始需求調(diào)研時(shí),就可以進(jìn)行測試了,例如音游游戲,就可以去市面上找到相同類型的游戲進(jìn)行測評,對未來測試自己的游戲是非常大的幫助的,游戲開發(fā)時(shí),通過游戲文檔、需求文檔等文件進(jìn)行編寫游戲測試文檔,所謂蘿卜青菜各有所愛,游戲也是如此,我們要通過進(jìn)行用戶調(diào)研,開發(fā)出喜聞樂見的游戲,而后期成型后,像比如說游戲的壓力測試、兼容測試、網(wǎng)絡(luò)測試、適配性測試等等也是非常重要.表6-1游戲信息表游戲名字:SpaceHulk游戲類型:TPS游戲風(fēng)格:科幻是否聯(lián)網(wǎng):是表6-2游戲UI測試游戲UI部分(是否正常?)開始菜單—PLAY是開始菜單—QUIT是結(jié)束菜單—NEWGAME是結(jié)束菜單—QUIT是血條顯示是表6-3游戲功能測試游戲功能(是否正常?)移動是射擊是傷害、血條計(jì)算是拾撿東西是相機(jī)跟隨是表6-3游戲音效測試游戲燈光音效(是否正常?)游戲燈光是菜單背景音樂是菜單內(nèi)音效聲是游戲背景音樂是表6-4游戲音效測試游戲場景模型(是否正常?)天空盒是大環(huán)境(宇宙)是建筑是內(nèi)飾是玩家模型是敵人模型是總結(jié)與期望隨著我的畢業(yè)論文到了寫總結(jié)的部分,也意味著我四年青春歲月的大學(xué)生涯也隨之快要接近尾聲了,畢設(shè)和論文從前期設(shè)計(jì)到后期開發(fā)測試到收尾工作,都讓我感觸頗深,在完成的過程中出現(xiàn)了許多bug,也使我對自身的能力認(rèn)識的一個(gè)過程,從提出設(shè)想,到去學(xué)習(xí)制作,這個(gè)過程讓我受益匪淺,只有每天不斷的學(xué)習(xí)充實(shí)才讓我覺得有安全感。在開始前,我認(rèn)為的畢業(yè)設(shè)計(jì),不過就是對我四年來學(xué)習(xí)的的一個(gè)總結(jié),但昨完畢業(yè)設(shè)計(jì)的我認(rèn)為,這只是學(xué)習(xí)的一個(gè)開始,我需要對自身水平有個(gè)清晰的定位,以前的知識需要去學(xué)習(xí),未來發(fā)展出來的知識也得去學(xué)習(xí),學(xué)習(xí)是一件長期積累的過程,沒有捷徑,沒有終點(diǎn),只有不斷鞭策自己往前走,再往前走,才是生命的真諦。本論文主要介紹了多人聯(lián)機(jī)射擊游戲,在設(shè)計(jì)開始之前,我在白紙上進(jìn)行了一次大腦風(fēng)暴,把想做的功能都羅列了出來,隨著越寫越多,發(fā)現(xiàn)自己寫的功能都是常見的多人射擊游戲,不夠新穎,沒有創(chuàng)意,而且功能龐大,有點(diǎn)眼高手低,于是我把基本功能都圈了出來,決定先實(shí)現(xiàn)出,有些看似簡單的功能,在實(shí)現(xiàn)起來時(shí)卻遭遇困難,非常感謝我的同學(xué)們和老師,在我開發(fā)過程中給了我許多建議,通過在網(wǎng)上查閱資料,觀看教學(xué)視頻,結(jié)合自己的理解,不斷的攻破一道道難題,從前期的需求設(shè)計(jì),開發(fā)的準(zhǔn)備,素材的查找,開發(fā)時(shí)自學(xué)各種軟件插件,開發(fā)后的優(yōu)化等,都不是那么簡單的,基本上完成了初始的功能,ui界面有開始菜單,結(jié)束菜單,血條的顯示,實(shí)現(xiàn)了模型的移動射擊,血量血條,隨機(jī)生成敵人,重生點(diǎn),子彈射擊邏輯,還有本文最重要的聯(lián)機(jī)部分,采用的是Mutiplayer的網(wǎng)絡(luò)架構(gòu),在場景的構(gòu)造過程中,以科幻風(fēng)格為目的去完成,界面簡單友好,運(yùn)行穩(wěn)定,從開發(fā)前期到后期漸漸總結(jié)了一個(gè)規(guī)律,所有功能在服務(wù)器端處理,比如敵人的生成位置、子彈的生成、子彈同步的邏輯,敵人自動巡邏的邏輯、檢測范圍內(nèi)玩家自動攻擊。一個(gè)游戲,他不僅僅只是編寫代碼,他還需要結(jié)合邏輯,需要會處理素材,需要不斷的學(xué)習(xí)新的插件組件,利用好網(wǎng)絡(luò)資源,能讓我的游戲變得完整,在這個(gè)過程中,聯(lián)機(jī)作為我畢業(yè)設(shè)計(jì)的亮點(diǎn),也是難點(diǎn),就讓我花費(fèi)了很多時(shí)間去研究,在發(fā)開時(shí),由于沒有經(jīng)驗(yàn),代碼比較冗雜,處理重復(fù)多,致使游戲?qū)嵭缘拖?,后來以一個(gè)原則,則是先在服務(wù)器端進(jìn)行更新數(shù)據(jù),再通過客戶端進(jìn)行同步。游戲雖然制作成功,但是存在著以下問題:?1.?場景制作時(shí)間過長,導(dǎo)致游戲功能較為單一,可玩性不高。?2.?對于模型的處理方面的知識比較欠缺,也花了些時(shí)間學(xué)習(xí)。3.?Unity中有許多強(qiáng)大的組件,沒有吃透,這塊在未來也需要一直學(xué)習(xí)。隨著技術(shù)的不斷上升,電腦配置不停的提高,游戲開發(fā)環(huán)境越來越完善,開發(fā)者越來越多,做出的好游戲也是數(shù)不勝數(shù),而游戲的游戲效果也是越來越精致,游戲已經(jīng)成為大眾化的一項(xiàng)魚類項(xiàng)目,反之,由于當(dāng)代的玩家玩的游戲
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專用建筑工具租賃合同
- 2024年建筑工程施工物資合同
- 2024年商業(yè)店鋪聯(lián)合租賃合同
- 2024年度加工承攬合同承攬工作內(nèi)容及要求
- 【初中生物】脊椎動物-鳥和哺乳動物課件-2024-2025學(xué)年人教版(2024)生物七年級上冊
- 2024年定制版:物流運(yùn)輸居間協(xié)議
- 2024年在線教育平臺建設(shè)及內(nèi)容提供合同
- 2024國際貨運(yùn)代理服務(wù)合同及附加條款
- 2024年廢棄物處理與回收合同處理方法與環(huán)保標(biāo)準(zhǔn)
- 2024年北京市出租車指標(biāo)承包經(jīng)營協(xié)議
- 2024年度一級注冊消防工程師考試復(fù)習(xí)題庫及答案(共1000題)
- 人教八年級上冊英語第六單元《Section A (1a-2d)》教學(xué)課件
- Q_JLY J7110281D-2016 乘用車內(nèi)外飾塑料件通用技術(shù)要求
- 樹木移植工程技術(shù)交底
- 南非電力市場投資前景預(yù)測報(bào)告(目錄)
- 閉水試驗(yàn)自動計(jì)算公式及說明
- 室外球墨鑄鐵管施工方案
- 通用技術(shù)學(xué)考300題
- 公寓購房合同范文
- 遷鋼煉鋼二期板坯連鑄機(jī)設(shè)備安裝施工方案
- 山西《建筑工程預(yù)算定額》定額說明及計(jì)算規(guī)則
評論
0/150
提交評論