接入队伍身份与阵营
队伍身份接入的目标是让命令、Tactical Assignment、小队招募和调试都从同一套规则读取 TeamId。先决定项目里的真源在哪里,再让 GAIS 通过 TeamAgent 或 ProjectPolicy 读取它。
相关文档:功能说明见 队伍身份与项目策略,字段见 队伍身份与调试参数,二开见 队伍身份与 GAS 集成扩展点。
1. 选择队伍真源
在 Pawn/Controller 链上只选择一个真源:
- Pawn 真源:适合单位换 Controller、AIController 临时接管、队伍身份跟随角色实体的项目。
- Controller 真源:适合玩家席位、阵营由控制者拥有、Pawn 可频繁切换的项目。
- 项目自有系统真源:适合已有阵营组件、玩家队伍服务、GAS 属性或存档队伍数据的项目。
如果 Pawn 和 Controller 都挂 UGAIS_TeamAgentComponent,默认策略是 self-wins 查询语义,不会合并,也不会报警。避免双真源歧义是项目职责。
2. 使用 GAIS TeamAgent
如果项目没有成熟队伍系统,在真源侧添加 UGAIS_TeamAgentComponent,在服务端调用 SetTeamId,并按需要保留 bApplyTeamIdToMirrors。TeamId 会复制,OnTeamIdChangedEvent 和 OnTeamIdChanged 可用于 UI、表现或调试。
镜像只服务兼容:它可以把 TeamId 同步给 Owner、Controller 或实现 IGenericTeamAgentInterface 的对象,但不要把镜像对象再当成另一套权威状态。
3. 接入项目已有阵营系统
如果项目已经有队伍组件、阵营表或 Controller 侧 TeamAgent,不要重复建立真源。创建无状态 UGAIS_ProjectPolicy 子类,覆写 ResolveTeamAgent、HasGenericTeamId、GetGenericTeamId、SetGenericTeamId 和 GetGenericTeamQuerySource,然后在 UGAIS_DeveloperSettings.ProjectPolicyClass 指向该策略。
Policy 作为 CDO 使用,不要缓存运行时 Actor 或 Component。写入队伍身份仍应在 authority 上完成;客户端 UI 可以请求项目 RPC,由服务端验证权限后调用 SetGenericTeamId 或项目自己的真源写入。
验证场景
- 模板生成小队:
DefaultTeamId只在宿主没有队伍时应用,随后 TeamAgent/Policy 能读到该 TeamId。 - 已有 Actor 原子组队:候选 Unit 和 Squad 的队伍态度符合招募规则,不合格时创建返回
null或招募失败。 - 运行时改队伍:服务端调用
SetTeamId或SetGenericTeamId后,客户端能收到复制变化,GameplayDebugger 的 TeamSource 仍指向预期真源。 - Tactical Assignment:Target Filter 的 Team Attitude 能把友方/敌方按项目规则筛出。
验证
HasGenericTeamId对参与 Tactical Assignment 的 ContextActor 和 TargetActor 返回预期结果。GetGenericTeamQuerySource能解释队伍信息来自 Self、Controller、Pawn、Interface 还是 None。- Target Filter 的 Team Attitude 结果符合项目阵营规则。
