Unity动画系统

在开始使用Unity时,我曾经为找不到骨骼系统的脚本控制接口而感到迷惑。很多的引擎,比如UE和Ogre,都会把骨骼动画系统功能设计成游戏对象的子功能,为骨骼的控制提供一套特殊的API,包括获取和设置骨骼位置信息,将其他游戏对象挂接到骨骼等。Ogre中还有对场景节点动画的特殊支持。材质动画,比如滚动,缩放,颜色等,一般都是在引擎的材质系统中支持的。在Unity中,这些都变得不一样了,你看不到任何有关骨骼动画和场景动画的API,也没有所谓的材质动画系统,所有这些都被统一在高度抽象的“动画”系统中。

要理解Unity动画系统的设计思想,就要思考一下什么才是真正意义上的动画系统。

对于游戏来说,动画系统可以被描述为在一个时间段内,控制一些对象的属性的变化的系统。这些属性的变化方式可以被描述为一个函数,通过当前的时间计算出值。如果变化的方式无法通过函数描述,就采用关键帧采样方式,在过程中的一些关键帧上赋值,然后插值关键帧来得到当前的值。动画序列用来保存哪些对象的哪些属性需要被动画处理,并且记录描述变化的函数或者关键桢信息。

在Unity中,GameObject本身就可以通过Transform Component建立父子关系,这个结构和一个骨骼没什么区别,所以Unity直接通过GameObject的父子关系来表示骨骼数据。传统意义上的骨骼动画就可以被表示为对这些骨骼GameObject的Transform Component中localPostion,localRotation和localScale变化的描述了。场景节点动画和材质动画也可以通过同样的方式描述。所有的游戏对象属性,都可以通过动画来描述其变化。

对于SkinMesh来说,它仅仅是使用骨骼当前的数据以及自身顶点的权重来完成渲染工作,严格上讲,它并不属于动画系统。

Unity动画系统我认为是Unity所有设计中的亮点之一。从设计角度看,高度抽象,易于扩展,比较完美。

  • 可以在动画中编辑任意对象的任意属性,就算这些属性不是普通意义上的动画属性。比如可以编辑一个动画,同时改变灯光的亮度和颜色,并且缓慢的减小声音的音量。
  • 操作骨骼和操作游戏对象是一样的,不需要特殊处理。在实现游戏功能的过程中,在游戏对象上挂接子对象和在骨骼上挂接子对象是很常用的功能,这在Unity中这两种没有任何区别。要想手动控制一个骨骼的位置,就如同控制一个独立的GameObject一样。Unity中虽然没有直接的Root Motion Extraction支持,但是你可以很容易的通过访问和修改root bone对应的GameObject实现。
  • 对于Ragdoll这种依赖于骨骼的系统,实现起来也通用了很多。

不过这种设计也有一些负面影响,最重要的可能就是效率问题。由于每个骨骼都是一个重量级对象(GameObject),需要很多额外的创建开销(脚本对象),所以在创建一个拥有复杂骨骼的游戏对象时,可能比传统上的要慢一些。至于创建后的运行过程,应该没有什么区别。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值