Formation Editor 与槽位诊断
阵型问题通常不是一个点坏了,而是“资产槽位、运行时 FormationComponent、小队槽位分配、导航自适应、Movement Intent Driver”之间某一段没有收敛。排查时不要只看单位最后有没有移动,要从槽位是否存在、是否可用、是否被选中、世界位置是否正确、Intent 是否生成逐层看;本页会把 slot diagnostics 和 Movement Intent diagnostics 分开说明。
相关文档:功能说明见 阵型系统,槽位字段见 阵型、槽位与导航参数,小队槽位评分见 小队、角色与单位参数。
资产层:Formation Editor
Formation Editor 和槽位预览主要回答三个问题:
- 阵型资产里是否真的有槽位。
- 每个槽位的
SlotId是否稳定且不重复。 Weight、SlotTags、Location、Rotation是否表达了设计意图。
如果槽位在编辑器里看起来正确,但运行时单位仍站错,优先确认你是否在调运行时当前阵型,而不是另一个同名或同显示名资产。调试和保存引用应看 FormationId,不要只看 DisplayName。
运行时层:FormationComponent
运行时先看 FormationComponent:
AvailableFormations是否包含目标阵型。CurrentFormation是否已经设置,或EnsureCurrentFormation是否能选择第一个可用阵型。IsFormationReady是否为 true。- 槽位数量是否与资产
SlotDefinitions一致。 - 槽位查询是否合理:通过
QuerySlots或FindSlotRuntimeView查看稳定SlotId、SlotTags 和最终 World Transform,不要按旧槽位状态模型判断可用性。
如果小队初始化显示等待 Formation ready,通常是 FormationComponent 缺失、可用阵型为空、阵型类加载失败,或运行时槽位容器没有按当前阵型重建。
槽位评分层:slot assignment diagnostics
非 Shipping/Test 构建中,slot assignment 可以输出 debug-only 解释。重点看:
信号 | 含义 |
|---|---|
| 当前 Unit 有多少合法槽位候选。为 0 时先看 |
| 被 SlotTags 策略拒绝的槽位数量。高于预期时检查 |
| Unit/Role 标签与 SlotTags 匹配数量。为 0 时检查标签体系是否一致。 |
| 槽位权重产生的分数。过高会让关键槽被不合适单位抢走。 |
| 标签匹配贡献。过低会让 SlotTags 影响不明显。 |
| 距离扣分。过高会让单位贪近,不愿站到语义正确槽位。 |
| 保持原槽位加分。过高会让重组后仍不愿换位。 |
| 最终分配结果和原因。 |
常见诊断结果包括 Assigned、NoSlotAvailable、NoLegalSlot 和 NotChosen。NoSlotAvailable 更像槽位数量或查询范围问题;NoLegalSlot 更像标签约束问题;NotChosen 通常要看全局评分竞争。
导航自适应层
导航自适应问题的症状通常是:槽位有分配,但世界位置落在不可走区域;单位朝槽位移动失败;槽位预览点在坡地、桥边、台阶附近明显悬空或偏离。
按这个顺序查:
NavigationAdaptationConfig.bEnabled是否开启。- 当前世界是否有可用 NavMesh 和正确的默认 NavData。
NavigationQueryFilterClass是否允许该槽位所在区域。ProjectionQueryExtent尤其是 Z 是否足够覆盖地形高度差。ProjectionStartHeightOffset是否足够把投射起点抬到地表上方。- pivot 移动或旋转是否超过
ReprojectionDistanceThreshold/ReprojectionYawThresholdDegrees,否则可能还没触发重投射。 - 投射失败时
bUseFallbackProjection是否开启,FallbackSearchRadius是否足以向阵型 root 方向收缩。
如果只有部分槽位异常,通常是局部 NavMesh 或槽位位置问题。如果所有槽位都不投射,优先看 NavData、QueryFilter 和组件是否有 authority。
Movement Intent 层
槽位分配成功不等于单位会移动。Movement Intent 是建议输出,真正执行要靠 UGAIS_UnitMovementIntentDriver 或项目移动系统消费。
排查时确认:
- Unit 的
AssignedSlotId已镜像到 UnitComponent。 - Unit 的
AssignedSlotId能通过FindSlotRuntimeView找到对应槽位。 RawDesiredLocation接近 FormationComponent 的 slot world location。DesiredLocation是否因为平均速度预测产生前馈偏移。bShouldMove是否为 true;如果为 false,看MoveStartDistance/MoveStopDistance。DesiredSpeed是否大于 0;如果为 0,看 Response 设置和距离误差。MovementIntentDriver是否配置,或项目移动系统是否读取 UnitComponent 上的 Intent。
如果 Intent 正常但单位不动,问题通常已经离开阵型系统,进入移动系统接入边界。此时应继续看 接入 Movement Intent 到移动系统。
