APP下载

基于Unity 3D的道具系统研究与开发

2014-08-22于潇翔彭月橙黄心渊

关键词:碰撞检测游戏运动

于潇翔, 彭月橙, 黄心渊

1.北京林业大学 信息学院,北京 100083; 2.北京林业大学 艺术设计学院,北京 100083;3.中国传媒大学 动画与数字艺术学院,北京 100024)

道具系统是游戏开发和数字化应用的重要环节,其设计与运算虽因人而异,却有规律可循,然而鲜有研究资料对其进行整理与分析。本文以实际开发经验为基础,以Unity 3D为平台,对道具系统的设计与实现进行理论研究与实践验证。

Unity 3D是由丹麦Unity Technologies公司开发的一款专业游戏引擎,具有高度优化的图形渲染管道和内建的NVIDIA PhysX物理引擎,能较真实地模拟三维空间下物体的运动和碰撞,并通过GUI、粒子系统、声效等辅助手段给用户以反馈[1-4],为游戏道具系统的设计与开发提供更多思路。相较Unreal、CryEngine、Virtools等引擎,其易用、多脚本、跨平台等特性[2]也为道具构架DIY创造了更多可能。

本研究源于教育部人文社科振兴专项计划项目“新媒体技术在非物质文化遗产保护中的应用研究”,项目以“竹”为线索,将傣族的文化与艺术通过新媒体的形式进行呈现。其中,游戏“傣寨接宝”的交互设计基于Unity 3D平台进行开发,并实现了Android平台的移植操作,通过手机重力感应控制角色接收正向道具并规避负向道具。本文主要从道具系统的理论设计角度,对项目操作过程中的实践经验进行总结和分析。由于篇幅限制,实践中其余部分如场景、角色、GUI、粒子系统、声音等开发环节未在此展开讨论。

1 系统设计与实现

1.1 道具属性

道具的属性在数量、速度、出现率、作用效果等方面存在差异,以此决定其对角色和场景的影响力及影响范围。道具属性的多样性和随机性越高,游戏的博弈价值就越大,平衡性[5]也越好。道具的数据设计需考虑娱乐主题、游戏性质[6]、受众群体[6]、操作平台等多种因素。实践中,共设定5组20种道具,分别对分数(S)、生命值(HP)、场景复杂度等方面产生单一或综合效应。其中,前3组(1~6,7~9,10~12)为正向道具(PP),第4组(13~18)为负向道具(NP),第5组(19~20)为随机道具(RP)(图1)。

表1为部分道具编辑器[5],包含道具的ID、名称、效果和原始数据等,而实际运行中的数据=原始数据×随机值,因此道具的最终行为会在原始数据的基础上产生小范围波动,但总体期望仍呈现原有趋势。在处理涉及几率的数据时,尽量使其成对并呈互补关系,如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

游戏进程直接影响随机值的范围,实践中采用百分递进制,即分数每增加100,随机值范围变动一次;当分数>1 000后,随机值保持在第10等级。随机值变动对道具的影响主要体现在速度的递增以及正负向道具数量的此消彼长,使游戏难度有数值上的量化。随机值变化应在总体趋势上保持稳定,但偶尔反弹可打乱节奏,如随机道具的出现率在特定分数段下的骤增(400~600)。图2为游戏进程与随机值的关系,为简化图表,图中的随机值均为随机范围的最高值,即0.8代表0~0.8之间的所有浮点数。

1.2 道具生成

道具是在一定范围内基于一定规律生成并运动的,因此,需要相对固定的生成点(起始点)限制道具的出现位置;同时,道具需在游戏运行后实时生成,且在不同阶段的生成会呈现差异(图2),而其中道具总量的控制和道具的生成选择均由生成点进行调整。在Unity 3D中,道具可通过Instantiate()函数继承空间原有组件的三维坐标,因此需在场景中创建一些空组件并将生成脚本(Instantiate Props. js)赋给它们。

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

图2 游戏进程与随机值Fig.2 Game process and random values

实践中共设20个生成点,8个在顶端(1~8),另外12个平均分布于两侧(左9~14,右15~20,y0.5和<0.5的点数相等,而0.5较少,即活跃点、中间点、不活跃点的比重应控制为2∶1∶2,在设计上需使数据成对并呈现互补关系,在分布上需注意疏密与非对称。图3为生成点信息,生成率均为随机范围的最高值。

图3 生成点信息Fig.3 Generation points

道具生成基于循环算法,Unity 3D的Update()函数每帧运行一次,可实现道具的实时生成与更新[1,2]。同时,每种道具的生成尽管随机却需符合一定条件(原始数据、游戏进程等),因此通过条件语句和函数返回值控制各个道具的出现情况(图4)。

另外,对于生成的道具,若全部克隆会占用大量系统资源,而Unity 3D提供的预制件(Prefab)类型,在批量复制时数据只被调用一次[1],类似Adobe Flash里的元件,能很大程度减少存储空间,加快运行速度。

1.3 道具运动规律

相对于GUI绘制的物体运动,创建3D场景能够带来更大的可操作性。因此在实践中,摄影机视角固定且垂直于x-y平面,道具在z方向的无位移,保证其在二维坐标系中运动。将摄像机垂直于背景并设为orthographic,锁定角色和道具的运动平面,即可模拟所需的2D效果(图5)。

道具运动通常分为4类:自由落体、斜抛、平抛和反弹。实践中,从顶部生成的道具做自由落体运动,从侧面生成点被投掷出的道具有随机方向的动量,因此做斜抛运动;同时,所有道具均会受到水平方向随机风力的作用产生平抛或类平抛运动,而当道具与侧面产生碰撞后造成反弹(图6)。

实践中,需要为道具添加刚体组件,使其在物理引擎的作用下模拟运动,通过AddForce()和AddTorque()分别添加抛力与转动力[7],即可使刚体得到符合现实的运动。图6为实践中道具的运动规律,侧面生成点将道具以随机力掷出。轨迹1所示为向上斜抛,道具到达A点(最高点)时,初速度v的垂直分量v1为0,道具从A点开始做平抛运动。若s1距离足够,道具将落至地面;若v过大或受水平风力干扰而使道具在未落地前与侧面(B点)产生碰撞,道具反弹并以v′做反向斜抛运动。在给定的初始动量下,抛射角为45°时,抛射距离可达最远[8],因此极有可能与侧面碰撞产生反弹。轨迹2所示为向下斜抛,由于mg+v1通常大于v2且垂直距离相较轨迹1更短,因此虽有一定偏转,道具总体仍沿初始动量方向直线运动。轨迹3所示为大角度(>70°)向上斜抛,若初始动量较大,则道具极可能与顶部产生碰撞。由于碰撞速度的方向和大小均随机,为简化计算并避免顶部生成点受到干扰,反弹后道具的碰撞速度归零,做自由落体运动。道具的其余运动形式亦可参照此图。顶部生成的道具只受mg作用,做自由落体运动。若下落期间受到水平风力干扰,则被赋予水平随机初速度(如v2)后做平抛运动,类似图中A点之后的轨迹。

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

图7 自转机制Fig.7 Self-rotation mechanism

图5 平面化场景Fig.5 Turn the scene into 2 dimensions

图6 道具运动规律Fig.6 Prop motions

Unity 3D的物理引擎[1-4]可模拟较真实的下落状态,根据道具的不同质量产生不同的下落速度。此外,可通过调整gravity的数值控制整体速度[2],从而实现道具加速、减速以及暂停下落,思路如下。

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){//通过分数调整速度等级

gravity = 0.5;}

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

gravity = 0.5 * 1.1;}……

除自由落体外,Unity 3D也能较好处理斜抛运动。基于发射原理,使物体继承一定的初速度和方向,思路如下。

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

//生成道具1,继承坐标和旋转角度

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

throwForce));//利用运动属性规定道具的方向和力

实践中,侧面生成点的发射角度需随时变化,使道具产生不同方向的斜抛运动,因此需设置某种自转机制使生成点沿x轴以一定速度向一侧旋转,同时以一定频率向相反方向旋转。此外,还需钳制旋转范围(-170°~170°),即生成点不得向上向下垂直发射道具或超出屏幕(图7)。

水平随机风力的实现可依赖Unity 3D风域系统中的定向风[2],其中湍流、振幅及频率等参数基本固定,只需为基础风力乘以脚本生成的随机值。此外,另需2~3个随机值控制风域的开启和关闭以及水平风力的作用时间等。

1.4 碰撞检测

道具通过碰撞调用特定的方法,从而对角色、场景或其他道具的状态实时修改。为实现接触时应有的反应,需要为道具是否产生碰撞进行检定,即碰撞检测[8,9],通常角色与道具和场景的交互都是通过碰撞检测完成的。就游戏而言,执行速度是重要指标,因为十分精确的碰撞检测很耗时[8],所以检测通常基于标准几何形体的碰撞外形[10](Sphere Collider, Box Collider和Capsule Collider)实现。为减少计算量,实践中的道具无论其结构和材质皆视为刚体,碰撞反应的处理根据标准的牛顿碰撞定律。

实践中,角色和场景是碰撞检测脚本的载体,前者可与所有道具产生碰撞并触发相应效果,后者只产生反弹或触发少量负向道具的效果。此外,陶罐是较特殊的碰撞体,会销毁碰撞的双方并播放粒子动画。以下分别为角色碰撞检测算法(以某正向物体为例)和陶罐碰撞检测算法:

function OnControllerColliderHit(hit:ControllerColliderHit){

if(hit.gameObject.tag=="Drums"){//碰撞体标签为“Drums”(象脚鼓)

Destroy(gameObject);//销毁碰撞物体

playerStatus.AddScore(score);//调用相应的方法

pickedUp = true;

if(pickedUp){ //判断是否已经拾取,防止重复

return;}

else if(hit.gameObject.tag=="Hats"){//碰撞体标签为“Hats”(斗笠)……

var potteryBlast:Transform;//为碎片粒子创建一个接口

function OnCollisionStay(collision:Collision){

//判断陶罐是否与其他物体产生碰撞

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

//实例化碎片粒子对象

Destroy(gameObject);}

道具的碰撞主要分为3类:道具与道具、道具与场景、道具与角色。实践中,除陶罐外,道具间通常是基于Mesh Collider的简单碰撞,无任何触发效果;而陶罐由于其特殊属性及球体外形,可添加Sphere Collider并触发粒子系统实现破碎效果[1]。道具与场景的碰撞分为两类,一是与侧面碰撞对运动轨迹产生影响(陶罐直接破碎),二是碰撞后触发特定脚本对场景造成影响,如纸伞(Blockage.js)、竹笋(BamboosGrow.js)等。道具与角色的碰撞情况较多,正负向和随机道具触发结果均不同。

碰撞器除做碰撞检测外,也能通过脚本实现碰撞过滤,即设置当前对象的忽略碰撞体为某类对象;同理需用“tag”进行筛选后将其碰撞体的enabled属性改为false,如芭蕉叶的效果即为角色忽略所有负向道具的碰撞体。合理运用Unity 3D中的碰撞检测系统可实现道具与角色、场景的多种交互。

2 结果与讨论

基于本文的设计理念和算法思路,游戏“傣寨接宝”得以开发完成,并形成PC、Web和移动终端(Android系统)3种不同版本。通过用户测试(60人)调整道具属性、场景属性与各阶段随机值等,使其较好地平衡了用户体验与博弈价值。在道具系统方面,本文主要从4方面进行了理论研究与实践论证,得到以下结论:第一,道具属性的设定应充分考虑各方面因素,通常简单分为正向、负向和随机道具3类,利用道具编辑器进行详细设置与管理;此外,道具的实际运行数据由于随机值的影响而随游戏进程产生波动。第二,生成点需控制道具生成的范围、种类和初速度等,生成总量由点的活跃度控制,道具以Prefab形式基于循环模式实时生成。第三,道具运动通常有自由落体、斜抛、平抛和反弹4种形式,基于刚体组件和物理引擎实现,运动轨迹有比较明确的规律可循,但干扰因素(如水平风力)可增加运动的随机性。第四,碰撞检测通常是基于标准几何碰撞体的刚体碰撞,分为道具与道具、道具与场景、道具与角色3类,碰撞后执行动画或销毁命令。

本文提出的道具系统具有较强的实用性和扩展性,不但适用于同类型严肃游戏和休闲游戏,亦可推广于动作(ACT)、冒险(AVG)、模拟(SLG)、角色扮演(RPG)等[6]游戏。当然,本系统中仍存在不足之处,例如Mesh Collider的多样性导致的不规则碰撞常产生意料之外的运动,而标准几何形体的碰撞外形又难以满足各种形状,造成碰撞体与道具模型边缘的间隔过大而产生失真碰撞。这些问题在进一步研究中,可通过优化碰撞算法和控制运动轨迹等方式进行改进。

在开发平台方面,Unity 3D支持大部分自定义素材,对模型、材质、动画序列帧等均可以脚本的形式进行管理与调用,但道具系统开发仍对资源的预处理和整合提出较高要求。此外,Unity 3D的脚本系统、物理引擎、三维图形渲染引擎、无缝移植的跨平台操作、与Kinect等体感设备的连结等[1-4]都为道具系统的设计提供了更丰富的技术资源和更大胆的设计思路。因此,将Unity 3D应用于道具系统的分析与研究十分具有价值和潜力,道具带来的交互体验也将在新生技术的支持下以更精彩的面貌迎接广大用户。

[参考文献]

[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] 黄石,李志远,陈洪.游戏架构策划与设计基础[M].北京:清华大学出版社,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游戏引擎的体感游戏研究与实现[D].广州:中山大学档案馆,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] 王琦.简单游戏引擎的设计与开发[D].长春:吉林大学档案馆,2012.

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

猜你喜欢

碰撞检测游戏运动
全新预测碰撞检测系统
基于BIM的铁路信号室外设备布置与碰撞检测方法
不正经运动范
数独游戏
疯狂的游戏
空间遥操作预测仿真快速图形碰撞检测算法
爆笑游戏
BIM技术下的某办公楼项目管线碰撞检测
第八章直接逃出游戏
古代都做什么运动