总览
FMotionWarpingTarget 是运行时目标。很多项目一开始只传一个 Location,后来发现角色朝向不对、移动敌人对不住、武器 Socket 飘、多人表现不同。原因是目标不只是一个点,它还包含旋转、来源组件、骨骼/Socket、是否跟随、偏移方向和使用者 Actor。
Target 字段怎么理解
| 字段 | 用途 | 例子 |
|---|---|---|
Name |
和 Notify 里的 WarpTargetName 对上 |
AttackTarget |
Location / Rotation |
静态目标 Transform | 翻越落点 |
Component |
从组件实时取 Transform | 敌人胶囊、门把手组件 |
BoneName |
组件上的骨骼或 Socket | spine_03、DoorHandle_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、bFollowComponent、EWarpTargetLocationOffsetDirection、LocationOffset、RotationOffset 和 AvatarActor。UMotionWarpingComponent 提供从 Transform、Component、Location、LocationAndRotation 创建或更新目标的蓝图/C++ API。
源码路径索引
MotionWarping/Public/RootMotionModifier.hMotionWarping/Public/MotionWarpingComponent.hMotionWarping/Public/MotionWarpingFunctionLibrary.h