总览
Motion Warping 解决的是一个非常具体的问题:动画本来往前走 180cm,但 gameplay 目标可能在 150cm、210cm、左前方、移动中、甚至目标朝向还变了。你不想给每个距离都做一套动画,也不想让角色滑步穿帮,于是就在动画的某一段窗口里,把 root motion 按目标重新分配。
一句话心智模型:UMotionWarpingComponent 保存运行时目标和修改器,动画里的 UAnimNotifyState_MotionWarping 标出“哪段 Root Motion 可以被改”,Notify 里的 URootMotionModifier 决定“怎么改”,FMotionWarpingTarget 提供“要对齐到哪里”,最终在角色把 local root motion 转成 world movement 之前完成修改。
先记住五个名字:UMotionWarpingComponent、FMotionWarpingTarget、UAnimNotifyState_MotionWarping、URootMotionModifier_Warp、URootMotionModifier_SkewWarp。这五个能解释绝大多数实际问题。
专题分篇目录
| 篇章 | 你会学到什么 | 读完能做什么 |
|---|---|---|
| 一 | 先做一个能对齐的翻越/近战动画 | 启用插件、加组件、配 Notify、运行时写 Warp Target |
| 二 | Root Motion 基础 | 明白 Motion Warping 改的是动画根运动,不是普通 MoveTo |
| 三 | Component、Adapter 与每帧执行链 | 看懂源码从 Montage 到 ProcessRootMotion 的链路 |
| 四 | Warp Target 怎么设计 | 会用 Transform、Component、Socket、Follow 和 Offset |
| 五 | Notify Window 怎么切 | 会在动画资产里标窗口、命名目标、处理 Montage 内动画 |
| 六 | RootMotionModifier 家族 | 分清 Skew、Scale、Precomputed、AdjustmentBlend、Blueprintable |
| 七 | 平移、旋转、Warp Point 参数 | 会调 Ignore Z、Feet、RotationMethod、AdditionalOffset |
| 八 | 战斗、交互和 GAS 案例 | 会把技能、处决、开门、Smart Object 接到 Motion Warping |
| 九 | Contextual Animation、Pose Search、Mover | 知道它和成组交互、轨迹预测、新移动系统怎么配合 |
| 十 | 调试、联网、性能与生产规范 | 会排查没对齐、滑步、多人不同步和资产配置错误 |
它不是什么
Motion Warping 不是 IK。IK 主要解决手脚末端贴哪里;Motion Warping 解决根节点这段运动怎么到达目标。它也不是普通 CharacterMovement 的 MoveTo,MoveTo 是 gameplay 移动,Motion Warping 是动画 root motion 的局部重定向。
Motion Warping 也不要和 AnimationWarping 插件混淆。AnimationWarping 里有 Stride Warping、Orientation Warping、Slope Warping、Foot Placement 等 AnimGraph 节点,常用于持续移动姿态修正;Motion Warping 主要围绕 Montage/AnimNotify Window,把一段 root motion 对齐到目标点。
什么时候该用
适合使用的场景:翻越、攀爬、处决、近战命中、开门伸手、坐下、进入载具、从任意距离跳到指定落点、Smart Object 交互最后一段对齐。共同特点是“动画有明确到达点或对齐点,实际目标位置每次不同”。
不适合使用的场景:没有 root motion 的普通循环跑步、纯 in-place locomotion、只需要脚贴地、只需要相机或胶囊插值的移动。没有 root motion 的动画也能用某些加位移的配置,但效果和调试成本通常不如先准备合适动画。
最小架构图
Gameplay decides target
-> MotionWarpingComponent.AddOrUpdateWarpTarget(...)
-> Montage plays root-motion animation
-> AnimNotifyState_MotionWarping becomes relevant
-> RootMotionModifier created and becomes Active
-> CharacterMovement asks adapter to process local root motion
-> Modifier returns warped root motion
-> movement applies final transform
项目落地
先做一个最小案例:角色站在离矮墙 120cm、160cm、220cm 三个位置,播放同一个翻越 Montage,最终双脚都落到墙另一侧的同一个 VaultLanding Target。不要先接 GAS、Motion Matching 或 Contextual Animation;先让一段窗口、一个目标、一个 Skew Warp 稳定工作。
常见坑
- 动画没有真正启用 root motion,却期待 Motion Warping 改位移。
- Notify Window 太短,只覆盖最后几帧,角色会突然被拉过去。
WarpTargetName和运行时传入的名字不一致。- 移动目标忘记用
AddOrUpdateWarpTargetFromComponent的bFollowComponent。 - 想对齐脚底却用角色 Actor 原点,或胶囊半高/mesh offset 没算进目标。
- 多人项目让客户端随便改目标,服务器和客户端会看到不同结果。
源码依据
MotionWarping.uplugin 在 UE5.8 中属于 Animation 分类,默认不启用,IsBetaVersion 为 true,Runtime 模块名是 MotionWarping。UMotionWarpingComponent 里保存 Modifiers、WarpTargets 和适配器;UpdateWithContext 扫描 UAnimNotifyState_MotionWarping,创建并更新 URootMotionModifier;ProcessRootMotionPreConvertToWorld 对 Active 的 Modifier 逐个调用 ProcessRootMotion。这就是整套系统的主干。
源码路径索引
Engine/Plugins/Animation/MotionWarping/MotionWarping.upluginMotionWarping/Public/MotionWarpingComponent.hMotionWarping/Public/RootMotionModifier.hMotionWarping/Public/AnimNotifyState_MotionWarping.hMotionWarping/Private/MotionWarpingComponent.cppAnimation/PoseSearch/Private/PoseSearchTrajectoryLibrary.cppExperimental/Mover/Public/MotionWarpingMoverAdapter.h