UE5.8 Motion Warping 专题系列

UE5.8 Motion Warping 专题(九):Contextual Animation、Pose Search、Mover 怎么配合

讲 Motion Warping 与 Contextual Animation 的 Warp Section、Pose Search 轨迹预测、Mover MotionWarpingMoverAdapter、AnimationWarping 插件之间的职责边界。

总览

Motion Warping 常常是“局部对齐层”,真正编排动作的可能是 Contextual Animation、GAS、StateTree、Smart Object 或 Motion Matching。把边界分清,读源码就不会天书化。

UE5.8 Motion Warping 专题(九):Contextual Animation、Pose Search、Mover 怎么配合 配图
Motion Warping 经常不是单独工作,而是作为交互、轨迹预测和新移动系统的对齐层。

Contextual Animation

Contextual Animation 解决的是多人/多角色成组交互:谁站哪里、谁播放哪段动画、同步点在哪。源码里会扫描 UAnimNotifyState_MotionWarping,根据 URootMotionModifier_Warp::WarpTargetName 找 Warp Section 的开始和结束时间。

这说明一个实践规则:Warp Target 名字就是交互段落名字。处决、双人开门、拖拽、握手这类动作,不要只叫 Target,应该叫 Finisher.AttackerFinisher.VictimDoor.Handle 这种可读名字。

Pose Search 轨迹预测

Pose Search 的 Trajectory Library 在模拟 Montage 轨迹时,可以使用 UMotionWarpingMontageTrajectoryAdapter。当 bSimulateWarping 开启并且组件里有 Modifiers,它会进入预测状态,用 Warped Root Motion 更新未来轨迹。

这对 Motion Matching 很重要:如果未来轨迹没有考虑 Motion Warping,选择出来的姿态可能和实际 Warped 运动不一致,角色看起来会“选动画一套,实际移动另一套”。

Mover 接入

UE5.8 的 Mover 插件有 UMotionWarpingMoverAdapterUMoverComponent 初始化时,如果发现 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,并使用 UMotionWarpingMontageTrajectoryAdapterUMoverComponent 初始化阶段发现 UMotionWarpingComponent 后创建 UMotionWarpingMoverAdapter,并在 ConvertLocalRootMotionToWorld 前执行本地 root motion 处理委托。

源码路径索引

  • Experimental/Animation/ContextualAnimation/Private/ContextualAnimTypes.cpp
  • Animation/PoseSearch/Private/PoseSearchTrajectoryLibrary.cpp
  • Experimental/Mover/Public/MotionWarpingMoverAdapter.h
  • Experimental/Mover/Private/MoverComponent.cpp
  • Animation/AnimationWarping/Source/Runtime/Public/AnimationWarpingLibrary.h