版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 利用魔術(shù)思維優(yōu)化基于Unity3D的《立方殺陣》游戲</p><p> [摘 要]游戲開(kāi)發(fā)者總是容易被現(xiàn)實(shí)世界的各種物理邏輯,真實(shí)規(guī)律所束縛。文章講述一種新的游戲開(kāi)發(fā)思維,介紹如何利用魔術(shù)思維開(kāi)發(fā)游戲,從而使程序在不改變需求的情況下,更有效率,更加靈活,擴(kuò)展性更高。研究通過(guò)對(duì)基于Unity3D的《立方殺陣》游戲的優(yōu)化,證明了這種思維的可行性和有效性。 </p><p&g
2、t; [關(guān)鍵詞]Unity3D 魔術(shù)思維 預(yù)制體 </p><p> 中圖分類號(hào):P208 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-914X(2016)02-0353-02 </p><p><b> 1 引言 </b></p><p> 與一般應(yīng)用不同,游戲中常需模擬現(xiàn)實(shí)世界、甚至超現(xiàn)實(shí)世界的動(dòng)作效果,這對(duì)游戲開(kāi)發(fā)者提出了更高的要求。例如
3、在射擊游戲中,如何為用戶提供逼真的射擊感受十分重要。在進(jìn)行游戲開(kāi)發(fā)時(shí),很多難題,不如換一個(gè)視角來(lái)觀察,換一種方式來(lái)解決,可能獲得意想不到的效果。文章提出一種從魔術(shù)思維出發(fā)的方式,通過(guò)一些偽技巧,把一些真實(shí)需求魔術(shù)化地呈現(xiàn)給玩家。讓游戲開(kāi)發(fā)不僅僅是一種技術(shù),更提升為一種藝術(shù)。 </p><p> 2 游戲《立方殺陣》開(kāi)發(fā)前期遇到的困擾 </p><p> (1)要讓玩家感覺(jué)到房間數(shù)量巨大
4、,有種身處巨型密室的感覺(jué),然而場(chǎng)景中構(gòu)建過(guò)多房間會(huì)導(dǎo)致游戲幀數(shù)低于10幀。 </p><p> 《立方殺陣》是從電影《異次元?dú)㈥嚒分蝎@取靈感進(jìn)而改編的獨(dú)立游戲。根據(jù)電影中的設(shè)定,該殺陣是一個(gè)由26×26×26=17576個(gè)小立方體房間組成的巨型立方體密室。所以,如果要讓玩家可以在密室中像電影一樣逃脫,并獲得樂(lè)趣,顯然必須有非常多的立方體房間才可以滿足游戲的需求。然而,在Unity3D中,經(jīng)過(guò)
5、測(cè)試,當(dāng)立方體房間超過(guò)4×4×4=64個(gè)房間的時(shí)候,還沒(méi)運(yùn)行游戲,就已經(jīng)開(kāi)始卡頻了。64個(gè)房間,即立方體每個(gè)方向4個(gè)房間,無(wú)法讓玩家感受密室的龐大。 </p><p> ?。?)子彈速度過(guò)快導(dǎo)致無(wú)碰撞穿越。 </p><p> Unity3D中,物體的移動(dòng)速度過(guò)快,極大可能導(dǎo)致在碰撞另外的物體時(shí),產(chǎn)生穿越,從而無(wú)法發(fā)射碰撞檢測(cè)。根據(jù)射擊系統(tǒng)的需求,子彈是必須出現(xiàn)的。如
6、果子彈速度不夠快,那么玩家的射擊體驗(yàn)將會(huì)大大下降,游戲沉浸感會(huì)大大減少。子彈速度要達(dá)到真實(shí)世界的子彈速度,又會(huì)導(dǎo)致穿越現(xiàn)象,有時(shí)候射擊了物體但沒(méi)反應(yīng)。 </p><p> 3 現(xiàn)實(shí)邏輯實(shí)現(xiàn)需求 </p><p> ?。?)現(xiàn)實(shí)邏輯解決需求1:使玩家體驗(yàn)到身處許多房間的巨型密室。 </p><p> Unity3D的游戲腳本為基于Mono的Mono腳本,一個(gè)基于.
7、NET Framework的開(kāi)源語(yǔ)言,因此程序員可用C#,JavaScript等加以編寫[1]。文章將采用C#語(yǔ)言進(jìn)行示例。 </p><p> 在游戲世界放置數(shù)量足夠多的房間。用代碼生成場(chǎng)景如下: </p><p> public void InstantiateAllRoom(int Num,GameObject RoomPrefab){ </p><p>
8、 int nowNum=0; //當(dāng)前房間個(gè)數(shù) </p><p> for(int y=0;y<Num;y++){ //Y軸 </p><p> for(int z=0;z<Num;z++){ //Z軸 </p><p> for(int x=0;x<Num;x++){ //X軸 </p><p> //實(shí)例化一個(gè)
9、房間在對(duì)應(yīng)的(X,Y,Z)坐標(biāo)上 </p><p> GameObject g=(GameObject)Instantiate(RoomPrefab,newVector3(x,y,z), RoomPrefab.transform.localRotation); </p><p> g.name="第"+nowNum+"個(gè)"; //為房間命名 &l
10、t;/p><p> nowNum+=1; //數(shù)量加一 </p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></p><p><b> } </b></
11、p><p> 這種思維會(huì)真實(shí)模擬出電影《異次元?dú)㈥嚒返氖澜?,讓游戲?chǎng)景可以按照電影的世界來(lái)構(gòu)造,使游戲世界非常直觀。但時(shí)間復(fù)雜度較高,復(fù)雜度為O(Num3)。 </p><p> 在CPU為Intel酷睿i52450M,內(nèi)存4GB,顯卡NVIDIA GeForce GT 520M(1G顯存)的電腦環(huán)境下測(cè)試,當(dāng)房間數(shù)量達(dá)到10000個(gè)時(shí),游戲運(yùn)行對(duì)CPU占用的時(shí)間為每幀37.06ms,對(duì)攝
12、像機(jī)渲染值(消耗顯存)占有率達(dá)到了80%左右。生成26*26*26規(guī)模的立方場(chǎng)景測(cè)試游戲?qū)嶋H運(yùn)行幀數(shù),幀數(shù)運(yùn)行效果如下圖1所示: </p><p> 圖1中左側(cè)的Hierarchy面板中表示游戲場(chǎng)景有17576個(gè)房間,游戲場(chǎng)景輸出了當(dāng)前游戲幀數(shù)??梢钥吹皆诜块g數(shù)量超過(guò)1萬(wàn)間的情況下,當(dāng)前Draw Call(Unity每次在準(zhǔn)備數(shù)據(jù)并通知GPU渲染的過(guò)程稱為一次Draw Call)為27次,幀數(shù)低于10幀,流暢度
13、較低。 </p><p> ?。?)現(xiàn)實(shí)邏輯解決需求2:子彈達(dá)到真實(shí)世界射擊體驗(yàn) </p><p> 當(dāng)射擊事件觸發(fā)時(shí),實(shí)例化一顆子彈的預(yù)制物體,賦予該預(yù)制子彈物體的加速度與方向,使其向目標(biāo)發(fā)射。當(dāng)子彈進(jìn)入目標(biāo)觸發(fā)范圍,或者與目標(biāo)發(fā)生碰撞時(shí),產(chǎn)生擊中事件。游戲?qū)ο笕绻枰袘?yīng)碰撞,那么必須給其添加碰撞器[2]。手動(dòng)添加Unity3D的碰撞器即可。子彈射擊效果實(shí)現(xiàn)代碼如下: </p&
14、gt;<p> public void Fire(GameObject Bullet,float Force){ </p><p> //在當(dāng)前位置實(shí)例化一顆子彈 </p><p> GameObject g=(GameObject)Instantiate(Bullet,transform.localPosition,Bullet.transform.localRota
15、tion); </p><p> //在子彈身上作用一個(gè)向前的力使其飛行 </p><p> g.GetComponent().AddForce(transform.forward*Force); </p><p><b> } </b></p><p> 但是這種方法,每次射擊實(shí)例化一個(gè)物體,多次射擊后,為了防
16、止內(nèi)存逐漸增多,每顆子彈都要實(shí)現(xiàn)延遲銷毀。然而Unity3D中的Destroy()函數(shù)對(duì)子彈的銷毀并不徹底,被銷毀的物體本身在內(nèi)存中保留有網(wǎng)格渲染緩存,直到進(jìn)行場(chǎng)景切換才徹底清空。隨著游戲運(yùn)行時(shí)間的增加,內(nèi)存消耗增加,并且該方法也沒(méi)有達(dá)到射擊體驗(yàn)的需求。 4 魔術(shù)思維實(shí)現(xiàn)需求的方式 </p><p> ?。?)魔術(shù)思維實(shí)現(xiàn)需求1:使玩家體驗(yàn)到身處許多房間的巨型密室。 </p><p>
17、; 魔術(shù)師戒指握在手心,在觀眾眼前輕輕吹一口氣,再打開(kāi)手,戒指消失了,接下來(lái)魔術(shù)師讓觀眾打開(kāi)桌子上的盒子,觀眾發(fā)現(xiàn),戒指赫然出現(xiàn)在盒子里。 </p><p> 這個(gè)魔術(shù)里面用到了2種思維,分別是錯(cuò)誤引導(dǎo)思維和預(yù)制體思維。要解決立方殺陣游戲場(chǎng)景房間過(guò)多問(wèn)題,用兩種思維即可解決。 </p><p> 首先利用錯(cuò)誤引導(dǎo)思維,在游戲介紹或者開(kāi)頭CG上告訴玩家這是個(gè)巨型立方體。在游戲開(kāi)始時(shí)讓玩
18、家處于一個(gè)已初始化的房間中。玩家在開(kāi)門前,無(wú)法得知房間外的情況,事實(shí)上此時(shí)只有一個(gè)房間。 </p><p> 而預(yù)制體思維說(shuō)的是盒子里的戒指其實(shí)一開(kāi)始就存在,和消失的戒指一模一樣,早就放在盒子里,必要的時(shí)候,才會(huì)讓它出現(xiàn)給觀眾看到。同樣,事先構(gòu)建好立方體房間的一種單獨(dú)個(gè)體,預(yù)制在資源文件中,作為預(yù)設(shè)體,可以理解為是一個(gè)游戲?qū)ο蠹捌浣M件的集合,目的是使游戲?qū)ο蠹百Y源能夠被重復(fù)使用[3]。使用該預(yù)制對(duì)象,就可以創(chuàng)建
19、一個(gè)交互式的3D場(chǎng)景[4]。當(dāng)玩家開(kāi)啟某個(gè)門時(shí),實(shí)例化一個(gè)立方體房間在對(duì)應(yīng)的下一個(gè)房間位置上,當(dāng)門被完全打開(kāi)時(shí),玩家看到的,是另一個(gè)立方體房間。以此類推,如此,多房間體驗(yàn)需求就解決。 </p><p> 玩家在房間中進(jìn)行游戲時(shí),類似于虛擬漫游項(xiàng)目的觀房,使用動(dòng)態(tài)的、有交互功能的三維觀 , 能夠使整個(gè)看房過(guò)程更加生動(dòng),使用戶有一種身臨其境的感覺(jué)[5]。同樣,在有交互性與三維的前提下,這種開(kāi)發(fā)思維也達(dá)到了身臨其境的
20、房間體驗(yàn)。 </p><p> 無(wú)論使用哪種方式,都會(huì)導(dǎo)致一個(gè)問(wèn)題,便是隨著玩家打開(kāi)的房間越來(lái)越多,超過(guò)64個(gè)房間時(shí),會(huì)導(dǎo)致游戲很卡。解決方式是利用改進(jìn)的先進(jìn)先出算法刪除舊房間。由于《立方殺陣》中玩家經(jīng)過(guò)8個(gè)房間所需的時(shí)間和房間周期性位移設(shè)定的時(shí)間幾乎相同,此時(shí)即使第一個(gè)房間因被刪除而發(fā)生變化也不會(huì)出現(xiàn)不合理的空間現(xiàn)象,所以《立方殺陣》中的房間設(shè)定最大值為8。模塊代碼如下: </p><p&
21、gt; public void InstantiateOneRoom(Vector3 RoomTransform,GameObject RoomPrefab){ </p><p> bool canInstantiateOneRoom=true; //該位置可否生成房間的標(biāo)志 </p><p> if(NowRoomNum>=AllRoom.Length){NowRoomNum
22、=0;} //數(shù)組序號(hào)重置 </p><p> for(int i=0;i //遍歷房間數(shù)組,看目前該位置是否已經(jīng)存在房間,如果存在則不可以再次生成房間 </p><p> if(AllRoom[i].name==""+RoomTransform){canInstantiateOneRoom=false;break;} </p><p>&
23、lt;b> } </b></p><p> if(canInstantiateOneRoom){ } //生成房間 </p><p><b> } </b></p><p> 生成房間代碼時(shí)間復(fù)雜度為:O(AllRoom.Length)。對(duì)比第一種方法, O(AllRoom.Length)遠(yuǎn)遠(yuǎn)小于O(Num3)。 &l
24、t;/p><p> 經(jīng)過(guò)測(cè)試,當(dāng)房間數(shù)量為8間時(shí),游戲運(yùn)行對(duì)CPU占用的時(shí)間為每幀0.1ms,對(duì)比前一開(kāi)發(fā)方案減少了36%。對(duì)攝像機(jī)渲染值(消耗顯存)占有率達(dá)到1.2%左右。對(duì)比前一開(kāi)發(fā)方案,減少了78.8%。很明顯,該方案較好的優(yōu)化了該游戲,使游戲更加順暢。當(dāng)生成8個(gè)房間,測(cè)試實(shí)際游戲運(yùn)行的幀數(shù),如圖2所示: </p><p> 圖2中左側(cè)的Hierarchy面板中表示游戲場(chǎng)景有8個(gè)房間
25、,游戲場(chǎng)景輸出了當(dāng)前游戲幀數(shù),可以看到當(dāng)前情況下, Draw Call為8次,幀數(shù)達(dá)到59.9幀,流暢度極高。 </p><p> ?。?)魔術(shù)思維實(shí)現(xiàn)需求2:子彈達(dá)到真實(shí)世界射擊體驗(yàn) </p><p> 魔術(shù)思維開(kāi)發(fā)方式:魔術(shù)師將女助手四肢呈一個(gè)大字綁在一個(gè)大轉(zhuǎn)盤上面,在轉(zhuǎn)盤慢速旋轉(zhuǎn)的情況下,魔術(shù)師蒙上眼鏡,將10把飛刀一個(gè)個(gè)準(zhǔn)確的扔到女助手身體旁邊的轉(zhuǎn)板上,狠狠的插了進(jìn)去,絲毫不傷及
26、女助手。 </p><p> 其實(shí),魔術(shù)師只是在假裝扔飛刀,接下來(lái),事先安裝在轉(zhuǎn)盤背面的彈簧裝置,從轉(zhuǎn)盤背后反方向彈出一把插在轉(zhuǎn)板上的飛刀。 </p><p> 實(shí)例化子彈每次都會(huì)產(chǎn)生一次內(nèi)存損耗。為解決該問(wèn)題,采用魔術(shù)思維,以Unity3D里的一種射線替代子彈。玩家射擊時(shí),出現(xiàn)一條可控制距離(用于不同槍械射擊距離)的射線,而射線只出現(xiàn)一幀,那一幀立刻判斷射線是否射中目標(biāo),是否觸發(fā)擊中
27、事件,模擬了真實(shí)世界子彈的射擊速度,避免了檢測(cè)丟失的現(xiàn)象。射線方案射擊功能模塊代碼如下: </p><p> public void Fire(float Distance){ </p><p> RaycastHit hit=new RaycastHit(); //射線發(fā)射相關(guān)信息 </p><p> Camera camaer=Camera.main; /
28、/主攝像機(jī) </p><p> Vector3 t=camaer.transform.position+camaer.transform.forward*Distance; //射線目標(biāo)坐標(biāo) </p><p> //由攝像機(jī)到終點(diǎn)的方向發(fā)射一條射線 </p><p> Ray ray1 =new Ray(camaer.transform.position,t-
29、camaer.transform.position); </p><p> if(Physics.Raycast(ray1,out hit,Distance)){ </p><p> //當(dāng)發(fā)射射線時(shí),在開(kāi)發(fā)者界面繪制一條綠色的線 </p><p> Debug.DrawRay (ray1.origin,t-camaer.transform.position,
30、 Color.green); </p><p><b> } </b></p><p> } 對(duì)于各種模擬子彈飛行時(shí)的特效火線,或者擊中墻壁等地形時(shí)的石灰飛濺效果,都可以在射擊事件和擊中事件中在對(duì)應(yīng)位置實(shí)例化這個(gè)效果,AI射擊方面也可以用射線判定。 </p><p> 對(duì)兩種思維實(shí)現(xiàn)射擊的效果進(jìn)行測(cè)試,同時(shí)運(yùn)行游戲20分鐘。在實(shí)例化
31、子彈的方案中,即使銷毀了子彈物體,由于緩存的作用,游戲內(nèi)存的占有率一直逐漸增加,20分鐘時(shí)達(dá)到了250M左右。而使用射線方案的情況下,內(nèi)存占有率一直在205M左右浮動(dòng)。由此可知,隨著游戲的持續(xù)運(yùn)行,用射線代替實(shí)例化子彈的方案更優(yōu)。 </p><p> 5 其他問(wèn)題的魔術(shù)思維優(yōu)化方案 </p><p> ?。?)需實(shí)現(xiàn)第一人稱手拿著物品,但不顯示手部的美工模型與動(dòng)畫。 </p>
32、<p> 把物品模型的2/3出現(xiàn)在屏幕左或右下方(表示左右手),1/3隱藏在屏幕下方外界,主角拿著物品走動(dòng)時(shí),應(yīng)使物品有頻率抖動(dòng)效果。 </p><p> ?。?)場(chǎng)景初始化過(guò)于突兀。 </p><p> 一個(gè)游戲場(chǎng)景需要初始化許多物體,出現(xiàn)逐漸渲染周圍世界的效果,或者主角模型的坐標(biāo)需要重置等。這些效果會(huì)導(dǎo)致玩家看到一些如突然瞬移,一棵樹突然出現(xiàn)等奇怪的現(xiàn)象,降低游戲沉浸
33、度。在場(chǎng)景開(kāi)始時(shí),保留讀取界面的UI圖片或背景,使其與讀取界面無(wú)縫結(jié)合,等待場(chǎng)景物體初始化完成后(一般不會(huì)超過(guò)2秒),讓玩家按下某個(gè)按鍵來(lái)開(kāi)始游戲,可掩蓋一些不應(yīng)該出現(xiàn)的效果,使游戲平滑過(guò)場(chǎng)。 </p><p><b> 6 總結(jié)與展望 </b></p><p> 通過(guò)對(duì)《立方殺陣》一部分游戲模塊的分析可知,在合理的情況下,使用魔術(shù)思維的游戲開(kāi)發(fā)方式讓游戲的程序結(jié)
34、構(gòu)更加靈活,效率更高,為游戲需求的實(shí)現(xiàn)增加了更多的考慮方向,更讓游戲開(kāi)發(fā)從技術(shù)提升為另一種領(lǐng)域的藝術(shù)。 </p><p> 但魔術(shù)思維并不適應(yīng)所有的游戲開(kāi)發(fā)需求,某些需求如果需要非常清楚的展示整個(gè)效果的實(shí)現(xiàn)過(guò)程,那么魔術(shù)思維這種偽實(shí)現(xiàn)方式便無(wú)法發(fā)揮作用,希望未來(lái)能繼續(xù)改進(jìn),使魔術(shù)思維的運(yùn)用更加廣泛,完善。 </p><p><b> 參考文獻(xiàn) </b></p
35、><p> [1] 俞亮,俞文心.基于Unity的Web游戲設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)光盤軟件與應(yīng)用,2014(8):225-226. </p><p> [2] 王彩玲,劉瑞香,宋釗.基于Unity3D的虛擬校園漫游的設(shè)計(jì)與實(shí)現(xiàn)[J]. 科技視界,2015,5. </p><p> [3] Unity Technologies.Unity4.x 從入門到精通[M]
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何優(yōu)化unity3d游戲運(yùn)行性能
- 基于unity3d的潛行游戲開(kāi)發(fā)
- 基于Unity3D引擎的FPS游戲開(kāi)發(fā).pdf
- 基于unity3d引擎的fps游戲開(kāi)發(fā)(1)
- 基于Unity3D的游戲開(kāi)發(fā)與設(shè)計(jì).pdf
- 基于unity3d《叢林冒險(xiǎn)》游戲的設(shè)計(jì)與開(kāi)發(fā)
- 基于Unity3D的體感游戲系統(tǒng)的研究.pdf
- unity3d游戲開(kāi)發(fā)之坐標(biāo)系
- 基于Unity3D坦克戰(zhàn)爭(zhēng)游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Unity3D《叢林冒險(xiǎn)》游戲的設(shè)計(jì)與開(kāi)發(fā).docx
- 基于unity3D的手術(shù)訓(xùn)練游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Unity3D引擎的手機(jī)端游戲的設(shè)計(jì)與開(kāi)發(fā).pdf
- unity3d命令手冊(cè)(1)
- unity3d游戲開(kāi)發(fā)之風(fēng)力區(qū)域、碰撞、剛體等
- 基于unity3d的角色扮演類游戲設(shè)計(jì)-畢業(yè)論文
- 基于Unity3D的手機(jī)游戲客戶端的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Unity3D的一款iOS游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于unity3d引擎的游戲《拯救幸存者》的設(shè)計(jì)與開(kāi)發(fā)
- 基于Unity3D的Android街機(jī)游戲開(kāi)發(fā)關(guān)鍵技術(shù)研究.pdf
- 基于Unity3D的虛擬實(shí)驗(yàn)系統(tǒng)設(shè)計(jì).pdf
評(píng)論
0/150
提交評(píng)論