一、动画的获取

动画获取我一般从免费的mixiamo网址上获取,下载的时候注意选择FBX for unity

二、动画的基本设置

首先将下载到的骨骼模型拖入场景,并将动画模式设置为humanoid,新建一个Animator Controller并将需要的Idle等动画拖入动画控制器

三、Animator控制器中的一些常见问题

1.是否将动画中的位移和旋转信息烘焙到角色动画中? 

unity 做树 unity树的制作_unity 做树

 美工同学在制作动画时,会赋予他对这个动画“独到的理解”,因而会设计一些位移和旋转(比如跨步旋转攻击),当程序同学拿到这个动画时,可以选择是否接受他的这个“独到的理解”,在程序设计中,我们可能只需要动画就可以了,对于其中的偏移和旋转,我们可能并不需要,所以有了这一些相应的选项。这里包括是否将动画中的旋转、Y轴分量、XZ轴分量烘焙到角色的移动中。看到这里可能又会对下图中的Apply Root Motion产生疑惑,下面进行解释。

unity 做树 unity树的制作_游戏开发_02

2.什么是Apply Root Motion

就是在完成动画后,是否将动画的位移和旋转添加到角色上。上面的Bake into Pose含义是:是否将动画自带的位移和旋转表现到物体的动画效果中,然而这个是否应用根动画含义是:是否将动画中的位移偏转等信息应用到角色自身的Tramsform属性中。注意区分二者的区别

 3.什么是Has Exit Time

unity 做树 unity树的制作_unity 做树_03

该动画是否有一个确定的退出时间,也就是说,只要进入这个动画,那么一定要在这个时间结束后动画才会转变。

既然如此,那么Idle动画一般是不要勾上的,因为随时idle都可能会被其他状态打断进入run或者jump,然而攻击动画,一般是有的,因为整个打击动作需要做完。

4.什么是blend tree?

unity 做树 unity树的制作_游戏开发_04

unity 做树 unity树的制作_unity 做树_05

对于同一环境下的紧密相关的动画一般会使用混合树来让他更加流畅,比如这里使用了1维的混合树,只有forward一个参数来实现这三个动画的平滑改变,Threshold是阈值,表示超过这个值后动画则完全由这个状态替代,其他中间值就是对某两个状态的混合 。

5.多个状态怎么确定切换顺序?

unity 做树 unity树的制作_状态机_06

unity 做树 unity树的制作_unity 做树_07

可以看到jump可以切换到其他几个状态,通过点击状态jump,在transitions中可以调整检测顺序,从起跳后,首先是判断向前的速度是不是较大,如果较大就翻滚roll否则就站立,只有在这两个状态不符合才会执行fall动画(因为fall动画的触发条件最少,应该最后检测,否则会覆盖前面的检测)

6.动画参数float/bool/trigger/int分别适用于哪些动画?

上篇文章介绍的获取输入,是将bool值转float值再做平滑操作,最后再将这个值乘以一定的系数转为动画控制器中的forward参数用来调节速度。所以一般用float来做控制移动动画的参数。

bool表示有两种状态,那么一般对应于对立的动画状态,比如防御状态和普通状态,那么正好对应于defense参数的true和false。

trigger表示是否进入某一种状态,而不用考虑状态的退出,这个一般用于跳跃、攻击等动画,表示Onpressed、Onreleased的瞬间。

7.如何判断当前动画在动画控制器中的哪一个?

unity 做树 unity树的制作_unity 做树_08

调用animator的GetCurrentAnimatorStateInfo即可返回当前动画状态机中相应layer层执行的动画的string名字,然后再判断是否相同。注意 GetCurrentAnimatorStateInfo这个方法只接受一个layerindex的int参数,所以要先用layer的名字转成index再使用。

通过上面的介绍应该可以完成一个连贯的状态机,trigger累积的bug以及多层动画后面介绍。