一:前言

Unity动画系统,也称为Mecanim系统,可以操作模型的各种动画


二:模型动画导入设置


——Scale Factor:缩放系数(因为不同的建模软件使用的单位不同,Unity中默认游戏世界的一个单位等于一米)
——Mesh Compression:网络压缩选项,压缩值越大网格体的文件越小,但有可能导致网格出现错误,要依据实际情况进行选择
——Read/Write Enabled:读/写启用,如果要对模型的网格进行操作必须开启此选项


——Animation Type:动画类型
None:不使用动画
Legacy:旧版本的动画类型,只能用Animation播放动画
Generic:非人形,例如四足动物,只能使用Animator播放动画
Humanoid:人形,只能使用Animator播放动画并且必须在Animator组件上指定Avatar

——Avatar Definition:骨骼设置
Create From This Model:为当前模型创建自身的Avatar骨骼
Copy From Other Avatar:使用其他Avatar骨骼映射到此模型身上
——Optimize Game Objects:勾选后会使模型子节点更简单,隐藏骨骼节点只显示渲染节点


——Import Animation:是否导入模型自带的动画,只有在Animation Type为Generic和Humanoid类型下才可以导入动画,Humanoid类型下可以对动画进行更深度的设置
——Loop Time:动画循环播放
——loop match:动画的第一帧和最后一帧的匹配程度
——BakeInto Pose:首先介绍一下Unity中的两种Tranform变换:Body Transform和Root Transform,Body Transform是指模型动画本身位移或角度的变化,Root Transform是指与Animator同级Transform组件上的变化。在Animator组件上有个Apply Root Motion参数,它有两个作用,一是开启了Root Transform,也就是说模型动画位移或角度的变化也会影响到游戏物体身上的Transform组件上,二是在动画结束后,将Body Transform中的变化应用到模型,注意是是结束的时候才应用,也就是说动画过程中,模型的position、rotate等参数是不变的
勾选上BakeInto Pose代表开启Body Transform,模型动画位移或角度变化不会应用到游戏物体Transform身上,但是模型动画会正常播放,勾选上Apply Root Motion代表开启Root Transform,模型动画位移或角度变化会应用到游戏物体Transform身上
——Based Upon:基于哪个点播放动画
——Offset:如果动画制作的有问题,可以调整模型播放动画的偏移点
——Events:动画事件,可以在动画的指定时间点添加方法事件


三:动画重定向

动画重定向意味着你可以将一组动画应用到各种各样的人形角色模型上,注意动画重定向只能用于Humanoid类型
想象以下如果一个RPG游戏里有100种怪物,每一种怪物的行走,攻击动画都差不多,如果没有动画重定向技术的话美术需要为每一种怪物制作大致相同的动画,即增加了美术的工作量又增加包体大小

将动画类型设置为Humaniod并且生成模型对应的Avatar,之后两个模型就可以使用同一套Animator了


四:混合树(动画混合)


——1D:适用于所有动画只有一个方向的变化,例如站立、走、跑三种动作的混合
——2D Simple Directional:适用于所有动画都具有一定的运动方向,其中任何两段动画的方向都不相同,例如向前走,向后走,向左走,向右走
——2D FreeformDirectional:适用于所有动画都具有一定的运动方向,但是同一方向上可以存在多段动画,例如向前走和向前跑可以同时存在,注意此模型下必须有一个idle动画,也就是处于(0,0)原点位置的
——2D Freeform Cartesian:适用于所有动画都处于同一运动方向,两个Parament代表不同的含义,如角速度线速度,他可以用于类似向前跑,但头朝向左右(只是朝向,并没有向左右运动)


五:MatchTarget

MatchTarget可以将角色的手或脚在特定时间放在特定的位置,使动作与游戏物体更加贴合,例如翻墙、跳跃、攀爬等,想要达到最佳效果主要就是调整最后的两个参数:开始和结束匹配的时间点。
计算将要匹配的位置和旋转角度,调用MatchTarget方法
MatchTarget只能用在BaseLayer层的动画

void Jump(){    if (ani.IsInTransition(0))    {        return;    }    if (ani.GetCurrentAnimatorStateInfo(0).IsName("jump"))    {        Debug.Log(ani.isMatchingTarget);        ani.MatchTarget(matchPos, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, 0), 0.5f, 0.7f);    }}

六:IK

与MatchTarget实现的效果类似,但是可以用在任意层的动画上
IK全称反向运动学,也就是根据子节点的位置推算出父节点的关节变化,而根据父节点的位置推算出子节点的关节变化称作正向运动学
使用IK动画首先动画类型必须是Humanoid类型并在Animator窗口设置中打开IK Pass

public Transform trans1;public Transform trans2;private void OnAnimatorIK(int layerIndex){    if (ani.GetCurrentAnimatorStateInfo(1).IsName("AniName"))    {        ani.SetIKPosition(AvatarIKGoal.RightHand, trans1.position);        ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1);        ani.SetIKPosition(AvatarIKGoal.LeftHand, trans2.position);        ani.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);    }}

七:Avatar Mask(动画融合)

Avatar Mask可以实现两种动画的融合。例如人物有两个动画,走路和挥手,走路动画包括上半身动作和下半身动作,挥手动作只有上半身的挥手动作下半身没有动作,如果想要实现下半身播放走路动画的同时上半身播放挥手动画,可以使用Avatar Mask去实现
动画类型必须是Humanoid类型

——创建Avatar Mask并设置可以控制的部位

红色表示不播放此部位的动作,绿色表示播放此部位的动作

——设置状态机层级参数

新建一个状态机层,设置Avatar Mask并将权重设置为1
Blending一般情况下选择Override覆盖模式,Additive叠加模式仅适用于每个层控制单独部位的动画