Unity动画系统项目实战
Unity动画系统项目实战
本文将从3Dmax动作导出说起,详细介绍Unity中使用的骨骼动画应该如何正确导出,以及导入到Unity以后如何正确设置和组织动画片段,最后再介绍状态机的使用技巧(不会介绍最基础的用法)。
一:从3Dmax动作导出说起。
如图1.1所示:
(1.1)
这是3DMax的导出设置界面,以我们项目为例,标红的三部分是需要我们重点关注的。据我所知,多数项目都不会去用3Dmax里面的相机和灯光,所以标浅蓝色的Cameras和Lights选项,不必太关注,设为不导出就行了。
Animation:该选项下面有两个重要选项,Bake Animation和Resample All。如图1.2所示。
(1.2)
在3DMax里面有一些特性(如控制器和约束)Unity不支持,无法识别,直接导出到Unity里面会发现动作丢失。这个时候就需要选中Bake Animation,烘焙你指定的关键帧范围,并勾选Resample All,重新采样所有帧。
FBX File Format:如图1.3所示,有ASCII和Binary两种格式,建议用默认的Binary形式导出,如果要研究FBX文件的格式,可以用ASCII导出供研究。
(1.3)
Units:这一块需要理解3Dmax和Unity里面的单位关系,否则可能会出现将模型导入Unity以后,发现大小不对的问题。见图1.4,我会举例说明。
(1.4)
如图1.4,若以厘米为导出单位,假设美术同学做了一个高2米的角色模型,那么在FBX里面存储的高度值就是200(不是2哦)。因为Unity的默认单位是米,所以Unity读进去以后,这个模型的高度就变成了200米,明显不对。好在Unity提供了一个缩放因子设置选项,如图1.5。
(1.5)
这个参数的作用就是用来矫正Unity和3DMax单位不一致导致的大小差异。这里设为0.01就合适了。200*0.01=2。
二:动画导入以后的设置和组织。
1.动画文件的设置
如图2.1,Optimize Game Object选项,建议勾选,对性能能起到优化作用,场景内骨骼模型很多的时候,非常明显。
(2.1)
如图2.2,对于动画文件,这个压缩选项非常非常重要,一定要打开,可以减少很多不必要的关键帧,并且这个值越大压缩比率越高,当然动作失真也就更严重,各个项目对动作的要求不一样,在动作不失真的情况下,这个值越大越好。关于Keyframe Reduction和Optimal选项的区别,请参考官方文档,有非常详细的介绍。
(2.2)
模型可设置参数有很多,这两个是我觉得比较容易疏忽也很重要的选项,篇幅所限,就只介绍这两个。
2.动画文件的组织。
如图2.3,Unity里面的动画文件就这三种形式。各有优劣,可以简单概括为一(模型)对一(动画)和一(模型)对多(动画)两类。
个人比较推荐一对一,这样各个动画文件可以完全独立开来,修改方便互不影响。
目前据我了解,大多数项目用的是最左边的一对多的方案。各个项目可自行取舍。
(2.3)
三:状态机的一些技巧。
技巧一:子状态机的使用。
这部分不需要太多文字,一幅图就可以说明。如图3.1,这是有50+动画文件的状态机。
(3.1)
红框选中的子状态机如图3.2。
(3.2)
根据逻辑或者表现,合理划分子状态机,可以将庞大的状态机拆分成一个个独立的子状态机模块,可以大大降低状态机的复杂度。
技巧二:Any State状态的使用。
Any State是一个公共状态出口,他可以表示任何状态,但是只能转出,不能转入。见图3.3,这个角色有可能在任何时候死亡,所以每个状态都有可能转到death状态,第一反应可能就是像这样,每个状态都创建一个到death的状态转移。
(3.3)
现在动作少可能还能忍受,但动作一多,这简直就是个灾难。如图3.4
(3.4)
这个时候Any State就派上用场了。如图3.5,任何动作都有可能跳转到死亡动作,其实只需要创建一个Any State到death的状态转移就行了。
(3.5)
技巧三:同时满足多个状态条件转移会发生什么?
如图3.6,随着动作数量的递增,以同一个状态为起点的状态转移可能有很多,如果同时满足多个状态转移条件,会优先执行转移列表里面最前面(从上到下)的的状态转移。当然最正确的做法应该是从逻辑层避免。以我所在项目为例,之前很多诡异的动作Bug都是由于在同一帧触发了多种状态转移条件导致。
(3.6)
结语:这一块的内容太多,本次仅节选部分容易出错的知识点整理出来。