小队、角色与 AI 扩展点

GAIS_Cover
YuewuDev

作者

YuewuDev

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

目录

小队、角色与 AI 扩展点

说明 GenericAISystem 中小队、角色、Unit、命令意图解析和 AI 扩展点可改变的行为与边界。

相关文档:功能说明见 小队系统、阵型系统 和 战术分配系统,字段见 小队、角色与单位参数。

UGAIS_SquadDefinition

扩展点

能改变什么

IsValidForSquad

单位是否可加入某类小队。

IsQualifiedOfRole

单位是否能担任某个 RoleTag。

ShouldDisband

小队是否应解散。

OnSquadActivated

小队组件进入 Active 状态后的定义侧钩子;只在权威端改变运行时状态。

ResolveFinalRoleStateTree

查询角色 AI 的最终 StateTree。

ValidateSquadRuntimeContract

检查宿主 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,根据单位状态、武器、角色、目标来源、目标标签或项目规则返回不同命令引用。

扩展点

能改变什么

边界

CommandIntentMappings

数据驱动地把 IntentTag 映射到命令引用。

只适合固定映射,不处理复杂运行时选择。

ResolveCommandIntent

动态选择具体命令。

只返回命令引用,不直接下发命令,不替代 Source/Filter/Allocator。

OnSquadChanged

响应单位加入或离开小队。

适合刷新表现、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 状态。