Tactical Assignment 参数
Tactical Assignment 的配置分散在三个层次:Plan 定义批次与重评估节奏,StateTree Task 提供本次运行的顶层 Source,项目策略与设置定义物理目标的容量和位置规范化。运行时候选流、Allocator 上下文和 Session 跟踪状态都由系统即时生成,不属于可保存的 Plan 字段。
UGAIS_TacticalAssignmentPlan
Plan 可保存为 Data Asset,也可作为 StateTree Task 的 Inline Plan。它记录可复用的规划规则;候选 Unit 与目标由运行 Task 的 Source 提供。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 按顺序执行的战术请求列表;前序 Batch 已分配的 Actor 不会进入后序 Batch。 | 需要多个战术优先级时。 | 把低优先级 Batch 放在前面会先占用候选。 |
| 自动重评估间隔,必须大于零。 | 局势变化速度与运行成本需要平衡时。 | 过短会频繁运行 Source、Filter、评分和分配;过长则响应迟缓。 |
Plan 资产验证会检查至少存在一个 Batch、每个 Batch 有有效 IntentTag、Filter 实例有效、ScoreAdjustment 为有限值,且重评估间隔合法。
Data Asset 与 Inline Plan 对照
项目 | | |
|---|---|---|
类型 | | 同类型的 Task 内联实例 |
可配置字段 | | 完全相同 |
运行语义 | 被 Task 解析后启动 Session | 被 Task 解析后启动 Session |
复用 | 可被多个 Task 引用 | 只随当前 Task 配置保存 |
变更影响 | 所有引用者共享资产修改 | 只影响当前 StateTree 调用点 |
Source | 每个引用 Task 独立提供 | 当前 Task 提供 |
选择约束 | 与 Inline Plan 必须二选一 | 与 Plan 必须二选一 |
Data Asset 的独立资产校验覆盖 Plan 自身;Session 启动时还会把调用 Task 提供的 Source 一并做完整运行配置校验。Inline Plan 拥有相同字段和运行能力,配置所有权位于当前 Task。
FGAIS_TacticalAssignmentBatch
Batch 表达“这一优先级要请求何种语义、哪些候选可参与、如何修正分数以及由谁选择”。Source 由 Task 统一提供。
参数 | 用途 | 何时调整 | 误配风险 |
|---|---|---|---|
| 在编辑器、日志和诊断中识别当前 Batch。 | 多 Batch Plan。 | 缺失不会改变逻辑,但会增加排错难度。 |
| 要由候选 Unit 解析的 | 区分接敌、支援、驻守等行为时。 | 与 Resolver/ |
| 在命令校验前筛选候选 Actor;全部 Filter 都必须通过。 | 限定岗位、标签、状态或距离时。 | 过严会使 Actor pool 在此阶段归零。 |
| 在命令 | 限定阵营、来源、Actor/位置形态时。 | Command 随后仍会执行自身目标校验。 |
| 命令基础分的倍率。 | 需要批次级整体放大/压低偏好时。 | 极端值会淹没 Command 的基础评分。 |
| 乘法后加入的偏置。 | 需要统一抬升/降低某 Batch 偏好时。 | 不能让原本非法候选重新合法。 |
| 可选的最终选择器;为空时使用默认 Greedy With Capacity。 | 默认容量感知贪心不符合玩法时。 | 自定义 Allocator 不应重新发现 Source 或重跑命令校验。 |
StateTree Task 的运行输入
FGAIS_STT_RunTacticalAssignmentPlan 负责当前 StateTree 状态内的 Session 生命周期和顶层输入。
参数/输出 | 用途 | 注意事项 |
|---|---|---|
| 本轮的唯一拥有 Controller;Task 从其当前 Pawn 派生 Context Pawn。 | 无效 Controller 无法建立运行上下文。 |
| 可复用资产或内联规则。 | 必须且只能设置一个。 |
| 逐一贡献候选 Actor 的顶层 Source。 | 不属于 Batch;每个 Source 独立输出,最终取并集。 |
| 逐一贡献 | 无目标 Command 可以不消费它;其他 Batch 仍可需要真实目标。 |
| StateTree 可读的本轮输出。 | 由 Session 同步,供观察和分支判断使用。 |
| assignment 可用性变化的边沿事件。 | 连续相同状态不重复广播;Deferred 不广播。 |
Source 与 SourceTag
UGAIS_TacticalAssignmentAssigneeSource 与 UGAIS_TacticalAssignmentTargetSource 的 Gather 入口只填充输出数组。固定 Actor/Target Data 数组、小队成员、EQS Actor/Location 和项目自定义输入都可实现为 Source。
配置 | 用途 | 风险 |
|---|---|---|
Target Source | 给未带来源标签的产出目标添加来源语义,供 Filter、Resolver 和诊断使用。逐条 TargetData 已有 Tag 时不会覆盖。 | 标签体系不统一时,SourceTag Filter 会把预期目标全排除。 |
| 验证确定性前置条件,例如 QueryTemplate、RoleTag、显式 SquadActor。 | 不应拿它表达“本轮没有目标”;那是正常空输出。 |
Gather 输出 | 本轮独立贡献的候选。 | 空输出、查询无结果或无效输出记为该 Source 的零贡献;其他 Source 继续参与正常评估。 |
内置 Assignee Source
编辑器显示 / 类型 | 输入与行为 | 适合用途 | 关键限制 |
|---|---|---|---|
Actor Array / | 固定 | 最小验证、脚本绑定少量明确单位。 | 无效项会被丢弃;不适合动态搜索。 |
All Squad Units / | 从显式 | 把整个小队作为共享候选池。 | 不回退到 Context Pawn;未显式配置时本轮为空。 |
Squad Units By Role / | 按 | Source 层就只需要一种角色时。 | |
EQS Actors / | 运行 | 距离、可见性、区域等空间搜索。 | Query 必须返回 Actor 类型;当前实现使用同步即时查询,本轮失败只贡献空集。 |
内置 Target Source
所有 Target Source 都继承 SourceTag。
编辑器显示 / 类型 | 输入与行为 | 适合用途 | 关键限制 |
|---|---|---|---|
Target Data Array / | 直接提供 | Actor+Location、纯位置、预置 TargetTags/SourceTag。 | 每条数据必须能形成有效物理目标。 |
Actor Targets / | 将 | 固定敌人、友军或交互对象。 | 不生成纯位置目标。 |
All Squad Units / | 展开显式 | 治疗、支援、护送等以小队成员为目标的 Plan。 | |
EQS Actor Targets / | 将 EQS Actor item 转为目标,并保留 Actor owned tags。 | 动态敌人或可交互 Actor。 | |
EQS Location Targets / | 将 EQS Vector item 转为纯位置目标。 | 掩体点、守点位置、包抄位置。 | |
SourceTag 的写入、匹配与边界
- TargetData 已有有效
SourceTag:保留原值。 - TargetData 没有 Tag:补写所属 Target Source 的
SourceTag。 TargetFilter_SourceTag:先检查BlockedSourceTags,命中即拒绝;Allowed 为空则允许其余来源,否则必须匹配某个 Allowed Tag。匹配遵循 GameplayTag 的父子层级。- Intent Resolver:解析上下文包含该 Tag,可据来源选择 Command。
- GameplayDebugger:Assigned/Unassigned 行显示该 Tag。
- 候选与占用:同一 Actor 的不同 SourceTag 可以作为不同逻辑候选保留;reservation 统一按 Actor 计算,纯位置统一按位置网格计算。
内置 Assignee Filter
类型 / 显示名 | 判断内容 | 常见用途 |
|---|---|---|
| | 只让可战斗、未眩晕、具有某装备标签的 Unit 参与。 |
| 候选有有效 Squad Role。 | 排除尚未分配角色的成员。 |
| 候选存在 Squad 条目但没有有效 Role。 | 给未分工成员安排兜底任务。 |
| 用 | 一组角色共用 Batch。 |
| 候选必须有有效阵型槽位与 MovementIntent,并处于 | 只让掉队成员追赶,或只让已经接近槽位的成员进入下一任务。 |
Distance To Desired Location 的 DesiredLocationSource 可选预测/平滑后的 DesiredLocation 或原始 RawDesiredLocation;DistanceMetric 可选 2D/3D;最大距离为 0 时不设上界。
内置 Target Filter
类型 / 显示名 | 判断内容 | 常见用途 |
|---|---|---|
| 目标必须有 Actor,并满足 Required/Blocked/TagQuery。 | 只攻击可锁定敌人,或只治疗受伤友军。 |
| Context Actor 对目标 Actor 的态度等于 | 敌我筛选。 |
| 按 Allowed/Blocked 来源 Tag 筛选。 | 同一目标池分流到攻击、守点、玩家标记等 Batch。 |
| 只保留有效 Actor 目标。 | Actor 型 Command。 |
| 只保留无 Actor 的目标。 | 纯位置守点、移动、包抄。 |
Source 与 Filter 的边界是:Source 决定全局候选从哪里来;每个 Batch 的 Filter 决定这份并集中谁能参与当前战术意图。Filter 发生在配对与 Intent Resolver 之前,CommandDefinition 随后仍会执行自己的 CanObeyCommand 与 IsValidTarget。
目标容量与位置规范化
目标容量由 World Subsystem 统一管理。它通过 UGAIS_ProjectPolicy::ResolveTacticalAssignmentTargetCapacity 为规范化物理目标建立权威容量;默认策略使用 MaxAssigneesPerTacticalTarget,正数为硬上限,0 表示不限共享。Batch 和 Greedy Allocator 都没有独立的容量数字字段。
UGAIS_DeveloperSettings.TacticalAssignmentLocationTargetGridSize 控制纯位置目标的规范化网格尺寸。Actor 目标按 Actor 身份处理;无目标 Command 不参与物理目标 reservation。不要在 Plan 中寻找旧的 TargetLocationTolerance 或 MaxAssigneesPerTarget 字段。
自定义 Allocator 看到什么
FGAIS_TacticalAssignmentAllocatorContext 是只读的批次输入,包含 Context Actor、Batch Index、Batch 副本、已评分的 CandidateAssignments 和 TargetCapacities。其中容量视图已经包含当前世界的既有 claim;核心在接受结果时仍会验证候选来源与容量。
Allocator 应负责挑选,不应重新调用 Source、重做 Filter、重新解析 Intent 或绕过 Command 的校验。需要修改“某个 Unit 能否执行或某个目标是否合法”时,应回到 Command、Resolver 或 Filter。
默认 UGAIS_TacticalAssignmentAllocator_GreedyWithCapacity 会稳定地按 AdjustedScore 从高到低遍历候选。一个 Actor 最多产生一个选择;需要 reservation 的候选还要满足 ExistingClaims + 本批次已选数量 <= MaxAssignees。相同分数保持原候选顺序。
FGAIS_TacticalAssignmentCandidate
Allocator 接收的每一项已经走完 Source、Filter、Resolver 和 Command 校验:
字段 | 含义 |
|---|---|
| 准备接收 Command 的 Unit。 |
| 当前 Batch 请求的战术语义。 |
| 该 Unit 解析出的 Command Definition 与变体索引。 |
| Source 产生的原始目标,用于保留来源语义和 reservation 身份。 |
| 针对当前 Unit 解析后的最终命令目标。 |
| Actor 或位置网格对应的物理目标 bucket。 |
| CommandDefinition 返回的基础分。 |
| Batch 的乘数和偏置处理后的分数。 |
自定义 Allocator 将选中的原始候选写入 SelectedAssignments。核心会查回规范候选,因此修改字段、伪造新候选或重复选择同一 Actor都会被拒绝。
目标容量类型
FGAIS_TacticalAssignmentTargetCapacity 有三种模式:
| 行为 | 典型场景 |
|---|---|---|
| 使用 | 单人掩体、两人协同攻击、有限交互槽位。 |
| 允许任意数量的 Session/assignment 共享目标。 | 集结区域、公共跟随目标。 |
| 拒绝该物理目标的新 reservation。 | 暂时关闭的据点、正在维修的设施。 |
FGAIS_TacticalAssignmentTargetCapacityView.ExistingClaims 表示其他 Session 已占用的数量;请求 Session 自己现有的 claim 会在替换过程中单独处理。容量在 reservation bucket 非空期间保持已解析值,便于多次重评估获得稳定结果。
自定义容量入口为 UGAIS_ProjectPolicy::ResolveTacticalAssignmentTargetCapacity(World, CanonicalTargetData)。策略通过 CDO 调用,适合读取目标 Actor、类型、标签或项目规则并立即返回容量。跨帧使用量由 World Subsystem 管理,策略无需缓存 Actor 或计数。
结果与排错
Deferred 表示世界更新 guard 冲突或同步重入,并保留已跟踪 assignment 与 reservation。Source 本轮没有输出时,系统仍会完成正常评估,根据当前候选流协调旧 assignment,必要时标记为 Stale。
字段外的完整配置流程见 配置 Tactical Assignment Plan,扩展职责见 Tactical Assignment 扩展点,失败信号见 排错流程。
