Tactical Assignment 参数

GAIS_Cover
YuewuDev

作者

YuewuDev

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

目录

Tactical Assignment 参数

Tactical Assignment 的配置分散在三个层次:Plan 定义批次与重评估节奏,StateTree Task 提供本次运行的顶层 Source,项目策略与设置定义物理目标的容量和位置规范化。运行时候选流、Allocator 上下文和 Session 跟踪状态都由系统即时生成,不属于可保存的 Plan 字段。

UGAIS_TacticalAssignmentPlan

Plan 可保存为 Data Asset,也可作为 StateTree Task 的 Inline Plan。它记录可复用的规划规则;候选 Unit 与目标由运行 Task 的 Source 提供。

参数

用途

何时调整

误配风险

Batches

按顺序执行的战术请求列表;前序 Batch 已分配的 Actor 不会进入后序 Batch。

需要多个战术优先级时。

把低优先级 Batch 放在前面会先占用候选。

ReevaluationInterval

自动重评估间隔,必须大于零。

局势变化速度与运行成本需要平衡时。

过短会频繁运行 Source、Filter、评分和分配;过长则响应迟缓。

Plan 资产验证会检查至少存在一个 Batch、每个 Batch 有有效 IntentTag、Filter 实例有效、ScoreAdjustment 为有限值,且重评估间隔合法。

Data Asset 与 Inline Plan 对照

项目

Plan Data Asset

Inline Plan

类型

UGAIS_TacticalAssignmentPlan 独立资产

同类型的 Task 内联实例

可配置字段

Batches、ReevaluationInterval

完全相同

运行语义

被 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 统一提供。

参数

用途

何时调整

误配风险

DebugName

在编辑器、日志和诊断中识别当前 Batch。

多 Batch Plan。

缺失不会改变逻辑,但会增加排错难度。

IntentTag

要由候选 Unit 解析的 GAIS.CommandIntent.* 语义。

区分接敌、支援、驻守等行为时。

与 Resolver/CommandIntentMappings 不匹配会产生 NoResolvedCommand。

AssigneeFilters

在命令校验前筛选候选 Actor;全部 Filter 都必须通过。

限定岗位、标签、状态或距离时。

过严会使 Actor pool 在此阶段归零。

TargetFilters

在命令 IsValidTarget 前筛选目标。

限定阵营、来源、Actor/位置形态时。

Command 随后仍会执行自身目标校验。

ScoreAdjustment.Multiplier

命令基础分的倍率。

需要批次级整体放大/压低偏好时。

极端值会淹没 Command 的基础评分。

ScoreAdjustment.AdditiveBias

乘法后加入的偏置。

需要统一抬升/降低某 Batch 偏好时。

不能让原本非法候选重新合法。

Allocator

可选的最终选择器;为空时使用默认 Greedy With Capacity。

默认容量感知贪心不符合玩法时。

自定义 Allocator 不应重新发现 Source 或重跑命令校验。

StateTree Task 的运行输入

FGAIS_STT_RunTacticalAssignmentPlan 负责当前 StateTree 状态内的 Session 生命周期和顶层输入。

参数/输出

用途

注意事项

AIController

本轮的唯一拥有 Controller;Task 从其当前 Pawn 派生 Context Pawn。

无效 Controller 无法建立运行上下文。

Plan / Inline Plan

可复用资产或内联规则。

必须且只能设置一个。

AssigneeSources

逐一贡献候选 Actor 的顶层 Source。

不属于 Batch;每个 Source 独立输出,最终取并集。

TargetSources

逐一贡献 FGAIS_CommandTargetData 的顶层 Source。

无目标 Command 可以不消费它;其他 Batch 仍可需要真实目标。

ReplanCount、LastUpdateResult、AssignmentCount

StateTree 可读的本轮输出。

由 Session 同步,供观察和分支判断使用。

OnAssignmentsAvailable / OnAssignmentsUnavailable

assignment 可用性变化的边沿事件。

连续相同状态不重复广播;Deferred 不广播。

Source 与 SourceTag

UGAIS_TacticalAssignmentAssigneeSource 与 UGAIS_TacticalAssignmentTargetSource 的 Gather 入口只填充输出数组。固定 Actor/Target Data 数组、小队成员、EQS Actor/Location 和项目自定义输入都可实现为 Source。

配置

用途

风险

Target Source SourceTag

给未带来源标签的产出目标添加来源语义,供 Filter、Resolver 和诊断使用。逐条 TargetData 已有 Tag 时不会覆盖。

标签体系不统一时,SourceTag Filter 会把预期目标全排除。

ValidateSourceConfiguration

验证确定性前置条件,例如 QueryTemplate、RoleTag、显式 SquadActor。

不应拿它表达“本轮没有目标”;那是正常空输出。

Gather 输出

本轮独立贡献的候选。

空输出、查询无结果或无效输出记为该 Source 的零贡献;其他 Source 继续参与正常评估。

内置 Assignee Source

编辑器显示 / 类型

输入与行为

适合用途

关键限制

Actor Array / UGAIS_TacticalAssignmentAssigneeSource_ActorArray

固定 Actors 数组。

最小验证、脚本绑定少量明确单位。

无效项会被丢弃;不适合动态搜索。

All Squad Units / UGAIS_TacticalAssignmentAssigneeSource_AllSquadUnitActors

从显式 SquadOverride 的 SquadComponent 展开所有已解析 Unit。

把整个小队作为共享候选池。

不回退到 Context Pawn;未显式配置时本轮为空。

Squad Units By Role / UGAIS_TacticalAssignmentAssigneeSource_SquadUnitActorsByRole

按 RoleTag 精确收集;SquadOverride 为空时尝试 Context Pawn。

Source 层就只需要一种角色时。

RoleTag 必填,并采用精确匹配;复杂角色集合可使用 Role Filter。

EQS Actors / UGAIS_TacticalAssignmentAssigneeSource_EQSActors

运行 QueryTemplate,按 RunMode 读取 Actor item;QuerierOverride 为空时使用 Context Pawn。

距离、可见性、区域等空间搜索。

Query 必须返回 Actor 类型;当前实现使用同步即时查询,本轮失败只贡献空集。

内置 Target Source

所有 Target Source 都继承 SourceTag。

编辑器显示 / 类型

输入与行为

适合用途

关键限制

Target Data Array / UGAIS_TacticalAssignmentTargetSource_TargetDataArray

直接提供 FGAIS_CommandTargetData 数组。

Actor+Location、纯位置、预置 TargetTags/SourceTag。

每条数据必须能形成有效物理目标。

Actor Targets / UGAIS_TacticalAssignmentTargetSource_ActorArray

将 Actors 转为 Actor TargetData。

固定敌人、友军或交互对象。

不生成纯位置目标。

All Squad Units / UGAIS_TacticalAssignmentTargetSource_AllSquadUnitActors

展开显式 SquadActor 的全部 Unit,并采集其 owned tags。

治疗、支援、护送等以小队成员为目标的 Plan。

SquadActor 必填。

EQS Actor Targets / UGAIS_TacticalAssignmentTargetSource_EQSActors

将 EQS Actor item 转为目标,并保留 Actor owned tags。

动态敌人或可交互 Actor。

QueryTemplate 必填且 item 类型必须是 Actor。

EQS Location Targets / UGAIS_TacticalAssignmentTargetSource_EQSLocations

将 EQS Vector item 转为纯位置目标。

掩体点、守点位置、包抄位置。

QueryTemplate 必填且 item 类型必须是 Vector/Location。

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

类型 / 显示名

判断内容

常见用途

UGAIS_TacticalAssignmentAssigneeFilter_ActorOwnedTags / Actor Owned Tags

RequiredTags 全部存在、BlockedTags 均不存在,并满足可选 TagQuery。

只让可战斗、未眩晕、具有某装备标签的 Unit 参与。

UGAIS_TacticalAssignmentAssigneeFilter_HasRole / Has Role

候选有有效 Squad Role。

排除尚未分配角色的成员。

UGAIS_TacticalAssignmentAssigneeFilter_NoRole / No Role

候选存在 Squad 条目但没有有效 Role。

给未分工成员安排兜底任务。

UGAIS_TacticalAssignmentAssigneeFilter_RoleTagQuery / Role Query

用 RoleTagQuery 检查 Squad Role;空 Query 接受任意有效 Role。

一组角色共用 Batch。

UGAIS_TacticalAssignmentAssigneeFilter_DistanceToDesiredLocation / Distance To Desired Location

候选必须有有效阵型槽位与 MovementIntent,并处于 MinimumDistance 到可选 MaximumDistance 范围。

只让掉队成员追赶,或只让已经接近槽位的成员进入下一任务。

Distance To Desired Location 的 DesiredLocationSource 可选预测/平滑后的 DesiredLocation 或原始 RawDesiredLocation;DistanceMetric 可选 2D/3D;最大距离为 0 时不设上界。

内置 Target Filter

类型 / 显示名

判断内容

常见用途

UGAIS_TacticalAssignmentTargetFilter_TargetActorOwnedTags / Target Actor Tags

目标必须有 Actor,并满足 Required/Blocked/TagQuery。

只攻击可锁定敌人,或只治疗受伤友军。

UGAIS_TacticalAssignmentTargetFilter_TeamAttitude / Team Attitude

Context Actor 对目标 Actor 的态度等于 RequiredAttitude,默认 Hostile。

敌我筛选。

UGAIS_TacticalAssignmentTargetFilter_SourceTag / Target Source Tag

按 Allowed/Blocked 来源 Tag 筛选。

同一目标池分流到攻击、守点、玩家标记等 Batch。

UGAIS_TacticalAssignmentTargetFilter_TargetHasActor / Has Actor Target

只保留有效 Actor 目标。

Actor 型 Command。

UGAIS_TacticalAssignmentTargetFilter_TargetHasNoActor / No Actor Target

只保留无 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 校验:

字段

含义

Actor

准备接收 Command 的 Unit。

IntentTag

当前 Batch 请求的战术语义。

ResolvedCommand

该 Unit 解析出的 Command Definition 与变体索引。

SourceTargetData

Source 产生的原始目标,用于保留来源语义和 reservation 身份。

TargetData

针对当前 Unit 解析后的最终命令目标。

ReservationKey

Actor 或位置网格对应的物理目标 bucket。

CommandScore

CommandDefinition 返回的基础分。

AdjustedScore

Batch 的乘数和偏置处理后的分数。

自定义 Allocator 将选中的原始候选写入 SelectedAssignments。核心会查回规范候选,因此修改字段、伪造新候选或重复选择同一 Actor都会被拒绝。

目标容量类型

FGAIS_TacticalAssignmentTargetCapacity 有三种模式:

Mode

行为

典型场景

Limited

使用 MaxAssignees 作为硬上限,数值至少为 1。

单人掩体、两人协同攻击、有限交互槽位。

Unlimited

允许任意数量的 Session/assignment 共享目标。

集结区域、公共跟随目标。

Blocked

拒绝该物理目标的新 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 扩展点,失败信号见 排错流程。