2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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>  [摘 要]游戲開發(fā)者總是容易被現(xiàn)實(shí)世界的各種物理邏輯,真實(shí)規(guī)律所束縛。文章講述一種新的游戲開發(fā)思維,介紹如何利用魔術(shù)思維開發(fā)游戲,從而使程序在不改變需求的情況下,更有效率,更加靈活,擴(kuò)展性更高。研究通過對(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ì)游戲開發(fā)者提出了更高的要求。例如

3、在射擊游戲中,如何為用戶提供逼真的射擊感受十分重要。在進(jìn)行游戲開發(fā)時(shí),很多難題,不如換一個(gè)視角來觀察,換一種方式來解決,可能獲得意想不到的效果。文章提出一種從魔術(shù)思維出發(fā)的方式,通過一些偽技巧,把一些真實(shí)需求魔術(shù)化地呈現(xiàn)給玩家。讓游戲開發(fā)不僅僅是一種技術(shù),更提升為一種藝術(shù)。 </p><p>  2 游戲《立方殺陣》開發(fā)前期遇到的困擾 </p><p> ?。?)要讓玩家感覺到房間數(shù)量巨大

4、,有種身處巨型密室的感覺,然而場(chǎng)景中構(gòu)建過多房間會(huì)導(dǎo)致游戲幀數(shù)低于10幀。 </p><p>  《立方殺陣》是從電影《異次元?dú)㈥嚒分蝎@取靈感進(jìn)而改編的獨(dú)立游戲。根據(jù)電影中的設(shè)定,該殺陣是一個(gè)由26×26×26=17576個(gè)小立方體房間組成的巨型立方體密室。所以,如果要讓玩家可以在密室中像電影一樣逃脫,并獲得樂趣,顯然必須有非常多的立方體房間才可以滿足游戲的需求。然而,在Unity3D中,經(jīng)過

5、測(cè)試,當(dāng)立方體房間超過4×4×4=64個(gè)房間的時(shí)候,還沒運(yùn)行游戲,就已經(jīng)開始卡頻了。64個(gè)房間,即立方體每個(gè)方向4個(gè)房間,無法讓玩家感受密室的龐大。 </p><p> ?。?)子彈速度過快導(dǎo)致無碰撞穿越。 </p><p>  Unity3D中,物體的移動(dòng)速度過快,極大可能導(dǎo)致在碰撞另外的物體時(shí),產(chǎn)生穿越,從而無法發(fā)射碰撞檢測(cè)。根據(jù)射擊系統(tǒng)的需求,子彈是必須出現(xiàn)的。如

6、果子彈速度不夠快,那么玩家的射擊體驗(yàn)將會(huì)大大下降,游戲沉浸感會(huì)大大減少。子彈速度要達(dá)到真實(shí)世界的子彈速度,又會(huì)導(dǎo)致穿越現(xiàn)象,有時(shí)候射擊了物體但沒反應(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的開源語言,因此程序員可用C#,JavaScript等加以編寫[1]。文章將采用C#語言進(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)景可以按照電影的世界來構(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ù)。可以看到在房間數(shù)量超過1萬間的情況下,當(dāng)前Draw Call(Unity每次在準(zhǔn)備數(shù)據(jù)并通知GPU渲染的過程稱為一次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)存消耗增加,并且該方法也沒有達(dá)到射擊體驗(yàn)的需求。   4 魔術(shù)思維實(shí)現(xiàn)需求的方式 </p><p>  (1)魔術(shù)思維實(shí)現(xiàn)需求1:使玩家體驗(yàn)到身處許多房間的巨型密室。 </p><p>

17、;  魔術(shù)師戒指握在手心,在觀眾眼前輕輕吹一口氣,再打開手,戒指消失了,接下來魔術(shù)師讓觀眾打開桌子上的盒子,觀眾發(fā)現(xiàn),戒指赫然出現(xiàn)在盒子里。 </p><p>  這個(gè)魔術(shù)里面用到了2種思維,分別是錯(cuò)誤引導(dǎo)思維和預(yù)制體思維。要解決立方殺陣游戲場(chǎng)景房間過多問題,用兩種思維即可解決。 </p><p>  首先利用錯(cuò)誤引導(dǎo)思維,在游戲介紹或者開頭CG上告訴玩家這是個(gè)巨型立方體。在游戲開始時(shí)讓玩

18、家處于一個(gè)已初始化的房間中。玩家在開門前,無法得知房間外的情況,事實(shí)上此時(shí)只有一個(gè)房間。 </p><p>  而預(yù)制體思維說的是盒子里的戒指其實(shí)一開始就存在,和消失的戒指一模一樣,早就放在盒子里,必要的時(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)玩家開啟某個(gè)門時(shí),實(shí)例化一個(gè)立方體房間在對(duì)應(yīng)的下一個(gè)房間位置上,當(dāng)門被完全打開時(shí),玩家看到的,是另一個(gè)立方體房間。以此類推,如此,多房間體驗(yàn)需求就解決。 </p><p>  玩家在房間中進(jìn)行游戲時(shí),類似于虛擬漫游項(xiàng)目的觀房,使用動(dòng)態(tài)的、有交互功能的三維觀 , 能夠使整個(gè)看房過程更加生動(dòng),使用戶有一種身臨其境的感覺[5]。同樣,在有交互性與三維的前提下,這種開發(fā)思維也達(dá)到了身臨其境的

20、房間體驗(yàn)。 </p><p>  無論使用哪種方式,都會(huì)導(dǎo)致一個(gè)問題,便是隨著玩家打開的房間越來越多,超過64個(gè)房間時(shí),會(huì)導(dǎo)致游戲很卡。解決方式是利用改進(jìn)的先進(jìn)先出算法刪除舊房間。由于《立方殺陣》中玩家經(jīng)過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)過測(cè)試,當(dāng)房間數(shù)量為8間時(shí),游戲運(yùn)行對(duì)CPU占用的時(shí)間為每幀0.1ms,對(duì)比前一開發(fā)方案減少了36%。對(duì)攝像機(jī)渲染值(消耗顯存)占有率達(dá)到1.2%左右。對(duì)比前一開發(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>  (2)魔術(shù)思維實(shí)現(xiàn)需求2:子彈達(dá)到真實(shí)世界射擊體驗(yàn) </p><p>  魔術(shù)思維開發(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ù)師只是在假裝扔飛刀,接下來,事先安裝在轉(zhuǎn)盤背面的彈簧裝置,從轉(zhuǎn)盤背后反方向彈出一把插在轉(zhuǎn)板上的飛刀。 </p><p>  實(shí)例化子彈每次都會(huì)產(chǎn)生一次內(nèi)存損耗。為解決該問題,采用魔術(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í),在開發(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 其他問題的魔術(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>  (2)場(chǎng)景初始化過于突兀。 </p><p>  一個(gè)游戲場(chǎng)景需要初始化許多物體,出現(xiàn)逐漸渲染周圍世界的效果,或者主角模型的坐標(biāo)需要重置等。這些效果會(huì)導(dǎo)致玩家看到一些如突然瞬移,一棵樹突然出現(xiàn)等奇怪的現(xiàn)象,降低游戲沉浸

33、度。在場(chǎng)景開始時(shí),保留讀取界面的UI圖片或背景,使其與讀取界面無縫結(jié)合,等待場(chǎng)景物體初始化完成后(一般不會(huì)超過2秒),讓玩家按下某個(gè)按鍵來開始游戲,可掩蓋一些不應(yīng)該出現(xiàn)的效果,使游戲平滑過場(chǎng)。 </p><p><b>  6 總結(jié)與展望 </b></p><p>  通過對(duì)《立方殺陣》一部分游戲模塊的分析可知,在合理的情況下,使用魔術(shù)思維的游戲開發(fā)方式讓游戲的程序結(jié)

34、構(gòu)更加靈活,效率更高,為游戲需求的實(shí)現(xiàn)增加了更多的考慮方向,更讓游戲開發(fā)從技術(shù)提升為另一種領(lǐng)域的藝術(shù)。 </p><p>  但魔術(shù)思維并不適應(yīng)所有的游戲開發(fā)需求,某些需求如果需要非常清楚的展示整個(gè)效果的實(shí)現(xiàn)過程,那么魔術(shù)思維這種偽實(shí)現(xiàn)方式便無法發(fā)揮作用,希望未來能繼續(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論