Unity动画的RootMotion
概述
本文旨在快速引导新手熟悉Unity动画的RootMotion,达到在项目开发中可以迅速上手的目的。
什么是 Root Motion?
Root Motion 是指动画 Clip 中包含角色根节点的位置/旋转变化,由 Animator 组件驱动角色位移,无需代码控制。
作用与适用环境
- 视觉逼真:完美同步脚步与环境,避免滑脚现象,动画效果更真实 。
- 适合复杂动作与 AI:如冲锋、攻击、跨越障碍等,动画控制运动更自然 。
- 不适合:
- 需精准位置控制的场景(如策略、格子移动、多人联机)因融合 navmesh 或同步会复杂 。
- 多人联机游戏,运动预测需统一由程序控制。
使用示例:基本配置 + 脚本驱动运动
1. 导入动画 + 配置 Root Motion 参数
-
选中动画资源,打开 Inspector → 勾选
Root Transform Rotation
,Position (Y)
,Position (XZ)
的 “Based Upon” 或关闭 “Bake Into Pose”。
-
在 Animator 中勾选 “Apply Root Motion”。
2. 手动驱动(可选方式)
如果动画本身是 in-place,而你想手动应用 Root Motion,可参考 Unity Manual 中的脚本方式。
void OnAnimatorMove() {Animator anim = GetComponent<Animator>();Vector3 delta = anim.deltaPosition; transform.position += delta;
}
3. 混合方式(Hybrid)
许多项目采用「关键动作由 Root Motion 驱动,普通移动由代码控制」:
-
行走/奔跑用代码控制运动;
-
攻击、冲撞、翻滚等复杂动作启用 Apply Root Motion;
-
开关方式可动态切换:
animator.applyRootMotion = true/false;
优缺点对比
优点 | 缺点 |
---|---|
● 动画与位移自然结合,脚步不滑 | ● 导航、碰撞、物理整合复杂 |
● AI或复杂动作很适用 | ● 调整整体运动速度困难(需重新烘焙动画) |
● 准确执行动作设计 | ● 联机/多人环境下同步不便 |
使用注意事项
- 导出动画时确保根节点运动已正确设置;
- 导入的动画需检查 “Bake Into Pose” 状态;
- 混合使用时 切换时机 要明确;
- 与 NavMeshAgent、Rigidbody、碰撞体结合需额外处理位置与同步;
- 注意 多人同步 的一致性问题。
建议应用流程
-
评估动画复杂性:仅简单循环图不适用 RM,攻击、跳跃、翻滚等复杂动作优选 RM;
-
混合策略:主移动由脚本控制,关键技巧(如突进)由 RM 驱动;
-
测试与调整:检查 navmesh、碰撞是否正常,是否出现抖动或偏差;
-
团队合作流程明确:UI 动画与代码需同步更新,避免出差错。
总结
-
是什么:动画根节点驱动运动;
-
作用:提升动画自然表现;
-
适用:复杂动作、AI控制、单机游戏;
-
实例:开关
Apply Root Motion
,或手写OnAnimatorMove()
; -
优缺点:优点在于真实,缺点在于整合复杂;
-
注意:需配合 navmesh/碰撞逻辑,小团队或简单项目可优先考虑混合方式。