小队、角色与 AI 扩展点
说明 GenericAISystem 中小队、角色、Unit、命令意图解析和 AI 扩展点可改变的行为与边界。
相关文档:功能说明见 小队系统、阵型系统 和 战术分配系统,字段见 小队、角色与单位参数。
UGAIS_SquadDefinition
扩展点 | 能改变什么 |
|---|---|
| 单位是否可加入某类小队。 |
| 单位是否能担任某个 RoleTag。 |
| 小队是否应解散。 |
| 小队组件进入 Active 状态后的定义侧钩子;只在权威端改变运行时状态。 |
| 查询角色 AI 的最终 StateTree。 |
| 检查宿主 Actor 是否满足 Pawn/Character、SquadComponent、CommandSystem、AIController/Stack 等契约。 |
UGAIS_SquadComponent
适合 C++ 子类扩展的方向包括:默认单位生成、运行时契约验证、Formation ready 收敛、成员同步、角色分配、StateTree 基线应用、槽位分配和 Movement Intent 刷新。不要绕过 UnitsContainer 直接在 Unit 上维护小队真源。
权威和 Server RPC 边界
GAIS 现有 ServerDismiss、ServerChangeSquadTeamId、ServerAdd/RemoveUnit(s)、ServerAssign/RevokeRole...、ServerIssueSquadCommand 和 ServerLeaveSquad 解决 owning client 的请求通路。扩展时可以在服务端调用前后加入玩家权限、资源成本、阵营限制和冷却校验,但不应在客户端自行修改 UnitsContainer、RoleContainer 或所属小队镜像。
这些 RPC 不是对任意小队的通用访问权。当小队宿主不属于调用客户端时,用项目 PlayerController 作为网络入口,并在服务端转为 GAIS 权威调用。
UGAIS_UnitComponent 与命令意图解析
UGAIS_UnitComponent 默认实现 IGAIS_CommandIntentResolver,并用 CommandIntentMappings 把 GAIS.CommandIntent.* 解析成 FGAIS_CommandReference。这适合固定的 Unit 类型:例如步兵的 Engage 映射到攻击命令,治疗者的 Support 映射到治疗命令。
需要更动态的解析时,可以在 UnitComponent 子类、候选 Actor 或 Actor 上的其他组件实现 IGAIS_CommandIntentResolver,根据单位状态、武器、角色、目标来源、目标标签或项目规则返回不同命令引用。
扩展点 | 能改变什么 | 边界 |
|---|---|---|
| 数据驱动地把 IntentTag 映射到命令引用。 | 只适合固定映射,不处理复杂运行时选择。 |
| 动态选择具体命令。 | 只返回命令引用,不直接下发命令,不替代 Source/Filter/Allocator。 |
| 响应单位加入或离开小队。 | 适合刷新表现、UI 或本地状态,不应直接改写 SquadComponent 的成员真源。 |
如果 Tactical Assignment 报 NoResolvedCommand,优先检查候选 Actor/组件是否实现 resolver,以及 CommandIntentMappings 是否包含 Batch 的 IntentTag。
IGAIS_RoleAIOverrideProvider
在 Unit Actor 或 Unit-owned Component 上实现 ResolveRoleOverrideStateTree,可按装备、状态、Buff、项目职业系统动态覆盖角色 AI。优先级高于 Definition 的 unit-class override、角色默认 StateTree 和全局回退。
小队条件观察
UGAIS_SquadCondition 是无状态的内联条件配置;内置的单位数量和精确角色数量条件可覆盖常见编队门槛。需要自定义语义时扩展它的评估,而不要把订阅状态放进 Condition 资产。运行时订阅属于 FGAIS_STT_ObserveSquadCondition 的实例数据:任务进入后订阅小队聚合变化,初始为真或从 false 变 true 时才触发 StateTree dispatcher,并在退出或 Actor EndPlay 时清理。这样条件变化不会依赖 Tick,也不会暴露复制中的中间 roster 状态。
