总览
Motion Warping 在 gameplay 里只应该做最后一段动画对齐。目标选择、合法性判断、距离限制、服务器权威、伤害结算都不应该塞进 Modifier。分层清楚,系统才稳。
推荐 Ability 顺序
Input pressed
-> Ability activated
-> trace or target data chooses target
-> server validates distance, angle, team, state
-> compute warp target transform
-> MotionWarpingComponent.AddOrUpdateWarpTarget(...)
-> PlayMontageAndWait
-> AnimNotify / gameplay event applies hit
-> OnCompleted / OnBlendOut / OnCancelled clears or updates target
目标一定要在 Montage 播放前写入。取消时不一定必须清空所有目标,但生产项目建议清理当前 Ability 自己写入的目标,避免下一个动作误用旧 Transform。
GAS 示例
void UGA_MeleeLunge::ApplyWarpTarget(AActor* TargetActor)
{
ACharacter* Avatar = Cast<ACharacter>(GetAvatarActorFromActorInfo());
if (!Avatar || !TargetActor)
{
EndAbility(CurrentSpecHandle, CurrentActorInfo, CurrentActivationInfo, true, true);
return;
}
UMotionWarpingComponent* MotionWarping = Avatar->FindComponentByClass<UMotionWarpingComponent>();
if (!MotionWarping)
{
return;
}
const FVector ToTarget = TargetActor->GetActorLocation() - Avatar->GetActorLocation();
const FVector FlatDirection = FVector(ToTarget.X, ToTarget.Y, 0.f).GetSafeNormal();
const FVector StopLocation = TargetActor->GetActorLocation() - FlatDirection * 95.f;
const FRotator StopRotation = FlatDirection.Rotation();
MotionWarping->AddOrUpdateWarpTargetFromLocationAndRotation(
TEXT("Melee.AttackTarget"),
StopLocation,
StopRotation);
}
真实项目还要在服务器校验距离和角度,并把目标选择结果放进 TargetData 或 Ability 预测流程里。Motion Warping 只是消费最终 Transform。
使用案例:Smart Object 坐下
Smart Object 负责查找和 Claim 椅子 Slot,Motion Warping 负责最后 50cm 让坐下动画对齐椅子。流程是:Claim Slot,MoveTo 到入口点,播放坐下 Montage 前把 Slot Transform 写成 Sit.Target,窗口覆盖转身/坐下前半段。使用结束后释放 Smart Object,Motion Warping 不负责占用管理。
使用案例:处决
处决建议服务器先锁定双方状态,再计算攻击者和受害者的同步 Transform。攻击者用 Motion Warping 对齐到 Finisher.Attacker,受害者可以用同步动画、Contextual Animation 或被服务器固定到受害者点。不要让两个角色都自由追随对方实时位置,否则误差会互相放大。
Switch Off 条件
UE5.8 提供实验性的 UMotionWarpingSwitchOffCondition,可以按距离、角度、组合条件或蓝图条件取消 Follow、取消 Warping、暂停 Warping、暂停 Root Motion。适合处理移动目标突然离开、角度过大、目标死亡等情况。生产使用前要明确同步和回退策略。
常见坑
- Ability 预测了目标,但服务器校验后目标不同,客户端出现回弹。
- 命中点和 Warp Target 混用,角色对齐到了伤害 Trace 点。
- 取消 Ability 后目标还留着,下一个 Montage 用旧目标。
- 远距离攻击靠 Motion Warping 拉过去,服务器看起来像瞬移。
- Smart Object 释放和 Montage 取消不在同一条清理路径。
源码依据
UMotionWarpingComponent 的 WarpTargets 是 Replicated,但目标选择仍应由 gameplay 层做权威校验。MotionWarpingSwitchOffCondition.h 定义了距离、角度、组合和蓝图条件,并提供 CancelFollow、CancelWarping、PauseWarping、PauseRootMotion 四类效果。
源码路径索引
MotionWarping/Public/MotionWarpingComponent.hMotionWarping/Public/MotionWarpingSwitchOffCondition.hRuntime/GameplayAbilities/Public/Abilities/GameplayAbility.h