小队、角色与单位参数
小队参数围绕“组织关系”展开:Definition 决定一种小队应该如何组成,SquadComponent 维护运行时成员和角色真源,UnitComponent 镜像自己在小队里的身份,slot assignment 和 Movement Intent 把组织关系连接到阵型与移动系统。
相关文档:小队功能与 Movement Intent 生成见 小队系统,阵型空间与导航自适应见 阵型系统,配置步骤见 配置小队、阵型与槽位,二开入口见 小队、角色与 AI 扩展点。
UGAIS_SquadDefinition
UGAIS_SquadDefinition 是一种小队类型的静态模板。它不保存运行时成员,而是定义小队宿主、默认单位、角色、可用阵型、行为基线、槽位评分和 Movement Intent 默认值。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 小队运行时宿主 Actor,必须实现 | 每种小队需要不同宿主、组件组合或表现时。 | 未实现接口或缺少运行时组件会导致初始化契约失败。 |
| 初始化时应用到小队宿主的默认队伍 ID。 | 小队有固定阵营,或生成时需要继承某个阵营语义。 | 与项目队伍真源冲突会影响过滤、敌我判断和 Tactical Assignment。 |
| 小队可使用的阵型列表,顺序影响 trait-query 优先匹配。 | 小队需要切换防御、推进、散开等阵型时。 | 为空或类加载失败会让 Formation ready 无法收敛。 |
| 创建或补齐小队时使用的单位模板。 | 通过 | UnitClass 缺失、DesiredRole 不存在会导致空岗或角色填充失败。 |
| 显式初始阵型;必须同时存在于 | 小队初始站位不能只靠可用阵型顺序推断时。 | 不在可用列表中会导致初始化或编辑器校验问题。 |
| 小队可用角色列表; | 需要岗位容量、兵种限制、角色优先级和角色 StateTree 时。 | 角色缺失或重复会导致默认单位、角色分配和槽位匹配异常。 |
| 小队宿主自己的基线 StateTree。 | 小队整体需要巡逻、推进、撤退、切阵等高层行为时。 | 把单位执行细节塞入宿主 StateTree 会让职责混乱。 |
| Unit 加入小队后可使用的默认 Squad 层行为回退。 | 角色没有专用 StateTree,但加入小队后仍需要统一行为时。 | 未配置回退会让部分单位加入小队后没有 Squad 层行为。 |
| Unit 到 Formation Slot 的评分规则。 | 单位站位不符合语义、距离或稳定性预期时。 | 权重不平衡会造成频繁换位、错位或 |
| 每个 Movement Intent draft 的默认起停、速度响应和预测参数。 | 调整跟随阵型的起停距离、速度和短时预测时。 | 起停阈值不合理会造成抖动、停滞或长期追赶。 |
| 每个 Movement Intent draft 的默认项目语义标签。 | Driver、动画或项目移动层需要识别“面向移动方向”“到位后朝向”等语义时。 | 标签语义不清会让 Driver 决策难以解释。 |
| 小队批量刷新 Intent 后应用到单位移动系统的策略对象。 | 希望 GAIS 自动把 Intent 写入 CharacterMovement、GMS、Mover 或自定义移动层时。 | Driver 与项目移动真源抢控制会导致状态互相覆盖。 |
FGAIS_SquadUnitInfo
FGAIS_SquadUnitInfo 是默认单位模板。它用于“由 Definition 生成小队”或“按模板补齐小队”的场景。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 期望生成或填充的单位 Actor 类。 | 小队创建时需要自动生成成员。 | 类未加载或没有 UnitComponent 会导致成员无效。 |
| 该单位期望担任的初始角色。 | 固定编队希望单位出生就占据某个岗位。 | 角色不存在或资格不满足会被重分配、空置或触发缺失策略。 |
| 单位级角色 StateTree 覆盖。 | 同一角色下不同单位需要不同 Squad 层行为时。 | 覆盖过多会让角色默认 AI 难以维护。 |
FGAIS_SquadRoleInfo
角色配置决定“什么单位可以担任什么岗位,以及岗位在填充和槽位争用中的优先级”。它会影响角色占用、StateTree 分配、槽位语义匹配和重组策略。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 稳定岗位身份,通常位于 | 每个可被小队识别的岗位都需要一个稳定标签。 | 与 SlotTags 或 CommandIntent 标签混用会让语义边界模糊。 |
| 限制可担任该角色的 Actor 类。 | 只有特定兵种、载具或角色类能担任岗位时。 | 留空表示不限制;误填会让单位无法补位。 |
| 通过 GameplayTags 限制角色资格。 | 按装备、Buff、职业、状态判断岗位资格时。 | 标签体系不一致会让 |
| 同时担任该角色的最大人数。 | 前排、远程、治疗等岗位有容量上限时。 | 与 DefaultUnits 数量冲突会导致多余单位无角色。 |
| 角色填充和槽位争用优先级;数值越高越先获得角色/槽位机会。 | 队长、护卫、治疗等角色需要优先稳定时。 | 过高会让普通角色长期拿不到更合适的槽位。 |
| 小队期望该角色被填满。 | 缺少该岗位会影响小队能力但不一定立即崩溃时。 | 过度标 required 会让普通伤亡频繁触发补员或降级。 |
| 担任该角色的默认 Squad 层 StateTree。 | 不同岗位需要不同行为时。 | 把完整战斗流程塞进角色 StateTree 会和 Command/Queue 产生职责重叠。 |
UGAIS_SquadComponent
UGAIS_SquadComponent 是运行时小队真源。它负责初始化 Definition、维护成员 FastArray、角色占用、容量状态、Formation ready 等待、槽位重分配、Movement Intent 刷新和成员事件。
参数或能力 | 用途 | 何时使用 | 误配风险 |
|---|---|---|---|
| BeginPlay 时用配置的 Definition 自动初始化。 | 关卡中手摆小队宿主,进入游戏自动成队。 | Definition 未配完整会在 BeginPlay 暴露初始化失败。 |
| 查询当前 Formation 槽位形成的硬容量、剩余容量和满员状态。 | UI、调试或 AI 判断是否还能招募单位。 | 容量会随当前 Formation 槽位数变化;不要缓存旧值或只看角色容量。 |
| 小队成员运行时真源。 | 查询成员、复制成员变化、触发 add/remove/change 事件。 | 绕过 AddUnit/RemoveUnit 直接改会破坏镜像和事件。 |
| 查询一个、全部或任一 Unit 是否存在于成员真值容器。 | UI 启用操作、服务端授权检查、批量改编前。 | |
| 角色占用运行时真源。 | 判断角色是否填满、必需角色是否缺失。 | 和 Definition 的 |
| 服务端增删成员。 | 权威逻辑处理招募、离队、死亡、召唤物加入。 | 客户端直接调用无效;绕过会导致 Unit 投影不同步。 |
| 由拥有小队宿主的客户端请求服务端改编。 | 玩家编队界面从 owning client 发起成员调整。 | 网络所有权不在调用客户端时,RPC 请求不会成为通用授权通道。 |
| 服务端调整一个或多个 Unit 的角色。 | 权威侧玩家换岗位、AI 重组、关键角色补位。 | 不触发后续刷新会让槽位和 StateTree 保持旧状态。 |
| 由 owning client 请求服务端调整角色。 | 玩家可编辑自己拥有的小队角色时。 | 项目仍需在服务端保留授权规则,不应只依赖调用节点是否可见。 |
| 观察初始化处于未开始、等待空间上下文、Active 或失败等生命周期阶段。 | 创建小队后决定何时读取成员槽位、下发小队行为或显示就绪状态。 | 不要通过私有收敛函数或 Formation 是否非空猜测小队已经可用。 |
| 订阅初始化阶段变化和首次进入 Active。 | UI、项目逻辑或测试需要事件驱动地等待小队可用时。 | 只轮询成员数量可能在 Formation 尚未 ready 时过早继续。 |
| 通过小队宿主 CommandSystem 下发命令。 | 玩家或 AI 把小队当成命令入口。 | 它不是绕过 CommandSystem 的执行路径。 |
| 请求服务端解散、改队伍 ID 或下发小队命令。 | 操作从拥有小队宿主的客户端发起。 | 非拥有客户端应改走 PlayerController/项目 RPC,否则服务端不会得到可用请求。 |
| 设置或清除 Unit 的 Squad 层行为。 | 单位加入/离开小队或角色变化时。 | 不清除 Squad 层会让离队单位继续被小队行为覆盖。 |
UGAIS_SquadSubsystem
UGAIS_SquadSubsystem 是世界级小队注册表和创建辅助。它适合项目逻辑、蓝图或上层系统创建、查找和重组小队。
入口 | 用途 | 适用场景 |
|---|---|---|
| 按 SquadDefinition 生成小队宿主,可选择生成默认单位。 | 固定编队、刷怪或运行时生产单位。 |
| 创建小队宿主并原子招募已有 Actor。 | 玩家框选、剧情编队、关卡预放单位组队。 |
| 从附近未入队单位招募指定数量成员。 | 区域集结、临时战斗组、自动编队。 |
| 查询当前无小队的已注册单位。 | 单位平时独立,之后可被小队吸收。 |
| 查询通过 Unit 自动招募策略的未入队单位。 | 自动补员、重组或区域招募前筛选候选。 |
| 招募附近单位并尝试补齐缺失角色。 | 战斗中补员、残兵重整。 |
| 主小队吸收副小队,主小队保留身份和高层语义。 | 两队会合、玩家合并选择组、AI 收编残余单位。 |
UGAIS_UnitComponent
UGAIS_UnitComponent 让 Actor 能被小队识别,并镜像小队分配结果。它也是默认命令意图解析器;最终命令必须通过候选 Pawn/Character 上的 UGAIS_CommandSystemComponent 执行。
参数 | 用途 | 何时调整或读取 | 误配风险 |
|---|---|---|---|
| 默认 IntentTag 到命令引用映射。 | Tactical Assignment 产出命令意图后,需要 Unit 解析成具体命令。 | 未配置会导致 |
| 当前所属小队,由服务端复制。 | UI、调试、移动 Driver 判断单位是否在队。 | 不应作为编辑期配置真源。 |
| 从 Squad entry 镜像出的当前角色。 | UI 显示岗位、移动/动画逻辑读取岗位。 | 直接写不会改变 SquadComponent 内部角色真源。 |
| 从 Squad entry 镜像出的阵型槽位 ID。 | UI、调试、移动系统读取当前站位。 | 直接写不会改变槽位分配。 |
| 从 Squad entry 镜像出的最近移动建议。 | 外部移动系统消费期望位置、速度和朝向。 | 把它当移动真源会和 CharacterMovement/GMS 等系统冲突。 |
| 由拥有 Unit Actor 或其 Owner 链的客户端请求离队。 | 玩家控制单位主动离队时。 | 对非拥有 Unit 调用时无法替代服务端授权逻辑。 |
FGAIS_FormationSlotAssignmentSettings
槽位分配设置决定 Unit 和 Formation Slot 如何匹配。输入包括 Unit/Actor tags、当前角色标签、槽位 SlotTags、槽位权重、单位到槽位距离和上一次槽位。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 决定 SlotTags 是只加分、要求任意匹配、要求全部匹配,还是忽略。 | 想让角色/单位必须站到指定语义槽位时。 | RequireAll 过严会产生 |
| 是否启用 GameplayTag 层级匹配。 | 使用父子标签组织角色和槽位语义时。 | 关闭后父子层级不再匹配,可能降低命中率。 |
| 槽位 Weight 的评分倍率。 | 想让关键槽位优先被占用时。 | 过高会压过标签和距离。 |
| 每个 Unit/Slot 标签匹配的加分。 | 想强化岗位与槽位语义匹配时。 | 过低会让标签看似配置了但不影响结果。 |
| 每 100 UU 距离扣分。 | 想减少远距离换位和穿插时。 | 过高会让单位贪近而站错语义位置。 |
| 保留原槽位的稳定性加分。 | 想减少频繁换位时。 | 过高会让阵型变化或角色变化后仍不愿重排。 |
FGAIS_MovementIntentResponseSettings
Movement Intent 响应设置决定小队如何把槽位目标转成移动建议。它不直接移动单位,而是为 Driver 或项目移动系统提供期望位置、速度、响应强度和到位状态。UGAIS_SquadDefinition.DefaultMovementIntentResponseSettings 会初始化每个 Unit 的 draft,随后 Squad/Unit Modifier 可以继续覆盖。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 静止单位超过该距离才开始移动。 | 避免单位因小误差频繁起步。 | 太小会抖动,太大导致明显偏离槽位仍不动。 |
| 移动单位低于该距离停止并视为到位。 | 控制站位精度和停止条件。 | 大于 Start 或设置过大,会让单位停得太松。 |
| 距离误差达到该值时响应强度为 1。 | 调整追赶速度随距离变化的敏感度。 | 太小会快速满速,太大则追赶迟钝。 |
| 可选曲线,重映射响应强度。 | 需要更平滑或更激进的加速曲线时。 | 曲线输出不合理会造成速度跳变。 |
| 近处和远处期望速度。 | 调整接近槽位和远距追赶节奏。 | Far 小于 Near 的预期不清会让速度曲线难调。 |
| 移动时最低期望速度。 | 避免响应很低时移动系统停滞。 | 太高会让单位接近槽位时冲过头。 |
| 用小队平均速度预测目标位置。 | 小队宿主持续移动,单位需要前馈追随时。 | 太高会让单位追向过远的预测点。 |
Movement Intent Modifier 与最终 Intent
Formation 首先提供槽位世界位置和朝向,创建 FGAIS_MovementIntentResolveState;这个 draft 默认带上 Definition 的响应设置、默认标签和小队平均速度预测。随后系统先执行 Squad 级 Modifier,再执行 Unit 级 Modifier;同一 scope 内 PriorityWithinScope 越高越晚执行,因此更高优先级更适合做最终覆盖。
表面 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 一组有序、不可变的 Modifier 模板,可作为共享资产或 Inline Set 使用。 | 多个状态或小队复用同一套移动语义时。 | 空集合或无效子对象会被运行时拒绝。 |
| 纯函数式修改 draft。 | 冲锋、散开、守点、减速、暂停 Driver 等临时状态。 | 在回调里改成员、阵型、命令或再次 push/pop Modifier 会被拒绝或触发稳定性保护。 |
| 给整支小队注册 Modifier,返回 | StateTree 进入“冲锋/隐蔽/压制”这类小队状态时。 | Owner 无效、非权威端、小队未 Active 或 Set 无效都会返回无效 Handle。 |
| 给单个成员注册 Modifier。 | 某个单位被减速、眩晕、持盾或单独脱离队形时。 | Unit 不属于该小队时注册失败。 |
| 按 Handle 或 Owner 清理运行时绑定。 | StateTree 退出状态、Actor EndPlay、技能结束或异常清理。 | 忘记清理会让旧状态继续影响最终 Intent。 |
| 决定 | 冲锋强制推进、定点蓄力停住、普通跟随自动起停。 | 和 Driver/命令层控制权冲突会造成拉扯。 |
| 决定最终 Intent 是否交给 Driver 应用。 | 命令层或项目移动层临时接管移动时可设为 Suspended。 | 误挂 Suspended 会让 Intent 正确但单位不被 Driver 驱动。 |
| 参与 | 小队整体高速移动或需要前馈追随时。 | 预测过强会让单位追向过远点。 |
| 传递给 Driver、动画或项目移动层的语义标签。 | 控制面向移动方向、到位后朝向、冲锋动画层等。 | 标签约定不统一会让消费端行为不稳定。 |
最终 FGAIS_SquadUnitMovementIntent 会记录 RawDesiredLocation、预测后的 DesiredLocation、DesiredOrientation、DesiredSpeed、DesiredVelocity、bShouldMove、bIsInDesiredLocation、MovementIntentTags 和 DriverPolicy。它会写回 Squad entry 并镜像到 UnitComponent。
