接入 Movement Intent 到移动系统
Movement Intent 不是移动命令,也不会自行推动 Pawn。它是小队依据成员角色、已分配槽位和阵型世界位置生成的建议输出,镜像到每个 UGAIS_UnitComponent。项目选择由内置 Driver 或自己的移动层消费它,决定如何真正移动、转向、避障和停止。
本篇以“AI 小队随宿主推进、成员各自收敛到槽位”为例完成接入。完成后,Formation Ready 与槽位分配先收敛,Unit 上出现有效 Intent,最后由项目移动层产生实际位移;三者必须分开验证。
前置条件与控制权
- Squad 已初始化、Formation 已进入 Ready,成员已有有效 SlotId。
- 每个成员有
UGAIS_UnitComponent;真正使用 CharacterMovement Driver 时成员必须是ACharacter。 - 不要同时让 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 真源。
1UnitComponent.MovementIntent2→ 自定义 Driver3→ Mover / GMS / 项目 Move 请求4→ 后端完成实际位移与避障
若项目移动系统只能接受“目的地”,使用 DesiredLocation;若接受速度意图,使用 DesiredVelocity/DesiredSpeed;若朝向由动画或瞄准系统拥有,就不要强行写 DesiredOrientation。Driver 应是转换层,不是第二个战术决策器。
4. 验证与排错
症状 | 先看哪里 |
|---|---|
Intent 为空 | Squad 是否 Active,Formation 是否 Ready,成员是否已分配 Slot。 |
Intent 正确但单位不动 | Driver 是否配置、Unit 类型是否满足后端要求、项目移动层是否消费输入。 |
速度变化但朝向错误 | Driver 是否启用朝向应用;项目瞄准/动画是否同时覆盖旋转。 |
到位后仍移动 | 项目是否尊重 |
命令期间阵型拉扯 | 明确 Command 与 Intent 的控制权;不要让两个后端同时写移动。 |
需要用 StateTree 临时改变速度、移动策略或 Driver 应用时,继续看 用 StateTree 临时修改 Movement Intent。相关概念见 小队系统;槽位空间与导航自适应见 阵型系统,可扩展边界见 阵型与 Movement Intent 扩展点。
