Root Motion

即自带根位移的动画,有效避免了角色动画和实际位移不同步的现象。

实现Root Motion功能

  1. 在Animator组件中勾选Apply Root Motion
  2. 找到角色使用的动画,勾选循环功能(Loop Time),并Apply。【对动画的修改可以在FBX文件下完成,也可以找到FBX文件下的动画片段文件,Ctrl+D复制出来,再进行修改】

Root Motion的内部机制

应用了Root Motion之后,Unity会通过动画文件里记录的绝对坐标和方向,以及当前游戏对象的缩放比例计算出游戏对象在上一帧的相对位移相对转角

脚本控制Root Motion

在脚本中控制Root Motion动画

private void OnAnimatorMove()
{
//使用Root Motion实际是使用如下
	transform.position += animator.deltaPosition;//实现相对位移控制
	transform.rotation += animator.deltaRotation;//实现相对转角控制
}

动画文件会直接修改每一帧里游戏对象的坐标值和角度值。
Root Motion会通过相对位移和转角来移动对象。

Generic模型Root Motion动画的原理

Generic一般控制非人形骨骼的动画。
在FBX文件中,点击Rig,新建一个替身(create from this model).

注意:Generic动画的替身系统只需要管理一只骨骼(人形动画需要管理15根骨骼)。
创建新替身后,会出现一个Root node选项。在这里要制定一根骨骼,Unity会对这根骨骼的操作当作对游戏对象的操作。

添加成功后,在动画文件中会自动添加一个Animator:Root QAnimator:Root T

定义:Root Motion在generic动画中指的就是将根骨骼的运动用到游戏对象上

在实际制作中,3D美术会单独给模型制作一根骨骼,这个骨骼会被设置为整个结构的根骨骼

与Root Motion有关的设置

点击FBX文件,或直接点击动画文件,都可以找到与Root Motion有关的设置。

  • Loop Time
  • Root Transform Rotation:绕Y轴的旋转
  • Root Transform Position(Y):沿Y轴的位移
  • Root Transform Position(XZ):沿XZ轴的位移

属性

  • Bake Into Pose:勾选则表示不要将骨骼根节点的位移旋转当作Root Motion的一部分来处理,而是当作普通动画来处理。【右边的红绿色代表Root Motion对角色的变化较小,可以勾选】
    当勾选了Apply Root Motion后,如果没有勾选Bake Into Pose,则对于Hips(物体根节点)的旋转位移就会失效,取而代之会使用Root.Q和Root.T来操作对象;反之相反;
  • Based Upon:游戏对象在动画开始时对准的方向
  • Original:动画本来的朝向/位置(3D美术在制作动画时设置好的)
  • Root Node Rotation/…:对准根骨骼结点的指向方向/位置(算出来的,不准)
  • offset 修改游戏对象在动画开始时对准的方向的偏移量

Humanoid模型Root Motion动画的原理

  • unity通过分析骨骼结构,计算出模型的重心center of mass(也称为Body Transform)
    可以在脚本中使用animator.bodyPosition和bodyRotation来访问。
  • unity会根据具体动画,计算重心在水平平面的投影。将这个投影当作root Motion的根骨骼结点来对待,这个点被称作Root Transform。
    可以在脚本中使用animator.rootPosition和rootRotation来访问。可以简单的将Root Transform当作Root Motion的根骨骼结点。

在 Humanoid动画中,Based Into Pose

  • Root Node Rotation变为了Body Orientation(为计算出来的重心)
  • Root Node Position变为了Center Of Mass(重心)、Feet(模型的脚)