Skip to content

Root Motion

unity-root-motion-deep-dive

一句话理解

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 worksAnimator componentScripting Root Motion

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0