接入队伍身份与阵营

GAIS_Cover
YuewuDev

作者

YuewuDev

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

目录

接入队伍身份与阵营

队伍身份接入的目标是让命令、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 或项目自己的真源写入。

验证场景

  1. 模板生成小队:DefaultTeamId 只在宿主没有队伍时应用,随后 TeamAgent/Policy 能读到该 TeamId。
  2. 已有 Actor 原子组队:候选 Unit 和 Squad 的队伍态度符合招募规则,不合格时创建返回 null 或招募失败。
  3. 运行时改队伍:服务端调用 SetTeamId 或 SetGenericTeamId 后,客户端能收到复制变化,GameplayDebugger 的 TeamSource 仍指向预期真源。
  4. Tactical Assignment:Target Filter 的 Team Attitude 能把友方/敌方按项目规则筛出。

验证

  • HasGenericTeamId 对参与 Tactical Assignment 的 ContextActor 和 TargetActor 返回预期结果。
  • GetGenericTeamQuerySource 能解释队伍信息来自 Self、Controller、Pawn、Interface 还是 None。
  • Target Filter 的 Team Attitude 结果符合项目阵营规则。