国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Unity 3D的道具系統(tǒng)研究與開發(fā)

2014-08-22 09:13:02于瀟翔彭月橙黃心淵
關(guān)鍵詞:碰撞檢測游戲運動

于瀟翔, 彭月橙, 黃心淵

1.北京林業(yè)大學(xué) 信息學(xué)院,北京 100083; 2.北京林業(yè)大學(xué) 藝術(shù)設(shè)計學(xué)院,北京 100083;3.中國傳媒大學(xué) 動畫與數(shù)字藝術(shù)學(xué)院,北京 100024)

道具系統(tǒng)是游戲開發(fā)和數(shù)字化應(yīng)用的重要環(huán)節(jié),其設(shè)計與運算雖因人而異,卻有規(guī)律可循,然而鮮有研究資料對其進行整理與分析。本文以實際開發(fā)經(jīng)驗為基礎(chǔ),以Unity 3D為平臺,對道具系統(tǒng)的設(shè)計與實現(xiàn)進行理論研究與實踐驗證。

Unity 3D是由丹麥Unity Technologies公司開發(fā)的一款專業(yè)游戲引擎,具有高度優(yōu)化的圖形渲染管道和內(nèi)建的NVIDIA PhysX物理引擎,能較真實地模擬三維空間下物體的運動和碰撞,并通過GUI、粒子系統(tǒng)、聲效等輔助手段給用戶以反饋[1-4],為游戲道具系統(tǒng)的設(shè)計與開發(fā)提供更多思路。相較Unreal、CryEngine、Virtools等引擎,其易用、多腳本、跨平臺等特性[2]也為道具構(gòu)架DIY創(chuàng)造了更多可能。

本研究源于教育部人文社科振興專項計劃項目“新媒體技術(shù)在非物質(zhì)文化遺產(chǎn)保護中的應(yīng)用研究”,項目以“竹”為線索,將傣族的文化與藝術(shù)通過新媒體的形式進行呈現(xiàn)。其中,游戲“傣寨接寶”的交互設(shè)計基于Unity 3D平臺進行開發(fā),并實現(xiàn)了Android平臺的移植操作,通過手機重力感應(yīng)控制角色接收正向道具并規(guī)避負向道具。本文主要從道具系統(tǒng)的理論設(shè)計角度,對項目操作過程中的實踐經(jīng)驗進行總結(jié)和分析。由于篇幅限制,實踐中其余部分如場景、角色、GUI、粒子系統(tǒng)、聲音等開發(fā)環(huán)節(jié)未在此展開討論。

1 系統(tǒng)設(shè)計與實現(xiàn)

1.1 道具屬性

道具的屬性在數(shù)量、速度、出現(xiàn)率、作用效果等方面存在差異,以此決定其對角色和場景的影響力及影響范圍。道具屬性的多樣性和隨機性越高,游戲的博弈價值就越大,平衡性[5]也越好。道具的數(shù)據(jù)設(shè)計需考慮娛樂主題、游戲性質(zhì)[6]、受眾群體[6]、操作平臺等多種因素。實踐中,共設(shè)定5組20種道具,分別對分數(shù)(S)、生命值(HP)、場景復(fù)雜度等方面產(chǎn)生單一或綜合效應(yīng)。其中,前3組(1~6,7~9,10~12)為正向道具(PP),第4組(13~18)為負向道具(NP),第5組(19~20)為隨機道具(RP)(圖1)。

表1為部分道具編輯器[5],包含道具的ID、名稱、效果和原始數(shù)據(jù)等,而實際運行中的數(shù)據(jù)=原始數(shù)據(jù)×隨機值,因此道具的最終行為會在原始數(shù)據(jù)的基礎(chǔ)上產(chǎn)生小范圍波動,但總體期望仍呈現(xiàn)原有趨勢。在處理涉及幾率的數(shù)據(jù)時,盡量使其成對并呈互補關(guān)系,如0.8/0.2或0.6/0.4,利于后期程序的簡化。

圖1 道具種類(左)、正向道具影響范圍(中)、負向道具影響范圍(右)Fig.1 Prop category, the effective ranges of positive props, the effective ranges of negative props

游戲進程直接影響隨機值的范圍,實踐中采用百分遞進制,即分數(shù)每增加100,隨機值范圍變動一次;當分數(shù)>1 000后,隨機值保持在第10等級。隨機值變動對道具的影響主要體現(xiàn)在速度的遞增以及正負向道具數(shù)量的此消彼長,使游戲難度有數(shù)值上的量化。隨機值變化應(yīng)在總體趨勢上保持穩(wěn)定,但偶爾反彈可打亂節(jié)奏,如隨機道具的出現(xiàn)率在特定分數(shù)段下的驟增(400~600)。圖2為游戲進程與隨機值的關(guān)系,為簡化圖表,圖中的隨機值均為隨機范圍的最高值,即0.8代表0~0.8之間的所有浮點數(shù)。

1.2 道具生成

道具是在一定范圍內(nèi)基于一定規(guī)律生成并運動的,因此,需要相對固定的生成點(起始點)限制道具的出現(xiàn)位置;同時,道具需在游戲運行后實時生成,且在不同階段的生成會呈現(xiàn)差異(圖2),而其中道具總量的控制和道具的生成選擇均由生成點進行調(diào)整。在Unity 3D中,道具可通過Instantiate()函數(shù)繼承空間原有組件的三維坐標,因此需在場景中創(chuàng)建一些空組件并將生成腳本(Instantiate Props. js)賦給它們。

表1 道具固有屬性Table 1 Original data of props

圖2 游戲進程與隨機值Fig.2 Game process and random values

實踐中共設(shè)20個生成點,8個在頂端(1~8),另外12個平均分布于兩側(cè)(左9~14,右15~20,y0.5和<0.5的點數(shù)相等,而0.5較少,即活躍點、中間點、不活躍點的比重應(yīng)控制為2∶1∶2,在設(shè)計上需使數(shù)據(jù)成對并呈現(xiàn)互補關(guān)系,在分布上需注意疏密與非對稱。圖3為生成點信息,生成率均為隨機范圍的最高值。

圖3 生成點信息Fig.3 Generation points

道具生成基于循環(huán)算法,Unity 3D的Update()函數(shù)每幀運行一次,可實現(xiàn)道具的實時生成與更新[1,2]。同時,每種道具的生成盡管隨機卻需符合一定條件(原始數(shù)據(jù)、游戲進程等),因此通過條件語句和函數(shù)返回值控制各個道具的出現(xiàn)情況(圖4)。

另外,對于生成的道具,若全部克隆會占用大量系統(tǒng)資源,而Unity 3D提供的預(yù)制件(Prefab)類型,在批量復(fù)制時數(shù)據(jù)只被調(diào)用一次[1],類似Adobe Flash里的元件,能很大程度減少存儲空間,加快運行速度。

1.3 道具運動規(guī)律

相對于GUI繪制的物體運動,創(chuàng)建3D場景能夠帶來更大的可操作性。因此在實踐中,攝影機視角固定且垂直于x-y平面,道具在z方向的無位移,保證其在二維坐標系中運動。將攝像機垂直于背景并設(shè)為orthographic,鎖定角色和道具的運動平面,即可模擬所需的2D效果(圖5)。

道具運動通常分為4類:自由落體、斜拋、平拋和反彈。實踐中,從頂部生成的道具做自由落體運動,從側(cè)面生成點被投擲出的道具有隨機方向的動量,因此做斜拋運動;同時,所有道具均會受到水平方向隨機風力的作用產(chǎn)生平拋或類平拋運動,而當?shù)谰吲c側(cè)面產(chǎn)生碰撞后造成反彈(圖6)。

實踐中,需要為道具添加剛體組件,使其在物理引擎的作用下模擬運動,通過AddForce()和AddTorque()分別添加拋力與轉(zhuǎn)動力[7],即可使剛體得到符合現(xiàn)實的運動。圖6為實踐中道具的運動規(guī)律,側(cè)面生成點將道具以隨機力擲出。軌跡1所示為向上斜拋,道具到達A點(最高點)時,初速度v的垂直分量v1為0,道具從A點開始做平拋運動。若s1距離足夠,道具將落至地面;若v過大或受水平風力干擾而使道具在未落地前與側(cè)面(B點)產(chǎn)生碰撞,道具反彈并以v′做反向斜拋運動。在給定的初始動量下,拋射角為45°時,拋射距離可達最遠[8],因此極有可能與側(cè)面碰撞產(chǎn)生反彈。軌跡2所示為向下斜拋,由于mg+v1通常大于v2且垂直距離相較軌跡1更短,因此雖有一定偏轉(zhuǎn),道具總體仍沿初始動量方向直線運動。軌跡3所示為大角度(>70°)向上斜拋,若初始動量較大,則道具極可能與頂部產(chǎn)生碰撞。由于碰撞速度的方向和大小均隨機,為簡化計算并避免頂部生成點受到干擾,反彈后道具的碰撞速度歸零,做自由落體運動。道具的其余運動形式亦可參照此圖。頂部生成的道具只受mg作用,做自由落體運動。若下落期間受到水平風力干擾,則被賦予水平隨機初速度(如v2)后做平拋運動,類似圖中A點之后的軌跡。

圖4 道具生成流程Fig.4 Generation flow of props

圖7 自轉(zhuǎn)機制Fig.7 Self-rotation mechanism

圖5 平面化場景Fig.5 Turn the scene into 2 dimensions

圖6 道具運動規(guī)律Fig.6 Prop motions

Unity 3D的物理引擎[1-4]可模擬較真實的下落狀態(tài),根據(jù)道具的不同質(zhì)量產(chǎn)生不同的下落速度。此外,可通過調(diào)整gravity的數(shù)值控制整體速度[2],從而實現(xiàn)道具加速、減速以及暫停下落,思路如下。

if(Damage.picked){//判斷是否拾取

gravity = 0;}//下落速度歸零

else{

this.transform.position=newVector3(this.transform.position.x, this.transform.position.y-(gravity*Time.deltaTime), this.transform.position.z); //實時更新物體坐標

if(PlayerStatus.score<100){//通過分數(shù)調(diào)整速度等級

gravity = 0.5;}

else if(PlayerStatus.score>=100 && PlayerStatus.score<200){

gravity = 0.5 * 1.1;}……

除自由落體外,Unity 3D也能較好處理斜拋運動?;诎l(fā)射原理,使物體繼承一定的初速度和方向,思路如下。

currentTool=Instantiate(tool1,transform.position,transform.rotation);

//生成道具1,繼承坐標和旋轉(zhuǎn)角度

currentTool.rigidbody.velocity=transform.TransformDirection(Vector3(0,0,

throwForce));//利用運動屬性規(guī)定道具的方向和力

實踐中,側(cè)面生成點的發(fā)射角度需隨時變化,使道具產(chǎn)生不同方向的斜拋運動,因此需設(shè)置某種自轉(zhuǎn)機制使生成點沿x軸以一定速度向一側(cè)旋轉(zhuǎn),同時以一定頻率向相反方向旋轉(zhuǎn)。此外,還需鉗制旋轉(zhuǎn)范圍(-170°~170°),即生成點不得向上向下垂直發(fā)射道具或超出屏幕(圖7)。

水平隨機風力的實現(xiàn)可依賴Unity 3D風域系統(tǒng)中的定向風[2],其中湍流、振幅及頻率等參數(shù)基本固定,只需為基礎(chǔ)風力乘以腳本生成的隨機值。此外,另需2~3個隨機值控制風域的開啟和關(guān)閉以及水平風力的作用時間等。

1.4 碰撞檢測

道具通過碰撞調(diào)用特定的方法,從而對角色、場景或其他道具的狀態(tài)實時修改。為實現(xiàn)接觸時應(yīng)有的反應(yīng),需要為道具是否產(chǎn)生碰撞進行檢定,即碰撞檢測[8,9],通常角色與道具和場景的交互都是通過碰撞檢測完成的。就游戲而言,執(zhí)行速度是重要指標,因為十分精確的碰撞檢測很耗時[8],所以檢測通?;跇藴蕩缀涡误w的碰撞外形[10](Sphere Collider, Box Collider和Capsule Collider)實現(xiàn)。為減少計算量,實踐中的道具無論其結(jié)構(gòu)和材質(zhì)皆視為剛體,碰撞反應(yīng)的處理根據(jù)標準的牛頓碰撞定律。

實踐中,角色和場景是碰撞檢測腳本的載體,前者可與所有道具產(chǎn)生碰撞并觸發(fā)相應(yīng)效果,后者只產(chǎn)生反彈或觸發(fā)少量負向道具的效果。此外,陶罐是較特殊的碰撞體,會銷毀碰撞的雙方并播放粒子動畫。以下分別為角色碰撞檢測算法(以某正向物體為例)和陶罐碰撞檢測算法:

function OnControllerColliderHit(hit:ControllerColliderHit){

if(hit.gameObject.tag=="Drums"){//碰撞體標簽為“Drums”(象腳鼓)

Destroy(gameObject);//銷毀碰撞物體

playerStatus.AddScore(score);//調(diào)用相應(yīng)的方法

pickedUp = true;

if(pickedUp){ //判斷是否已經(jīng)拾取,防止重復(fù)

return;}

else if(hit.gameObject.tag=="Hats"){//碰撞體標簽為“Hats”(斗笠)……

var potteryBlast:Transform;//為碎片粒子創(chuàng)建一個接口

function OnCollisionStay(collision:Collision){

//判斷陶罐是否與其他物體產(chǎn)生碰撞

Instantiate(potteryBlast,this.transform.position,this.transform.rotation);

//實例化碎片粒子對象

Destroy(gameObject);}

道具的碰撞主要分為3類:道具與道具、道具與場景、道具與角色。實踐中,除陶罐外,道具間通常是基于Mesh Collider的簡單碰撞,無任何觸發(fā)效果;而陶罐由于其特殊屬性及球體外形,可添加Sphere Collider并觸發(fā)粒子系統(tǒng)實現(xiàn)破碎效果[1]。道具與場景的碰撞分為兩類,一是與側(cè)面碰撞對運動軌跡產(chǎn)生影響(陶罐直接破碎),二是碰撞后觸發(fā)特定腳本對場景造成影響,如紙傘(Blockage.js)、竹筍(BamboosGrow.js)等。道具與角色的碰撞情況較多,正負向和隨機道具觸發(fā)結(jié)果均不同。

碰撞器除做碰撞檢測外,也能通過腳本實現(xiàn)碰撞過濾,即設(shè)置當前對象的忽略碰撞體為某類對象;同理需用“tag”進行篩選后將其碰撞體的enabled屬性改為false,如芭蕉葉的效果即為角色忽略所有負向道具的碰撞體。合理運用Unity 3D中的碰撞檢測系統(tǒng)可實現(xiàn)道具與角色、場景的多種交互。

2 結(jié)果與討論

基于本文的設(shè)計理念和算法思路,游戲“傣寨接寶”得以開發(fā)完成,并形成PC、Web和移動終端(Android系統(tǒng))3種不同版本。通過用戶測試(60人)調(diào)整道具屬性、場景屬性與各階段隨機值等,使其較好地平衡了用戶體驗與博弈價值。在道具系統(tǒng)方面,本文主要從4方面進行了理論研究與實踐論證,得到以下結(jié)論:第一,道具屬性的設(shè)定應(yīng)充分考慮各方面因素,通常簡單分為正向、負向和隨機道具3類,利用道具編輯器進行詳細設(shè)置與管理;此外,道具的實際運行數(shù)據(jù)由于隨機值的影響而隨游戲進程產(chǎn)生波動。第二,生成點需控制道具生成的范圍、種類和初速度等,生成總量由點的活躍度控制,道具以Prefab形式基于循環(huán)模式實時生成。第三,道具運動通常有自由落體、斜拋、平拋和反彈4種形式,基于剛體組件和物理引擎實現(xiàn),運動軌跡有比較明確的規(guī)律可循,但干擾因素(如水平風力)可增加運動的隨機性。第四,碰撞檢測通常是基于標準幾何碰撞體的剛體碰撞,分為道具與道具、道具與場景、道具與角色3類,碰撞后執(zhí)行動畫或銷毀命令。

本文提出的道具系統(tǒng)具有較強的實用性和擴展性,不但適用于同類型嚴肅游戲和休閑游戲,亦可推廣于動作(ACT)、冒險(AVG)、模擬(SLG)、角色扮演(RPG)等[6]游戲。當然,本系統(tǒng)中仍存在不足之處,例如Mesh Collider的多樣性導(dǎo)致的不規(guī)則碰撞常產(chǎn)生意料之外的運動,而標準幾何形體的碰撞外形又難以滿足各種形狀,造成碰撞體與道具模型邊緣的間隔過大而產(chǎn)生失真碰撞。這些問題在進一步研究中,可通過優(yōu)化碰撞算法和控制運動軌跡等方式進行改進。

在開發(fā)平臺方面,Unity 3D支持大部分自定義素材,對模型、材質(zhì)、動畫序列幀等均可以腳本的形式進行管理與調(diào)用,但道具系統(tǒng)開發(fā)仍對資源的預(yù)處理和整合提出較高要求。此外,Unity 3D的腳本系統(tǒng)、物理引擎、三維圖形渲染引擎、無縫移植的跨平臺操作、與Kinect等體感設(shè)備的連結(jié)等[1-4]都為道具系統(tǒng)的設(shè)計提供了更豐富的技術(shù)資源和更大膽的設(shè)計思路。因此,將Unity 3D應(yīng)用于道具系統(tǒng)的分析與研究十分具有價值和潛力,道具帶來的交互體驗也將在新生技術(shù)的支持下以更精彩的面貌迎接廣大用戶。

[參考文獻]

[1] Goldstone W. Unity Game Development Essentials[M]. Birmingham: Packt Publishing Ltd, 2009: 99-184.

[2] Menard M, Shi X M, Li Q. Game Development with Unity[M]. Beijing: China Machine Press, 2012: 100-240.

[3] Creighton R H. Unity 3D Game Development by Example[M]. Birmingham: Packt Publishing Ltd, 2010: 77-180.

[4] Blackman S. Beginning 3D Game Development with Unity: All-In-One, Multi-Platform Game Development[M]. New York: Apress, 2010: 93-120, 309-452.

[5] 黃石,李志遠,陳洪.游戲架構(gòu)策劃與設(shè)計基礎(chǔ)[M].北京:清華大學(xué)出版社,2010:94-136.

Huang S, Li Z Y, Chen H. The Basis of Game Structure and Design[M]. Beijing: Tsinghua University Press, 2010: 94-136. (In Chinese)

[6] Adam E. Fundamentals of Game Design[M]. Berkeley: New Riders, 2010: 390-628.

[7] 吳志達.一個基于Unity 3D游戲引擎的體感游戲研究與實現(xiàn)[D].廣州:中山大學(xué)檔案館,2012.

Wu Z D. Research and Implementation of a Somatic Game Based on the Unity 3D Game Engine[D]. Guangzhou: The Archive of Sun Yat-Sen University, 2012. (In Chinese)

[8] Bourg D M, Bywalec B. Physics for Game Developers[M]. Sebastopol: O’Reilly Media Inc, 2013: 93-123.

[9] Millington I. Game Physics Engine Development[M]. San Francisco: Morgan Kaufmann, 2007: 143-374.

[10] 王琦.簡單游戲引擎的設(shè)計與開發(fā)[D].長春:吉林大學(xué)檔案館,2012.

Wang Q. Design and Development of Simple Game Engine[D]. Changchun: The Archive of Jinlin University, 2012. (In Chinese)

猜你喜歡
碰撞檢測游戲運動
全新預(yù)測碰撞檢測系統(tǒng)
基于BIM的鐵路信號室外設(shè)備布置與碰撞檢測方法
Unity3D中碰撞檢測問題的研究
電子測試(2018年1期)2018-04-18 11:53:00
不正經(jīng)運動范
Coco薇(2017年9期)2017-09-07 20:39:29
數(shù)獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
BIM技術(shù)下的某辦公樓項目管線碰撞檢測
第八章直接逃出游戲
古代都做什么運動
南木林县| 即墨市| 明光市| 瑞金市| 河间市| 汨罗市| 东乌珠穆沁旗| 嘉兴市| 南投县| 大田县| 祁连县| 诏安县| 蒲江县| 福贡县| 宜兰县| 滁州市| 阳江市| 资阳市| 宾阳县| 株洲县| 达州市| 阿合奇县| 抚宁县| 荃湾区| 青川县| 恩平市| 金山区| 嵊泗县| 齐齐哈尔市| 阿鲁科尔沁旗| 昂仁县| 吉安市| 葵青区| 浮梁县| 北流市| 镇沅| 无为县| 莱阳市| 兴城市| 阿坝| 普定县|