Appearance
Root Motion
一句话理解
Root Motion 就是:角色的位移由动画本身推动,而不是完全由代码推动。
普通脚本移动:
代码决定角色位置
动画只负责摆姿势Root Motion:
动画里自带角色向前走、翻滚、冲刺的位移
Unity 把这段位移应用到 GameObject 上Apply Root Motion
在 Animator 组件上有一个开关:
c
Apply Root Motion开启:
c
动画的根运动会推动 GameObject 移动关闭:
c
动画只播放姿势,GameObject 位置由代码/物理控制新手做 2D 平台跳跃、俯视角移动,通常先关掉。3D 写实角色、翻滚、冲刺、攀爬、处决动作更常用 Root Motion。
In Place 动画 vs Root Motion 动画
In Place 动画:
c
角色在原地跑
脚在动
身体不真正向前移动适合代码控制:
c
transform.Translate(...)
rb.MovePosition(...)
characterController.Move(...)Root Motion 动画:
c
角色在动画文件里真的向前走了一段距离适合动画控制位移。
Bake Into Pose
在 Animation Clip 的 Inspector 里有:
c
Root Transform Rotation
Root Transform Position (Y)
Root Transform Position (XZ)
Bake Into Pose简单理解:
c
Bake Into Pose 开:这部分运动留在身体姿势里,不推动 GameObject
Bake Into Pose 关:这部分运动可能作为 Root Motion 推动物体比如 Idle 待机通常不希望角色慢慢漂移,所以 Position XZ 常常 Bake。跳跃、翻滚、冲刺这类动作可能保留根位移。
代码接管 Root Motion
高级一点可以用:
c
private Animator animator;
private CharacterController controller;
private void Awake()
{
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
}
private void OnAnimatorMove()
{
Vector3 delta = animator.deltaPosition;
controller.Move(delta);
}animator.deltaPosition 就是这一帧动画产生的位移。你可以自己决定怎么应用它。
什么时候用 Root Motion
适合:
c
3D 写实角色
翻滚
冲刺
攀爬
处决动作
攻击位移
过场动画
动作游戏连招因为这些动作要求“身体动作”和“位移距离”严丝合缝。
不太适合:
c
零基础 2D 平台角色
需要非常精准响应的街机移动
网络同步要求严格的角色控制
动画资源不统一的项目最常见坑
c
Apply Root Motion 开着,代码也在移动角色,导致打架
动画本身不是原地动画,角色莫名滑走
Bake Into Pose 设置错,位移丢失或多出来
不同动画根方向不一致,切换时转向奇怪
用 Root Motion 做新手 2D 控制,手感变软记住这句:
c
代码移动用 In Place 动画。
动画推动用 Root Motion。
Apply Root Motion 是总开关。
Bake Into Pose 决定哪些运动留在姿势里,哪些变成根运动。参考:Unity 官方 How Root Motion works、Animator component、Scripting Root Motion。