Unity Mecanim Animation System

1. Mecanim 动画系统

基于状态机的动画控制系统,是一个面向动画应用的动画系统 动画的制作编辑(Animation)功能相对有限 重在如何从资源中提取动画,配置融合动画,应用动画,复用动画 以及为实际开发提供可视化的GUI编辑和监视功能

2. 角色模型动画的创建与应用工作流程

  1. 建模
  2. 制作动画,导出资源
  3. Unity 提取人物模型,提取动画切片 Clip
  4. 通过 Mecanim 动画系统进行编辑:创建动画状态,动画的融合、过渡调整,设定过渡条件,结合脚本控制

3. AnimtionClip 动画片段

Unity 中的动画片段分为两种 通过剪辑 FBX 中的整段动画生成的动画切片(Clip) 以及由 Animation 窗口创建出的动画片段(Clip)

4. AnimationEvent 动画事件

通过AnimatorEvent动画事件 我们可以在动画播放到某个特定位置时,触发脚本中的特定方法(发射子弹,生成特效,受击信息)

5. Animator 动画状态机

5.1 脚本说明

Controller: 状态机的配置资源文件,整合Clip资源,创建状态机状态(State),设置动画过渡与融合

Avatar: 动画节点导引替身,与动画复用(尤其是人形动画复用)有关,通过配置和应用Avatar,可以实现不同FBX模型之间的动画复用

Apply Root Motion: 是否将动画中的根节点位移,植入到Unity中的物体位移上

Update Mode: 状态机播放动画的时间模式

5.2 动画参数的类型有 4 种

  1. Float:就是 C# 种的单精度浮点性
  2. Int:C# 中的整形
  3. Bool:C# 中的布尔型
  4. Trigger:一种特殊的布尔性参数,它作为触发条件,触发过渡后会被自动置为 false
    Trigger 的触发必须对当前状态机的运行状态进行判断
    一个Trigger,只能对应触发一个过渡,而一个布尔可以触发不同动画分层中的多个过渡

5.3 过渡线配置

选中一条过渡线 Gizmo,我们可以在右侧 Inspector 窗口中配置这个过渡的相关属性
Interruption Source:
Current State 或 NextState指该过渡,允许被其它从 CurrentState 或 NextState 出发的过渡打断
CurrentStateThenNextState,指从 CurrentState 或 NextState 出发的过渡均可打断
但 CurrentState 出发的过渡打断优先于 NextState 出发的过渡

5.4 State 配置

Speed:动画片段的播放速度(置为-1可倒放动画)
Multiplier:Speed的一个倍率因子,需要勾选Parameter可选定一个浮点动画参数来动态控制这个因子
Mirror:是否进行左右翻转
Cycle Offset:偏移量(和之前Clip中的偏移相同),0到1之间的浮点值,可勾选Parameter选定一个浮点动画参数来动态控制
Foot IK:脚部的IK反向力学修正,针对人物上坡,上楼梯时的踏空而行进行修正
Write Default: 主要是针对人物骨骼之外的一些节点,例如武器,跟随物,这些节点只在部分互动动作之中被用到,那些没有使用该节点的动作执行时,是要让节点处于初始状态,还是上一次互动动作末尾时的状态

5.5 Animator Override Controller

是一种Controller状态机配置资源文件,它可以继承一种指定的Animator Controller,并在此基础上进行修改,从而在复用Controller的同时,做出针对性的修改

OverrideController 只能继承自 Controller,不能形成继承树

5.6 Apply Root Motion

RootMotion 总共有三种状态,勾选,不勾选 Handled by Script
Hadndled by Script 状态,是由于我们在 Animator 所在物体的脚本中, 定义方法 OnAnimatorMove()

5.7 Avatar的作用与配置

Avatar替身(人物节点导引),主要与动画的复用,尤其是人物动画的复用有关

5.8 动画系统脚本 API

// 这里的名称要与Animator窗口中,动画参数的名称对应
int runHash=Animator.StringToHash("Run");

// 通常对于调用频繁的动画参数我们使用哈希值进行快速访问
// 下面设置/获取动画参数均有使用String参数名称进行映射的重载和使用哈希值进行映射的重载

// 获取设置Float类型参数,通常结合Input轴线
animator.GetFloat(blendHash);animator.SetFloat(blendHash, Input.GetAxis("Horizontal"));

// 获取设置Int类型参数
animator.GetInteger(intHash);animator.SetInteger(intHash,Number);

// 获取设置Bool类型参数
animator.GetBool(boolHash);animator.SetBool(boolHash, true / false);

// 触发,取消触发Trigger的方法
animator.SetTrigger(jumpHash);animator.ResetTrigger(jumpHash);

// 我们先预设状态的哈希值
int idleHash = Animator.StringToHash("Idle");

int layerID = animator.GetLayerIndex("Base Layer");
animatorStateInfo = animator.GetCurrentAnimatorStateInfo(layerID);

// 判定当前状态是否是Idle状态
if (animatorStateInfo.shortNameHash == idleHash)
{
    Debug.Log("OnState Idle");
}

// 过渡状态的 nameHash userNameHash
AnimatorTransitionInfo transitionInfo;
transitionInfo = animator.GetAnimatorTransitionInfo(layerID);
Debug.Log(transitionInfo.nameHash);
Debug.Log(transitionInfo.userNameHash);

5.9 动画分层

动画分层可以让我们使用多层动画来对人物/角色不同组分分别配置动画,再使用一定的混合模式,从而实现一些复杂的效果

5.10 IK 反向动力学

5.11 BlendTree 混合树

BlendTree的作用是将多个动画状态混合成为一个动画状态,并通过动画参数来影响状态的输出结果。
使用 BlendTree 的目的是应对状态机的高耦合导致的低扩展缺点,尤其是在人物运动相关的动作(前后左右的行走奔跑)这类繁多的动作
在状态过渡时 BlendTree 就相当于一个普通的 State,可以创建指向和指出 BlendTree 的过渡。BlendTree 的 State 配置也和普通 State 一致

–EOF–

王小兵 /
Published under (CC) BY-NC-SA in categories Unity  tagged with Unity