总览
Motion Warping 常常是“局部对齐层”,真正编排动作的可能是 Contextual Animation、GAS、StateTree、Smart Object 或 Motion Matching。把边界分清,读源码就不会天书化。
Contextual Animation
Contextual Animation 解决的是多人/多角色成组交互:谁站哪里、谁播放哪段动画、同步点在哪。源码里会扫描 UAnimNotifyState_MotionWarping,根据 URootMotionModifier_Warp::WarpTargetName 找 Warp Section 的开始和结束时间。
这说明一个实践规则:Warp Target 名字就是交互段落名字。处决、双人开门、拖拽、握手这类动作,不要只叫 Target,应该叫 Finisher.Attacker、Finisher.Victim、Door.Handle 这种可读名字。
Pose Search 轨迹预测
Pose Search 的 Trajectory Library 在模拟 Montage 轨迹时,可以使用 UMotionWarpingMontageTrajectoryAdapter。当 bSimulateWarping 开启并且组件里有 Modifiers,它会进入预测状态,用 Warped Root Motion 更新未来轨迹。
这对 Motion Matching 很重要:如果未来轨迹没有考虑 Motion Warping,选择出来的姿态可能和实际 Warped 运动不一致,角色看起来会“选动画一套,实际移动另一套”。
Mover 接入
UE5.8 的 Mover 插件有 UMotionWarpingMoverAdapter。UMoverComponent 初始化时,如果发现 Actor 上有 UMotionWarpingComponent,就创建这个 Adapter,并绑定 ProcessLocalRootMotionDelegate。Mover 之后把 local root motion 转世界空间前,也能走同一套 Motion Warping。
这意味着新移动系统项目不必放弃 Motion Warping,但要验证 Mover 的 root motion layered move、网络预测和 Montage 数据是否按项目需求接好了。
和 AnimationWarping 的边界
AnimationWarping 插件里的 Stride/Orientation/Slope/FootPlacement 主要是 AnimGraph 姿态修正;Motion Warping 主要是 Montage Window 的 root motion 对齐。一个常见组合是:Motion Warping 把根运动落到目标,Foot Placement 或 IK 负责最后脚底贴地。
使用案例:城市 NPC 坐椅子
Mass/StateTree/Smart Object 决定 NPC 找哪把椅子、什么时候 Claim、走到入口点;Motion Warping 只接管坐下 Montage 最后一段,让角色屁股和椅子对齐;Foot IK 处理脚底接触。每层只做一件事,调试会简单很多。
使用案例:Motion Matching 攻击
战斗 locomotion 用 Motion Matching 选移动姿态;按攻击键后 Ability 锁目标并播放 root motion Montage;Motion Warping 对齐攻击窗口;Pose Search 的未来轨迹模拟要打开 Warping,让相机、预测和后续姿态选择看到一致轨迹。
常见坑
- Contextual Animation 和 Motion Warping 都想决定最终位置,职责重叠。
- Pose Search 预测不模拟 Warping,选姿态和实际移动脱节。
- Mover 项目只加组件,没确认 Adapter 是否绑定。
- 把 AnimationWarping 的 Orientation Warping 当成 Motion Warping 的替代品。
- 多系统都改 root motion,最终谁生效说不清。
源码依据
ContextualAnimTypes.cpp 会扫描 Motion Warping Notify 并按 WarpTargetName 找 Warp Section。PoseSearchTrajectoryLibrary.cpp 在模拟 Montage 时会查找 UMotionWarpingComponent,并使用 UMotionWarpingMontageTrajectoryAdapter。UMoverComponent 初始化阶段发现 UMotionWarpingComponent 后创建 UMotionWarpingMoverAdapter,并在 ConvertLocalRootMotionToWorld 前执行本地 root motion 处理委托。
源码路径索引
Experimental/Animation/ContextualAnimation/Private/ContextualAnimTypes.cppAnimation/PoseSearch/Private/PoseSearchTrajectoryLibrary.cppExperimental/Mover/Public/MotionWarpingMoverAdapter.hExperimental/Mover/Private/MoverComponent.cppAnimation/AnimationWarping/Source/Runtime/Public/AnimationWarpingLibrary.h