Root Motion
即自带根位移的动画,有效避免了角色动画和实际位移不同步的现象。
实现Root Motion功能
- 在Animator组件中勾选Apply Root Motion
- 找到角色使用的动画,勾选循环功能(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 Q
和Animator: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
(模型的脚)