前言
在Unity中,Root Motion(根运动) 是一种通过动画本身驱动角色移动的技术,而非通过代码直接控制位置。下面从核心概念到具体实现的详细解析:
对惹,这里有一 个游戏开发交流小组 ,希望大家可以点击进来一起交流一下开发经验呀!
一、Root Motion 的核心原理
- 动画驱动位移
-
动画师在制作动画时,将角色的根骨骼(如Hips) 进行位移/旋转。
-
Unity在播放动画时,提取这些位移数据并应用到角色对象的
Transform
上。 -
优势:避免角色移动与动画不同步(如滑步问题)。
-
代码控制 vs Root Motion
方式 | 控制方法 | 适用场景 |
---|---|---|
代码控制 | transform.Translate() | 简单移动、物理驱动场景 |
Root Motion | 动画中的骨骼位移驱动 | 复杂动画(攀爬、战斗) |
二、启用 Root Motion 的步骤
1. 模型导入设置
-
在模型导入面板中选择 Rig 标签:
-
- Animation Type :
Humanoid
(人形)或Generic
(通用)。 - Root Node : 仅
Generic
类型需指定根骨骼(如Hips
)。
- Animation Type :
-
Avatar:人形角色需配置骨骼映射。
2. Animator 组件设置
ini
// 在Animator组件中勾选:
Apply Root Motion = true;
- 启用后,Unity会自动将动画中的根运动应用到角色Transform。
3. 动画剪辑设置
-
在动画剪辑的导入设置中:
-
- 确保 Loop Pose 关闭(避免位移循环叠加)。
- 检查 Root Transform Rotation/Position 的烘焙选项。
三、代码控制 Root Motion
通过OnAnimatorMove()
回调覆盖默认的根运动行为:
csharp
using UnityEngine;
public class RootMotionController : MonoBehaviour
{
private Animator animator;
private Vector3 moveDelta;
void Start()
{
animator = GetComponent<Animator>();
}
// 在Animator计算根运动后调用
void OnAnimatorMove()
{
if (animator.applyRootMotion)
{
// 获取当前帧的根运动位移
moveDelta = animator.deltaPosition;
// 自定义修改(如增加速度)
moveDelta *= 1.5f;
// 手动应用位移
transform.position += moveDelta;
// 应用旋转
transform.rotation *= animator.deltaRotation;
}
}
}
四、关键注意事项
- 物理与 Root Motion 冲突
-
若角色使用
Rigidbody
: -
- 设置
Rigidbody.isKinematic = true
避免物理干扰。 - 或在
OnAnimatorMove()
中用Rigidbody.MovePosition()
替代Transform操作。
- 设置
-
动画制作规范
-
根骨骼必须包含位移数据(非原地动画)。
-
避免在动画中意外包含Z轴位移(导致角色浮空)。
-
混合树(Blend Tree)中的根运动
-
混合树会自动混合多个动画的根运动。
-
确保所有子动画的根运动方向一致。
五、调试技巧
- 场景视图预览
-
播放游戏时,在Scene视图观察角色坐标变化。
-
若坐标未改变,检查动画是否包含位移。
-
动画事件日志
csharp
void OnAnimatorMove()
{
Debug.Log("Delta Position: " + animator.deltaPosition);
}
- Root Motion 开关对比
- 切换
Apply Root Motion
复选框,观察角色行为差异。
六、常见问题解决
- 滑步(Foot Slide)
原因:动画位移与代码移动速度不匹配。
方案:在OnAnimatorMove()
中按比例缩放animator.deltaPosition
。 - 角色突然瞬移
原因:动画首尾帧位移未闭合。
方案:在动画软件中确保起始帧与结束帧位置一致。 - 旋转失控
原因:动画包含旋转但代码未处理。
方案:在OnAnimatorMove()
中处理animator.deltaRotation
。
七、进阶用法
- 与 Cinemachine 结合
-
Root Motion 驱动角色,Cinemachine相机跟随,实现电影化运镜。
-
网络同步
-
在多人游戏中同步
Animator
状态而非位置(节省带宽)。 -
动画重定向
-
人形动画的Root Motion可重定向到不同体型角色。
总结 :
Root Motion 是处理高质量角色动画的核心技术,通过动画驱动位移+代码控制修正 ,实现逼真的角色交互。重点在于动画制作规范与OnAnimatorMove()
的灵活运用。
更多教学视