总览
很多 Motion Warping 问题,其实不是 Warping 配错了,而是 root motion 心智模型没建立。先把三种移动分清楚:in-place 动画只是角色原地摆腿,真正移动来自 CharacterMovement;root motion 动画把位移写在根骨上,动画自己推动角色;Motion Warping 是对这段根骨位移做局部重定向。
三种移动方式
| 方式 | 位移来源 | 适合场景 | Motion Warping 是否合适 |
|---|---|---|---|
| CharacterMovement | 速度、加速度、输入、导航 | 日常走跑跳 | 通常不需要 |
| In-place 动画 | 动画原地播放,胶囊移动 | 标准 Locomotion | 不适合直接对齐 |
| Root Motion | 动画根骨提供位移和旋转 | 翻越、处决、攻击踏步 | 最适合 |
Motion Warping 最喜欢“有意图的 root motion”:动画师已经做出一个漂亮的动作,只是目标距离每次略有差异。它不适合把一个完全原地动画硬拉成两米冲刺,那样会像滑行。
执行位置
UMotionWarpingCharacterAdapter 会绑定到 CharacterMovement 的 root motion 处理路径。角色播放 Montage 后,动画系统提取出 local root motion delta;Motion Warping 在这一步拿到 FTransform InRootMotion,让 Active Modifier 修改它,然后 CharacterMovement 再把结果转成世界运动。
Montage extracts local root motion
-> MotionWarpingComponent.ProcessRootMotionPreConvertToWorld
-> Active RootMotionModifier.ProcessRootMotion
-> CharacterMovement converts to world movement
-> actor transform changes
怎么检查动画能不能用
在动画编辑器里打开 Root Motion 预览。角色根骨应该沿动作方向移动,例如翻越时根骨从墙前移动到墙后,攻击踏步时根骨往敌人方向推进。如果根骨不动,Motion Warping 只能靠添加位移去补,调参空间会小很多。
再看窗口内的原始位移:如果窗口只有 5 帧却要补 150cm,速度会爆;如果窗口覆盖整段动作,连起手和收招都被拉,动作会漂。好的窗口通常覆盖“角色主动靠近/跨越”的中段。
使用案例:攻击踏步
假设攻击动画原始 root motion 往前 120cm。实际敌人距离在 90cm 到 150cm 内波动,Motion Warping 很适合;如果敌人在 350cm 外,应该先用普通移动接近,再播放攻击 Montage,而不是让 Warping 硬拖 350cm。
使用案例:攀爬落点
攀爬动画常常有两个关键点:手抓边缘和脚落平台。Motion Warping 只能对齐你指定的目标,复杂动作可以拆两个窗口:第一段对齐手部抓点,第二段对齐落脚点。不要指望一个全程窗口同时解决所有身体部位。
常见坑
- Montage 和 AnimSequence 的 root motion 设置不一致,预览里能动,运行时不动。
- 动画根骨方向和角色 Forward 不一致,Warp Rotation 看起来像绕圈。
- 胶囊原点、Mesh 偏移、脚底位置混为一谈。
- 用 Motion Warping 代替导航接近,导致远距离突然冲刺。
- 把脚贴地问题交给 Motion Warping,实际上更适合 IK 或 Foot Placement。
源码依据
UMotionWarpingUtilities::ExtractRootMotionFromAnimation 可以从动画范围提取 root motion。ProcessRootMotionPreConvertToWorld 的名字已经说明它发生在 local root motion 转 world 之前。FMotionWarpingUpdateContext 带着 Animation、PreviousPosition、CurrentPosition、Weight、PlayRate 和 DeltaSeconds,让 Modifier 知道当前处理的是哪段动画。
源码路径索引
MotionWarping/Public/MotionWarpingComponent.hMotionWarping/Private/MotionWarpingComponent.cppMotionWarping/Public/MotionWarpingCharacterAdapter.hMotionWarping/Public/RootMotionModifier.h