接入 Movement Intent 到移动系统

GAIS_Cover
YuewuDev

作者

YuewuDev

创建时间: 2026年10月12日更新时间: 2026年10月12日

目录

接入 Movement Intent 到移动系统

Movement Intent 不是移动命令,也不会自行推动 Pawn。它是小队依据成员角色、已分配槽位和阵型世界位置生成的建议输出,镜像到每个 UGAIS_UnitComponent。项目选择由内置 Driver 或自己的移动层消费它,决定如何真正移动、转向、避障和停止。

本篇以“AI 小队随宿主推进、成员各自收敛到槽位”为例完成接入。完成后,Formation Ready 与槽位分配先收敛,Unit 上出现有效 Intent,最后由项目移动层产生实际位移;三者必须分开验证。

前置条件与控制权

  1. Squad 已初始化、Formation 已进入 Ready,成员已有有效 SlotId。
  2. 每个成员有 UGAIS_UnitComponent;真正使用 CharacterMovement Driver 时成员必须是 ACharacter。
  3. 不要同时让 AIController 的 MoveTo、Command StateTree、CharacterMovement Driver 和项目移动系统持续写同一份移动控制。先指定一个当前移动真源。

Intent 与 Command 可以共存:CommandStateTree 可以决定“现在去哪里/是否接管”,而 Squad Intent 只表达阵型建议。命令层接管移动时,项目应明确暂停、覆盖或合并 Intent,而不是让两个系统抢同一速度与朝向。

1. 先验证 Intent,而不是先看单位是否移动

在 GameplayDebugger 或 UnitComponent 上检查 MovementIntent:DesiredLocation 应接近该成员最终槽位,DesiredVelocity/DesiredSpeed 表达建议运动,DesiredOrientation 表达朝向,bShouldMove 表达当前是否应开始移动。它们正确而 Pawn 不动,问题在 Driver/项目移动层;它们错误,则回到 Formation、Slot 或 Squad 分配排查。

bShouldMove 不是“永远移动”的开关。它由小队的距离阈值和 Intent 规则决定,项目仍可叠加导航、硬直、命令接管或网络预测等本地条件。

2. 使用内置 CharacterMovement Driver

在 UGAIS_SquadDefinition.MovementIntentDriver 选择 UGAIS_UnitMovementIntentDriver_CharacterMovement。它面向 ACharacter + CharacterMovement,可把建议速度应用到 MaxWalkSpeed,并按配置应用 DesiredOrientation。

PIE 中让 Squad 宿主移动或切换阵型:成员应先获得不同的 DesiredLocation,再开始向槽位收敛。到位后 bShouldMove 应变为 false 或速度降为停止语义,而不是持续以旧速度行走。

不要把这个 Driver 当成完整导航 AI:它负责把 GAIS 建议写入 CharacterMovement 可消费的输入,不替代项目的路径规划、碰撞策略、动画状态机或网络预测。

3. 接入 Mover、GMS 或自定义移动层

创建 UGAIS_UnitMovementIntentDriver 子类,覆写 ApplyMovementIntent。驱动器应读取本次 Unit 的 Intent,并把它转换为项目移动后端接受的目标/速度/朝向输入;它不应修改 Squad 的槽位、角色或 Intent 真源。

plaintext
1UnitComponent.MovementIntent
2→ 自定义 Driver
3→ Mover / GMS / 项目 Move 请求
4→ 后端完成实际位移与避障

若项目移动系统只能接受“目的地”,使用 DesiredLocation;若接受速度意图,使用 DesiredVelocity/DesiredSpeed;若朝向由动画或瞄准系统拥有,就不要强行写 DesiredOrientation。Driver 应是转换层,不是第二个战术决策器。

4. 验证与排错

症状

先看哪里

Intent 为空

Squad 是否 Active,Formation 是否 Ready,成员是否已分配 Slot。

Intent 正确但单位不动

Driver 是否配置、Unit 类型是否满足后端要求、项目移动层是否消费输入。

速度变化但朝向错误

Driver 是否启用朝向应用;项目瞄准/动画是否同时覆盖旋转。

到位后仍移动

项目是否尊重 bShouldMove,距离阈值和停止逻辑是否一致。

命令期间阵型拉扯

明确 Command 与 Intent 的控制权;不要让两个后端同时写移动。

需要用 StateTree 临时改变速度、移动策略或 Driver 应用时,继续看 用 StateTree 临时修改 Movement Intent。相关概念见 小队系统;槽位空间与导航自适应见 阵型系统,可扩展边界见 阵型与 Movement Intent 扩展点。