UE5.8 Motion Warping 专题系列

UE5.8 Motion Warping 专题(四):Warp Target 怎么设计,Transform、Socket、Follow 和 Offset

拆解 FMotionWarpingTarget 的 Name、Location、Rotation、Component、BoneName、bFollowComponent、LocationOffsetDirection、LocationOffset、RotationOffset 和 AvatarActor。

总览

FMotionWarpingTarget 是运行时目标。很多项目一开始只传一个 Location,后来发现角色朝向不对、移动敌人对不住、武器 Socket 飘、多人表现不同。原因是目标不只是一个点,它还包含旋转、来源组件、骨骼/Socket、是否跟随、偏移方向和使用者 Actor。

UE5.8 Motion Warping 专题(四):Warp Target 怎么设计,Transform、Socket、Follow 和 Offset 配图
Warp Target 不是只有一个坐标,它可以来自 Transform、组件、骨骼/Socket、移动目标和偏移规则。

Target 字段怎么理解

字段 用途 例子
Name 和 Notify 里的 WarpTargetName 对上 AttackTarget
Location / Rotation 静态目标 Transform 翻越落点
Component 从组件实时取 Transform 敌人胶囊、门把手组件
BoneName 组件上的骨骼或 Socket spine_03DoorHandle_L
bFollowComponent 目标是否随组件更新 移动敌人、移动平台
LocationOffsetDirection Offset 沿哪个坐标系解释 目标前方、目标到自身方向、世界空间
LocationOffset / RotationOffset 安全距离和朝向修正 敌人前方 80cm

Transform 目标

静态目标适合翻越落点、跳跃落点、固定交互点。优点是确定、可复制、可调试。缺点是目标移动后不会自动跟随。

MotionWarping->AddOrUpdateWarpTargetFromLocationAndRotation(
    TEXT("VaultTarget"),
    LandingLocation,
    LandingRotation);

Component 目标

移动目标要用 Component。比如敌人还在移动,处决动画要对齐敌人背后的 Socket,就传敌人的 Mesh、Socket 名,并让 bFollowComponent 为 true。

MotionWarping->AddOrUpdateWarpTargetFromComponent(
    TEXT("FinisherTarget"),
    EnemyMesh,
    TEXT("spine_03"),
    true,
    EWarpTargetLocationOffsetDirection::TargetsForwardVector,
    FVector(-80.f, 0.f, 0.f),
    FRotator(0.f, 180.f, 0.f));

这里的偏移含义是:以目标组件前向为基准,把角色对齐到敌人前后某个安全距离。不同项目的角色 Forward 约定不同,第一次一定要画 Debug 箭头。

目标命名规范

建议把目标名当成动画合同,而不是临时变量:

  • Vault.Landing:翻越落地目标。
  • Attack.Contact:近战接触目标。
  • Interact.HandL:左手对齐目标。
  • Finisher.Victim:处决受害者相对目标。

如果动画 Notify 写 Target,项目代码也到处写 Target,半年后很难知道哪个动作在用哪个目标。

使用案例:开门伸手

开门不是让角色对齐门中心,而是先让脚步对齐门前站位,再用 IK 或 Control Rig 让手对齐把手。Motion Warping 的 Target 应该是“角色根运动的站位”,不是“手的最终位置”。门把手 Socket 可以用来计算站位,但不要直接把 Actor root 拉到把手上。

使用案例:移动平台落点

如果目标在移动平台上,bFollowComponent 能让目标持续更新。但注释里提醒了一个细节:如果拥有者 Tick 在目标 Actor 之前,跟随会晚一帧。真实项目里需要添加 Tick prerequisite,或者在玩法层保证目标先更新。

常见坑

  • 只传 Location 不传 Rotation,结果角色落点对了但背对目标。
  • 对齐敌人中心,胶囊互相重叠。
  • Offset 坐标系选错,角色横向偏移。
  • 移动目标不 Follow,窗口开始后目标跑开。
  • 目标名被复用,攻击和翻越互相覆盖。

源码依据

FMotionWarpingTarget 定义在 RootMotionModifier.h,保存 Component、BoneName、bFollowComponentEWarpTargetLocationOffsetDirection、LocationOffset、RotationOffset 和 AvatarActor。UMotionWarpingComponent 提供从 Transform、Component、Location、LocationAndRotation 创建或更新目标的蓝图/C++ API。

源码路径索引

  • MotionWarping/Public/RootMotionModifier.h
  • MotionWarping/Public/MotionWarpingComponent.h
  • MotionWarping/Public/MotionWarpingFunctionLibrary.h