Unity动画系统项目实战

发表于2016-01-12
评论5 2.8w浏览

Unity动画系统项目实战

本文将从3Dmax动作导出说起,详细介绍Unity中使用的骨骼动画应该如何正确导出,以及导入到Unity以后如何正确设置和组织动画片段,最后再介绍状态机的使用技巧(不会介绍最基础的用法)

 

一:从3Dmax动作导出说起。

1.1所示:

1.1

这是3DMax的导出设置界面,以我们项目为例,标红的三部分是需要我们重点关注的。据我所知,多数项目都不会去用3Dmax里面的相机和灯光,所以标浅蓝色的CamerasLights选项,不必太关注,设为不导出就行了。

Animation:该选项下面有两个重要选项,Bake AnimationResample All1.2所示。

1.2

3DMax里面有一些特性(如控制器和约束)Unity不支持,无法识别,直接导出到Unity里面会发现动作丢失。这个时候就需要选中Bake Animation,烘焙你指定的关键帧范围,勾选Resample All,重新采样所有帧

FBX File Format:如图1.3所示,有ASCIIBinary两种格式,建议用默认的Binary形式导出,如果要研究FBX文件的格式,可以用ASCII导出供研究。

1.3

Units这一块需要理解3DmaxUnity里面的单位关系,否则可能会出现将模型导入Unity以后,发现大小不对的问题。见图1.4,我会举例说明。

1.4

如图1.4,若以厘米为导出单位,假设美术同学做了一个高2米的角色模型,那么在FBX里面存储的高度值就是200(不是2哦)。因为Unity的默认单位是米,所以Unity读进去以后,这个模型的高度就变成了200米,明显不对。好在Unity提供了一个缩放因子设置选项,如图1.5

1.5

这个参数的作用就是用来矫正Unity3DMax单位不一致导致的大小差异。这里设为0.01就合适了。200*0.01=2

二:动画导入以后的设置和组织。

1.动画文件的设置

如图2.1Optimize Game Object选项,建议勾选,对性能能起到优化作用,场景内骨骼模型很多的时候,非常明显。

2.1

如图2.2,对于动画文件,这个压缩选项非常非常重要,一定要打开,可以减少很多不必要的关键帧,并且这个值越大压缩比率越高,当然动作失真也就更严重,各个项目对动作的要求不一样,在动作不失真的情况下,这个值越大越好关于Keyframe ReductionOptimal选项的区别,请参考官方文档,非常详细的介绍

2.2

模型可设置参数有很多,这两个是我觉得比较容易疏忽也很重要的选项,篇幅所限,就只介绍这两个。

2动画文件的组织。

如图2.3Unity里面的动画文件就这三种形式。各有优劣,可以简单概括为一(模型)对一(动画)和一(模型)对多(动画)两类。

个人比较推荐一对一,这样各个动画文件可以完全独立开来,修改方便互不影响。

目前据我了解,大多数项目用的是最左边的一对多的方案。各个项目可自行取舍。

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 Statedeath的状态转移就行了。

3.5

技巧三:同时满足多个状态条件转移会发生什么?

如图3.6,随着动作数量的递增,以同一个状态为起点的状态转移可能有很多,如果同时满足多个状态转移条件,会优先执行转移列表里面最前面(从上到下)的的状态转移。当然最正确的做法应该是从逻辑层避免。以我所在项目为例,之前很多诡异的动作Bug都是由于在同一帧触发了多种状态转移条件导致。

3.6

 

结语:这一块的内容太多,本节选部分容易出错的知识点整理出来。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引