于瀟翔, 彭月橙, 黃心淵
1.北京林業(yè)大學(xué) 信息學(xué)院,北京 100083; 2.北京林業(yè)大學(xué) 藝術(shù)設(shè)計(jì)學(xué)院,北京 100083;3.中國(guó)傳媒大學(xué) 動(dòng)畫(huà)與數(shù)字藝術(shù)學(xué)院,北京 100024)
道具系統(tǒng)是游戲開(kāi)發(fā)和數(shù)字化應(yīng)用的重要環(huán)節(jié),其設(shè)計(jì)與運(yùn)算雖因人而異,卻有規(guī)律可循,然而鮮有研究資料對(duì)其進(jìn)行整理與分析。本文以實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)為基礎(chǔ),以Unity 3D為平臺(tái),對(duì)道具系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行理論研究與實(shí)踐驗(yàn)證。
Unity 3D是由丹麥Unity Technologies公司開(kāi)發(fā)的一款專(zhuān)業(yè)游戲引擎,具有高度優(yōu)化的圖形渲染管道和內(nèi)建的NVIDIA PhysX物理引擎,能較真實(shí)地模擬三維空間下物體的運(yùn)動(dòng)和碰撞,并通過(guò)GUI、粒子系統(tǒng)、聲效等輔助手段給用戶以反饋[1-4],為游戲道具系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)提供更多思路。相較Unreal、CryEngine、Virtools等引擎,其易用、多腳本、跨平臺(tái)等特性[2]也為道具構(gòu)架DIY創(chuàng)造了更多可能。
本研究源于教育部人文社科振興專(zhuān)項(xiàng)計(jì)劃項(xiàng)目“新媒體技術(shù)在非物質(zhì)文化遺產(chǎn)保護(hù)中的應(yīng)用研究”,項(xiàng)目以“竹”為線索,將傣族的文化與藝術(shù)通過(guò)新媒體的形式進(jìn)行呈現(xiàn)。其中,游戲“傣寨接寶”的交互設(shè)計(jì)基于Unity 3D平臺(tái)進(jìn)行開(kāi)發(fā),并實(shí)現(xiàn)了Android平臺(tái)的移植操作,通過(guò)手機(jī)重力感應(yīng)控制角色接收正向道具并規(guī)避負(fù)向道具。本文主要從道具系統(tǒng)的理論設(shè)計(jì)角度,對(duì)項(xiàng)目操作過(guò)程中的實(shí)踐經(jīng)驗(yàn)進(jìn)行總結(jié)和分析。由于篇幅限制,實(shí)踐中其余部分如場(chǎng)景、角色、GUI、粒子系統(tǒng)、聲音等開(kāi)發(fā)環(huán)節(jié)未在此展開(kāi)討論。
道具的屬性在數(shù)量、速度、出現(xiàn)率、作用效果等方面存在差異,以此決定其對(duì)角色和場(chǎng)景的影響力及影響范圍。道具屬性的多樣性和隨機(jī)性越高,游戲的博弈價(jià)值就越大,平衡性[5]也越好。道具的數(shù)據(jù)設(shè)計(jì)需考慮娛樂(lè)主題、游戲性質(zhì)[6]、受眾群體[6]、操作平臺(tái)等多種因素。實(shí)踐中,共設(shè)定5組20種道具,分別對(duì)分?jǐn)?shù)(S)、生命值(HP)、場(chǎng)景復(fù)雜度等方面產(chǎn)生單一或綜合效應(yīng)。其中,前3組(1~6,7~9,10~12)為正向道具(PP),第4組(13~18)為負(fù)向道具(NP),第5組(19~20)為隨機(jī)道具(RP)(圖1)。
表1為部分道具編輯器[5],包含道具的ID、名稱、效果和原始數(shù)據(jù)等,而實(shí)際運(yùn)行中的數(shù)據(jù)=原始數(shù)據(jù)×隨機(jī)值,因此道具的最終行為會(huì)在原始數(shù)據(jù)的基礎(chǔ)上產(chǎn)生小范圍波動(dòng),但總體期望仍呈現(xiàn)原有趨勢(shì)。在處理涉及幾率的數(shù)據(jù)時(shí),盡量使其成對(duì)并呈互補(bǔ)關(guān)系,如0.8/0.2或0.6/0.4,利于后期程序的簡(jiǎn)化。
圖1 道具種類(lèi)(左)、正向道具影響范圍(中)、負(fù)向道具影響范圍(右)Fig.1 Prop category, the effective ranges of positive props, the effective ranges of negative props
游戲進(jìn)程直接影響隨機(jī)值的范圍,實(shí)踐中采用百分遞進(jìn)制,即分?jǐn)?shù)每增加100,隨機(jī)值范圍變動(dòng)一次;當(dāng)分?jǐn)?shù)>1 000后,隨機(jī)值保持在第10等級(jí)。隨機(jī)值變動(dòng)對(duì)道具的影響主要體現(xiàn)在速度的遞增以及正負(fù)向道具數(shù)量的此消彼長(zhǎng),使游戲難度有數(shù)值上的量化。隨機(jī)值變化應(yīng)在總體趨勢(shì)上保持穩(wěn)定,但偶爾反彈可打亂節(jié)奏,如隨機(jī)道具的出現(xiàn)率在特定分?jǐn)?shù)段下的驟增(400~600)。圖2為游戲進(jìn)程與隨機(jī)值的關(guān)系,為簡(jiǎn)化圖表,圖中的隨機(jī)值均為隨機(jī)范圍的最高值,即0.8代表0~0.8之間的所有浮點(diǎn)數(shù)。
道具是在一定范圍內(nèi)基于一定規(guī)律生成并運(yùn)動(dòng)的,因此,需要相對(duì)固定的生成點(diǎn)(起始點(diǎn))限制道具的出現(xiàn)位置;同時(shí),道具需在游戲運(yùn)行后實(shí)時(shí)生成,且在不同階段的生成會(huì)呈現(xiàn)差異(圖2),而其中道具總量的控制和道具的生成選擇均由生成點(diǎn)進(jìn)行調(diào)整。在Unity 3D中,道具可通過(guò)Instantiate()函數(shù)繼承空間原有組件的三維坐標(biāo),因此需在場(chǎng)景中創(chuàng)建一些空組件并將生成腳本(Instantiate Props. js)賦給它們。
表1 道具固有屬性Table 1 Original data of props
圖2 游戲進(jìn)程與隨機(jī)值Fig.2 Game process and random values
實(shí)踐中共設(shè)20個(gè)生成點(diǎn),8個(gè)在頂端(1~8),另外12個(gè)平均分布于兩側(cè)(左9~14,右15~20,y
圖3 生成點(diǎn)信息Fig.3 Generation points
道具生成基于循環(huán)算法,Unity 3D的Update()函數(shù)每幀運(yùn)行一次,可實(shí)現(xiàn)道具的實(shí)時(shí)生成與更新[1,2]。同時(shí),每種道具的生成盡管隨機(jī)卻需符合一定條件(原始數(shù)據(jù)、游戲進(jìn)程等),因此通過(guò)條件語(yǔ)句和函數(shù)返回值控制各個(gè)道具的出現(xiàn)情況(圖4)。
另外,對(duì)于生成的道具,若全部克隆會(huì)占用大量系統(tǒng)資源,而Unity 3D提供的預(yù)制件(Prefab)類(lèi)型,在批量復(fù)制時(shí)數(shù)據(jù)只被調(diào)用一次[1],類(lèi)似Adobe Flash里的元件,能很大程度減少存儲(chǔ)空間,加快運(yùn)行速度。
相對(duì)于GUI繪制的物體運(yùn)動(dòng),創(chuàng)建3D場(chǎng)景能夠帶來(lái)更大的可操作性。因此在實(shí)踐中,攝影機(jī)視角固定且垂直于x-y平面,道具在z方向的無(wú)位移,保證其在二維坐標(biāo)系中運(yùn)動(dòng)。將攝像機(jī)垂直于背景并設(shè)為orthographic,鎖定角色和道具的運(yùn)動(dòng)平面,即可模擬所需的2D效果(圖5)。
道具運(yùn)動(dòng)通常分為4類(lèi):自由落體、斜拋、平拋和反彈。實(shí)踐中,從頂部生成的道具做自由落體運(yùn)動(dòng),從側(cè)面生成點(diǎn)被投擲出的道具有隨機(jī)方向的動(dòng)量,因此做斜拋運(yùn)動(dòng);同時(shí),所有道具均會(huì)受到水平方向隨機(jī)風(fēng)力的作用產(chǎn)生平拋或類(lèi)平拋運(yùn)動(dòng),而當(dāng)?shù)谰吲c側(cè)面產(chǎn)生碰撞后造成反彈(圖6)。
實(shí)踐中,需要為道具添加剛體組件,使其在物理引擎的作用下模擬運(yùn)動(dòng),通過(guò)AddForce()和AddTorque()分別添加拋力與轉(zhuǎn)動(dòng)力[7],即可使剛體得到符合現(xiàn)實(shí)的運(yùn)動(dòng)。圖6為實(shí)踐中道具的運(yùn)動(dòng)規(guī)律,側(cè)面生成點(diǎn)將道具以隨機(jī)力擲出。軌跡1所示為向上斜拋,道具到達(dá)A點(diǎn)(最高點(diǎn))時(shí),初速度v的垂直分量v1為0,道具從A點(diǎn)開(kāi)始做平拋運(yùn)動(dòng)。若s1距離足夠,道具將落至地面;若v過(guò)大或受水平風(fēng)力干擾而使道具在未落地前與側(cè)面(B點(diǎn))產(chǎn)生碰撞,道具反彈并以v′做反向斜拋運(yùn)動(dòng)。在給定的初始動(dòng)量下,拋射角為45°時(shí),拋射距離可達(dá)最遠(yuǎn)[8],因此極有可能與側(cè)面碰撞產(chǎn)生反彈。軌跡2所示為向下斜拋,由于mg+v1通常大于v2且垂直距離相較軌跡1更短,因此雖有一定偏轉(zhuǎn),道具總體仍沿初始動(dòng)量方向直線運(yùn)動(dòng)。軌跡3所示為大角度(>70°)向上斜拋,若初始動(dòng)量較大,則道具極可能與頂部產(chǎn)生碰撞。由于碰撞速度的方向和大小均隨機(jī),為簡(jiǎn)化計(jì)算并避免頂部生成點(diǎn)受到干擾,反彈后道具的碰撞速度歸零,做自由落體運(yùn)動(dòng)。道具的其余運(yùn)動(dòng)形式亦可參照此圖。頂部生成的道具只受mg作用,做自由落體運(yùn)動(dòng)。若下落期間受到水平風(fēng)力干擾,則被賦予水平隨機(jī)初速度(如v2)后做平拋運(yùn)動(dòng),類(lèi)似圖中A點(diǎn)之后的軌跡。
圖4 道具生成流程Fig.4 Generation flow of props
圖7 自轉(zhuǎn)機(jī)制Fig.7 Self-rotation mechanism
圖5 平面化場(chǎng)景Fig.5 Turn the scene into 2 dimensions
圖6 道具運(yùn)動(dòng)規(guī)律Fig.6 Prop motions
Unity 3D的物理引擎[1-4]可模擬較真實(shí)的下落狀態(tài),根據(jù)道具的不同質(zhì)量產(chǎn)生不同的下落速度。此外,可通過(guò)調(diào)整gravity的數(shù)值控制整體速度[2],從而實(shí)現(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); //實(shí)時(shí)更新物體坐標(biāo)
if(PlayerStatus.score<100){//通過(guò)分?jǐn)?shù)調(diào)整速度等級(jí)
gravity = 0.5;}
else if(PlayerStatus.score>=100 && PlayerStatus.score<200){
gravity = 0.5 * 1.1;}……
除自由落體外,Unity 3D也能較好處理斜拋運(yùn)動(dòng)。基于發(fā)射原理,使物體繼承一定的初速度和方向,思路如下。
currentTool=Instantiate(tool1,transform.position,transform.rotation);
//生成道具1,繼承坐標(biāo)和旋轉(zhuǎn)角度
currentTool.rigidbody.velocity=transform.TransformDirection(Vector3(0,0,
throwForce));//利用運(yùn)動(dòng)屬性規(guī)定道具的方向和力
實(shí)踐中,側(cè)面生成點(diǎn)的發(fā)射角度需隨時(shí)變化,使道具產(chǎn)生不同方向的斜拋運(yùn)動(dòng),因此需設(shè)置某種自轉(zhuǎn)機(jī)制使生成點(diǎn)沿x軸以一定速度向一側(cè)旋轉(zhuǎn),同時(shí)以一定頻率向相反方向旋轉(zhuǎn)。此外,還需鉗制旋轉(zhuǎn)范圍(-170°~170°),即生成點(diǎn)不得向上向下垂直發(fā)射道具或超出屏幕(圖7)。
水平隨機(jī)風(fēng)力的實(shí)現(xiàn)可依賴Unity 3D風(fēng)域系統(tǒng)中的定向風(fēng)[2],其中湍流、振幅及頻率等參數(shù)基本固定,只需為基礎(chǔ)風(fēng)力乘以腳本生成的隨機(jī)值。此外,另需2~3個(gè)隨機(jī)值控制風(fēng)域的開(kāi)啟和關(guān)閉以及水平風(fēng)力的作用時(shí)間等。
道具通過(guò)碰撞調(diào)用特定的方法,從而對(duì)角色、場(chǎng)景或其他道具的狀態(tài)實(shí)時(shí)修改。為實(shí)現(xiàn)接觸時(shí)應(yīng)有的反應(yīng),需要為道具是否產(chǎn)生碰撞進(jìn)行檢定,即碰撞檢測(cè)[8,9],通常角色與道具和場(chǎng)景的交互都是通過(guò)碰撞檢測(cè)完成的。就游戲而言,執(zhí)行速度是重要指標(biāo),因?yàn)槭志_的碰撞檢測(cè)很耗時(shí)[8],所以檢測(cè)通?;跇?biāo)準(zhǔn)幾何形體的碰撞外形[10](Sphere Collider, Box Collider和Capsule Collider)實(shí)現(xiàn)。為減少計(jì)算量,實(shí)踐中的道具無(wú)論其結(jié)構(gòu)和材質(zhì)皆視為剛體,碰撞反應(yīng)的處理根據(jù)標(biāo)準(zhǔn)的牛頓碰撞定律。
實(shí)踐中,角色和場(chǎng)景是碰撞檢測(cè)腳本的載體,前者可與所有道具產(chǎn)生碰撞并觸發(fā)相應(yīng)效果,后者只產(chǎn)生反彈或觸發(fā)少量負(fù)向道具的效果。此外,陶罐是較特殊的碰撞體,會(huì)銷(xiāo)毀碰撞的雙方并播放粒子動(dòng)畫(huà)。以下分別為角色碰撞檢測(cè)算法(以某正向物體為例)和陶罐碰撞檢測(cè)算法:
function OnControllerColliderHit(hit:ControllerColliderHit){
if(hit.gameObject.tag=="Drums"){//碰撞體標(biāo)簽為“Drums”(象腳鼓)
Destroy(gameObject);//銷(xiāo)毀碰撞物體
playerStatus.AddScore(score);//調(diào)用相應(yīng)的方法
pickedUp = true;
if(pickedUp){ //判斷是否已經(jīng)拾取,防止重復(fù)
return;}
else if(hit.gameObject.tag=="Hats"){//碰撞體標(biāo)簽為“Hats”(斗笠)……
var potteryBlast:Transform;//為碎片粒子創(chuàng)建一個(gè)接口
function OnCollisionStay(collision:Collision){
//判斷陶罐是否與其他物體產(chǎn)生碰撞
Instantiate(potteryBlast,this.transform.position,this.transform.rotation);
//實(shí)例化碎片粒子對(duì)象
Destroy(gameObject);}
道具的碰撞主要分為3類(lèi):道具與道具、道具與場(chǎng)景、道具與角色。實(shí)踐中,除陶罐外,道具間通常是基于Mesh Collider的簡(jiǎn)單碰撞,無(wú)任何觸發(fā)效果;而陶罐由于其特殊屬性及球體外形,可添加Sphere Collider并觸發(fā)粒子系統(tǒng)實(shí)現(xiàn)破碎效果[1]。道具與場(chǎng)景的碰撞分為兩類(lèi),一是與側(cè)面碰撞對(duì)運(yùn)動(dòng)軌跡產(chǎn)生影響(陶罐直接破碎),二是碰撞后觸發(fā)特定腳本對(duì)場(chǎng)景造成影響,如紙傘(Blockage.js)、竹筍(BamboosGrow.js)等。道具與角色的碰撞情況較多,正負(fù)向和隨機(jī)道具觸發(fā)結(jié)果均不同。
碰撞器除做碰撞檢測(cè)外,也能通過(guò)腳本實(shí)現(xiàn)碰撞過(guò)濾,即設(shè)置當(dāng)前對(duì)象的忽略碰撞體為某類(lèi)對(duì)象;同理需用“tag”進(jìn)行篩選后將其碰撞體的enabled屬性改為false,如芭蕉葉的效果即為角色忽略所有負(fù)向道具的碰撞體。合理運(yùn)用Unity 3D中的碰撞檢測(cè)系統(tǒng)可實(shí)現(xiàn)道具與角色、場(chǎng)景的多種交互。
基于本文的設(shè)計(jì)理念和算法思路,游戲“傣寨接寶”得以開(kāi)發(fā)完成,并形成PC、Web和移動(dòng)終端(Android系統(tǒng))3種不同版本。通過(guò)用戶測(cè)試(60人)調(diào)整道具屬性、場(chǎng)景屬性與各階段隨機(jī)值等,使其較好地平衡了用戶體驗(yàn)與博弈價(jià)值。在道具系統(tǒng)方面,本文主要從4方面進(jìn)行了理論研究與實(shí)踐論證,得到以下結(jié)論:第一,道具屬性的設(shè)定應(yīng)充分考慮各方面因素,通常簡(jiǎn)單分為正向、負(fù)向和隨機(jī)道具3類(lèi),利用道具編輯器進(jìn)行詳細(xì)設(shè)置與管理;此外,道具的實(shí)際運(yùn)行數(shù)據(jù)由于隨機(jī)值的影響而隨游戲進(jìn)程產(chǎn)生波動(dòng)。第二,生成點(diǎn)需控制道具生成的范圍、種類(lèi)和初速度等,生成總量由點(diǎn)的活躍度控制,道具以Prefab形式基于循環(huán)模式實(shí)時(shí)生成。第三,道具運(yùn)動(dòng)通常有自由落體、斜拋、平拋和反彈4種形式,基于剛體組件和物理引擎實(shí)現(xiàn),運(yùn)動(dòng)軌跡有比較明確的規(guī)律可循,但干擾因素(如水平風(fēng)力)可增加運(yùn)動(dòng)的隨機(jī)性。第四,碰撞檢測(cè)通常是基于標(biāo)準(zhǔn)幾何碰撞體的剛體碰撞,分為道具與道具、道具與場(chǎng)景、道具與角色3類(lèi),碰撞后執(zhí)行動(dòng)畫(huà)或銷(xiāo)毀命令。
本文提出的道具系統(tǒng)具有較強(qiáng)的實(shí)用性和擴(kuò)展性,不但適用于同類(lèi)型嚴(yán)肅游戲和休閑游戲,亦可推廣于動(dòng)作(ACT)、冒險(xiǎn)(AVG)、模擬(SLG)、角色扮演(RPG)等[6]游戲。當(dāng)然,本系統(tǒng)中仍存在不足之處,例如Mesh Collider的多樣性導(dǎo)致的不規(guī)則碰撞常產(chǎn)生意料之外的運(yùn)動(dòng),而標(biāo)準(zhǔn)幾何形體的碰撞外形又難以滿足各種形狀,造成碰撞體與道具模型邊緣的間隔過(guò)大而產(chǎn)生失真碰撞。這些問(wèn)題在進(jìn)一步研究中,可通過(guò)優(yōu)化碰撞算法和控制運(yùn)動(dòng)軌跡等方式進(jìn)行改進(jìn)。
在開(kāi)發(fā)平臺(tái)方面,Unity 3D支持大部分自定義素材,對(duì)模型、材質(zhì)、動(dòng)畫(huà)序列幀等均可以腳本的形式進(jìn)行管理與調(diào)用,但道具系統(tǒng)開(kāi)發(fā)仍對(duì)資源的預(yù)處理和整合提出較高要求。此外,Unity 3D的腳本系統(tǒng)、物理引擎、三維圖形渲染引擎、無(wú)縫移植的跨平臺(tái)操作、與Kinect等體感設(shè)備的連結(jié)等[1-4]都為道具系統(tǒng)的設(shè)計(jì)提供了更豐富的技術(shù)資源和更大膽的設(shè)計(jì)思路。因此,將Unity 3D應(yīng)用于道具系統(tǒng)的分析與研究十分具有價(jià)值和潛力,道具帶來(lái)的交互體驗(yàn)也將在新生技術(shù)的支持下以更精彩的面貌迎接廣大用戶。
[參考文獻(xiàn)]
[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] 黃石,李志遠(yuǎn),陳洪.游戲架構(gòu)策劃與設(shè)計(jì)基礎(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] 吳志達(dá).一個(gè)基于Unity 3D游戲引擎的體感游戲研究與實(shí)現(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] 王琦.簡(jiǎn)單游戲引擎的設(shè)計(jì)與開(kāi)發(fā)[D].長(zhǎng)春:吉林大學(xué)檔案館,2012.
Wang Q. Design and Development of Simple Game Engine[D]. Changchun: The Archive of Jinlin University, 2012. (In Chinese)