Formation Editor 与槽位诊断

GAIS_Cover
YuewuDev

作者

YuewuDev

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

目录

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:

  1. AvailableFormations 是否包含目标阵型。
  2. CurrentFormation 是否已经设置,或 EnsureCurrentFormation 是否能选择第一个可用阵型。
  3. IsFormationReady 是否为 true。
  4. 槽位数量是否与资产 SlotDefinitions 一致。
  5. 槽位查询是否合理:通过 QuerySlots 或 FindSlotRuntimeView 查看稳定 SlotId、SlotTags 和最终 World Transform,不要按旧槽位状态模型判断可用性。

如果小队初始化显示等待 Formation ready,通常是 FormationComponent 缺失、可用阵型为空、阵型类加载失败,或运行时槽位容器没有按当前阵型重建。

槽位评分层:slot assignment diagnostics

非 Shipping/Test 构建中,slot assignment 可以输出 debug-only 解释。重点看:

信号

含义

LegalCandidateCount

当前 Unit 有多少合法槽位候选。为 0 时先看 QuerySlots 结果和标签策略。

RejectedByTagsCount

被 SlotTags 策略拒绝的槽位数量。高于预期时检查 RequireAny / RequireAll。

MatchingTagCount

Unit/Role 标签与 SlotTags 匹配数量。为 0 时检查标签体系是否一致。

SlotWeightScoreContribution

槽位权重产生的分数。过高会让关键槽被不合适单位抢走。

MatchingTagScoreContribution

标签匹配贡献。过低会让 SlotTags 影响不明显。

DistanceCost

距离扣分。过高会让单位贪近,不愿站到语义正确槽位。

StableSlotScoreContribution

保持原槽位加分。过高会让重组后仍不愿换位。

TotalScore / AssignmentReason

最终分配结果和原因。

常见诊断结果包括 Assigned、NoSlotAvailable、NoLegalSlot 和 NotChosen。NoSlotAvailable 更像槽位数量或查询范围问题;NoLegalSlot 更像标签约束问题;NotChosen 通常要看全局评分竞争。

导航自适应层

导航自适应问题的症状通常是:槽位有分配,但世界位置落在不可走区域;单位朝槽位移动失败;槽位预览点在坡地、桥边、台阶附近明显悬空或偏离。

按这个顺序查:

  1. NavigationAdaptationConfig.bEnabled 是否开启。
  2. 当前世界是否有可用 NavMesh 和正确的默认 NavData。
  3. NavigationQueryFilterClass 是否允许该槽位所在区域。
  4. ProjectionQueryExtent 尤其是 Z 是否足够覆盖地形高度差。
  5. ProjectionStartHeightOffset 是否足够把投射起点抬到地表上方。
  6. pivot 移动或旋转是否超过 ReprojectionDistanceThreshold / ReprojectionYawThresholdDegrees,否则可能还没触发重投射。
  7. 投射失败时 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 到移动系统。