总览
Motion Warping 的窗口是动画资产和 gameplay 的交界线。窗口告诉系统:从这个时间到那个时间,这段 root motion 可以被重新分配。窗口切错了,代码再正确也会滑、跳、扭、瞬移。
窗口选择原则
| 动作 | 推荐窗口 | 避免覆盖 |
|---|---|---|
| 近战踏步 | 起手踏步到命中前 | 命中后收招 |
| 翻越 | 起跳/跨越主体段 | 预备蹲下和落地恢复 |
| 攀爬 | 抓边到身体上平台 | 纯手部 IK 段 |
| 处决 | 两人接近和锁定段 | 伤害定格和镜头表现段 |
| 开门 | 站位调整段 | 手部贴把手段 |
窗口应该覆盖“角色主动靠近目标”的运动,而不是所有看起来相关的帧。
多窗口和多目标
复杂动画可以有多个 UAnimNotifyState_MotionWarping。例如攀爬:
Climb.HandTarget:让角色靠近边缘,窗口较短。Climb.LandingTarget:让角色身体最终落到平台,窗口覆盖上爬主体段。
这比一个巨大窗口自然,因为不同阶段对齐的目标不同。Contextual Animation 源码里也会根据 Warp Target 名字寻找 Warp Section,说明“按目标分段”是引擎内部也在使用的模式。
Montage 内动画搜索
UMotionWarpingComponent 有 bSearchForWindowsInAnimsWithinMontages。如果你的 Notify 加在 Montage 自身轨道上,默认能扫到;如果 Notify 加在 Montage 引用的 AnimSequence 里,需要考虑这个开关。项目里最好统一规范,避免有的动画把 Notify 放 Sequence,有的放 Montage。
资产验收步骤
- 在动画编辑器里显示 root motion 轨迹。
- 给窗口开始帧、结束帧截图或打标记。
- 用三种距离测试:略近、标准、略远。
- 看窗口内速度是否突然变大。
- 看窗口外是否还在被拉。
- 确认
WarpTargetName和项目常量一致。
使用案例:处决动画
处决通常由攻击者和受害者两个动画组成。攻击者对齐到受害者相对位置,受害者也可能要对齐到攻击者。建议先只让攻击者 Motion Warping,受害者用 Contextual Animation 或附着/同步处理。两边都 Warping 时,目标互相跟随容易放大误差。
常见坑
- 窗口从动画第一帧开始,角色预备动作也被拉变形。
- 窗口到最后一帧结束,收招阶段还在补位移。
- 多个窗口使用同名目标但语义不同。
- 动画师改了时间线,Notify 没跟着重新验收。
- Montage Blend In/Blend Out 太长,窗口里实际动画权重不足。
源码依据
UAnimNotifyState_MotionWarping 只保存一个 RootMotionModifier 模板,并把 OnWarpBegin、OnWarpUpdate、OnWarpEnd 暴露给蓝图。组件扫描 Notify 时会计算 StartTime/EndTime,进入窗口后 OnBecomeRelevant 创建 Modifier。UMotionWarpingUtilities 还提供 GetMotionWarpingWindowsFromAnimation 和按 Warp Target 名字筛窗口的函数,便于工具化检查。
源码路径索引
MotionWarping/Public/AnimNotifyState_MotionWarping.hMotionWarping/Public/MotionWarpingComponent.hMotionWarping/Private/MotionWarpingComponent.cppExperimental/Animation/ContextualAnimation/Private/ContextualAnimTypes.cpp