Unity动画系统常用知识总结
资源导入需要注意的地方
导入数据的时候,需要看当前模型是否符合unity的正常大小。
方法:创建一个Cube,然后将模型拖到场景中与Cube比较一下大小,如果大小不合适需要在模型中调整,而不是调整unity的游戏物体,避免出现不必要的错误。
常用的组件
Animator 组件
重点介绍一下前三个。
Contorller:游戏状态控制器,控制当前角色处于什么状态(播放对应的动画)。
Avatar:骨骼,当前人物模型的骨骼,通常情况下美工配好。
只要有经过处理的Avatar,我们就可以通过 Animator Controller动画控制器控制人物模型播放一组制定的动画。
所以符合Avatar进行Retaring重定向的条件为:
1、相同的Animator Controller控制器。
2、都有经过成功处理的Avatar资源组件(可以不是同一个Avatar)。
3、可以模型不带任何动画。
Apply Root Motion:简单理解,有的动画自带移动,带有矢量,如果勾选,则表明使用动画自带的位移,不适用则自己手写移动相关的代码。
Avatar Mask 骨骼遮罩
在Project面板创建,点击对应的位置,即可让对应的部位无法播放动画,在Animator Controller中的layer层绑定,绑定完之后该layer层下的所有手臂动画无法播放(该图中)。
Animator Controller
动画状态控制器,控制动画切换的核心组件。
动画切换
常用动画切换,创建两个State,然后点击其中一个右键选择Make Transition
在Parameters中添加跳转参数。
可以通过代码控制
animator.SetBool(“CanMove”, true);
满足条件时就会走向下一个状态,如下图。
Any State
代表当前所有状态都可以转向一个,例如死亡,避免出现连线到处都是。
Has Exit Time:是否有退出时间(是否一定要播放完当前动画才可以切换到下一个)
如何让两个动画同时播放,例如一边走路一边挥手
我上家公司做模拟休闲游戏,有个厂长巡查,需要走路,挥手,边走路边挥手功能,下面探讨一下如何实现。
1、让美工一共做三个动画,分别是走路,挥手,走路+挥手,但是这样非常繁琐,而且维护起来也麻烦(需要不同状态之间来回切换)。
2、使用多个layer层
如图所示,Base Layer控制行走,Arm Layer控制厂长挥手,但是需要注意,Arm Layer的权重需要和Base Layer一样,Blending中需要改为Additive,默认是override覆盖重写。
3、使用混合树,下面单独开一个标题讲混合树,但是混合树更适合多种状态之间的平滑处理,而不是同时实现效果。
混合树
1D
在Animator面板中创建BlendTree,先从最简单的1D讲起。
添加一个BlendValue,然后在BlendTree中添加两个行为,最左边是Walk,最右边是Run,动画系统会自动综合。
也可以在混合树中添加混合树,达到与更多效果综合的效果,我用的不多,此处不再赘述。
2D
2D Directional两个差不多,Freedom比Sample更好用一点,但是需要注意,Freedom中必须要有一个0,0点,即Idle状态。
如上图所示,目前一共有五个状态,分别是向前、后、左、右跑,还有一个待机,我们可以获取用户输入WASD的坐标,GetAxis方法,将对应的值传给动画组件。
animator.SetInteger();
然后角色就会做对应的动画。
ps:时间的那个图标,改为负数则是向后运动。
另外,设置完动画这里最好选择Velocity XZ,代表由XZ的坐标控制动画切换,对应两个参数。
剩下的一个笛卡尔积2D,更加复杂,也适合更多的动画平滑切换,我用的不多,此处不再赘述。
IK反向动力学
简单介绍一下,例如你推门,你给门一个力,相对的门也会给你一个力,他会让你的手臂弯曲,这个就被称之为IK反向动力学。
void OnAnimatorIK(int layerIndex)
{
{
//设置位置权重
animator.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);
//设置旋转权重
animator.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);
animator.SetIKPosition(AvatarIKGoal.RightHand, objPosition.position);
animator.SetIKRotation(AvatarIKGoal.RightHand, objPosition.rotation);
}
}
如上图所示,角色右手受到球的影响,需要注意,需要将layer层的IK Pass勾选上,代码中加上对应的逻辑即可。
动画事件
找到资源的动画,在Event这一栏可以添加事件,选择脚本,与脚本的方法即可。选择固定的某一帧执行。