跳转到内容

AI系统设计 review

专家普遍认同的 5 个核心思维模式

Section titled “专家普遍认同的 5 个核心思维模式”

1. 感知-决策-执行的三段式分离(Sense-Think-Act)

Section titled “1. 感知-决策-执行的三段式分离(Sense-Think-Act)”

这是游戏 AI 架构中最古老且最稳固的共识。从 Brooks 的包容架构到现代商业引擎,几乎所有从业者都认同:感知系统不应该直接触发动作,决策系统不应该自己去采集世界数据,执行系统不应该反过来修改决策逻辑。

这个共识的根基是认知科学的类比——即便是最简单的生物体,其神经系统也存在感觉输入、中枢处理、运动输出的功能划分。违反这一原则的系统(如在行为树叶节点中直接做空间查询并修改黑板)虽然短期能工作,但随复杂度增长必然陷入意大利面式耦合。

工作室游戏具体做法边界划分特点
Guerrilla Games《地平线:零之曙光/西之绝境》感知层:专用的 Perception System 维护”感知事件”队列(视觉、听觉、伤害),带独立的衰减和遗忘曲线。决策层:HTN Planner 消费感知结果生成行为计划。执行层:动画状态机 + 运动控制器。感知系统有自己的 记忆衰减模型,AI 不会立刻”忘记”消失的敌人,而是随时间降低置信度。决策层只看到经过感知层加工后的”信念”,而非原始世界数据。
Naughty Dog《最后生还者 Part II》感知层:多通道传感器(视锥、听觉半径、气味追踪犬专属)。决策层:行为树消费黑板中的感知结果。执行层:高度定制的动画驱动行为。感知管线有独立的 Tick 频率,与决策 Tick 解耦。视觉感知 10Hz,听觉感知即时事件驱动,决策层 5Hz。这种频率分离就是三段式架构的直接体现。
Bungie《光环:无限》感知层:Stimulus System(刺激系统),区分”即时刺激”(如爆炸)和”持续刺激”(如玩家位置)。决策层:效用评分(从 Halo 3 开始演进)。执行层:行为脚本 + 导航系统。独创性在于感知层输出的不是原始数据而是 “威胁评估”——一个经过标准化的综合指标,决策层消费这个抽象而非原始距离/角度。
id Software《DOOM Eternal》感知层极度简化:恶魔始终知道玩家位置(设计决策——游戏节奏要求零感知延迟)。决策层:效用系统评分选择攻击方式。执行层:动画驱动的攻击 + Arena 移动系统。反面案例般地证明了三段式的价值——当感知层被故意退化(全知),决策层和执行层反而可以更加纯粹。Hugo Martin(创意总监)公开解释过:恶魔不需要”发现”玩家,它们的 AI 复杂度全部投入在”如何围攻”上。
Monolith《中土世界:暗影战争》感知层:Nemesis System 的记忆模块记录与玩家的每次交互。决策层:个性化效用评分(怯懦的兽人降低进攻权重)。执行层:语音+动画+战斗系统联合驱动。感知层包含持久记忆——兽人记得上次被火焰杀死、记得玩家的武器类型。这种”感知→记忆→决策”的链条是三段式的自然延伸。

虽然三段式本身无争议,但各工作室在**感知层应该多”聪明”**上有分歧:

  • 厚感知派(Guerrilla、Naughty Dog):感知层做大量预处理(威胁评估、置信度衰减、目标优先级排序),决策层消费高层抽象
  • 薄感知派(id Software、部分独立工作室):感知层只做原始数据采集和基础过滤,复杂判断全部交给决策层

你的设计属于中间偏薄——GoalGenerator 做空间扫描和事件响应,GoalValidator 做存活校验,但没有置信度衰减或威胁评估等高级感知加工。这对 ARPG 场景是合理的(怪物通常不需要”逐渐忘记”玩家)。


2. 数据驱动优于硬编码(Data-Driven Design)

Section titled “2. 数据驱动优于硬编码(Data-Driven Design)”

AI 行为必须由配置数据(表格、脚本资产、JSON)而非编译型代码定义。这一点的共识程度极高,原因纯粹是实践性的:

  • 迭代速度:设计师调参不应该需要程序员重新编译
  • 组合爆炸:一个有 50 种怪物、每种 15 个行为的游戏,不可能逐一硬编码
  • 运行时可观测性:数据化的决策过程天然支持可视化调试
工作室游戏具体做法数据驱动深度
Bungie《光环 2/3/Reach/Infinite》早在 Halo 2 时代就开发了 设计师标记语言,AI 行为通过类 XML 的声明式配置定义。设计师可以直接修改怪物的战斗参数(射击精度曲线、掩体偏好权重、手雷使用阈值)而无需程序员介入。Halo 3 时进一步引入了实时热重载(修改配置文件后不重启游戏即可看到效果)。极深:不仅行为逻辑数据驱动,连 AI 的射击精度、反应延迟、感知灵敏度等都是曲线配置
Epic GamesUnreal Engine行为树本身是 DataAsset,通过可视化编辑器创建。黑板键定义、EQS 查询模板、装饰节点参数全部序列化为资产文件。支持运行时蓝图与 C++ 混合。中深:行为结构数据驱动,但复杂的自定义节点仍需 C++/蓝图代码实现
Bethesda《上古卷轴 V:天际》/《星空》AI Package 系统:每个 NPC 的日常行为由有序的 Package 列表定义(8:00-12:00 在铁匠铺工作,12:00-13:00 去酒馆吃饭,遇到龙切换到战斗 Package)。所有这些都在编辑器 Creation Kit 中配置,模组社区也可以修改。极深且开放:连模组玩家都可以通过编辑器修改 NPC 的 AI 行为,这是数据驱动理念的终极体现
CD Projekt RED《巫师 3》/《赛博朋克 2077》内部 DSL(领域特定语言)定义 AI 行为配置。《赛博朋克》中每种敌人类型有一个 AI Profile 数据文件,定义战术偏好、技能使用权重、撤退阈值等。中深:高层战术配置化,底层动作绑定仍有大量定制代码
Supergiant Games《哈迪斯》Boss 和小怪的攻击模式通过 Lua 脚本表 定义:攻击序列、冷却时间、阶段触发血量阈值、攻击概率权重全部在数据表中配置。程序员提供原子动作(冲刺、投射、AOE),设计师通过配置组合出千变万化的攻击模式。中深但高效:Lua 配置 + 预制原子动作的组合,适合精品小团队
miHoYo/HoYoverse《原神》怪物 AI 使用 配置表驱动的有限状态机。每种怪物有独立的行为配置文件,定义状态转换条件、攻击选择概率、距离阈值等。Boss 转阶段也通过配置的血量阈值触发。中深:状态机结构相对固定,但参数完全外置。量产效率极高,适合需要大量怪物类型的 GaaS 模式
FromSoftware《艾尔登法环》基于内部引擎的 Lua 行为脚本系统(EzState)。每个敌人有一个行为状态图,状态转换条件和动作权重通过 Lua 配置。“骑马时用这组招式、步行时用那组”完全通过数据切换,不改代码。深度定制:看似传统的状态机,但高度参数化的权重系统让同一个框架支撑了从小兵到 Malenia 的全部 AI 复杂度

关键差异:数据驱动的”深度光谱”

Section titled “关键差异:数据驱动的”深度光谱””
纯硬编码 ◄──────────────────────────────────────────────► 纯数据驱动
Indie FromSoft Epic/CD Bungie Bethesda
Quick&Dirty EzState BT Asset Config AI Package
DSL (甚至开放给
模组社区)

你的设计在这个光谱上处于偏深的位置——从 ai_archetypeai_behaviorAITask 全部是配置数据,甚至条件表达式(PreConditionAICondition)都是声明式的数据结构而非代码。这意味着运行时可以完整重建任何决策的推理路径,调试友好度极高。代价是配置复杂度较高,需要配套的编辑器工具支撑。


3. 关注点分离:AI 决策 vs. 能力/动画系统的边界

Section titled “3. 关注点分离:AI 决策 vs. 能力/动画系统的边界”

AI 系统决定”做什么”和”对谁做”,但”怎么做”的物理表现交给下游系统(GAS、动画状态机、物理引擎)。你的文档中表述为”AI 是大脑,GAS 是躯体”,这一原则在业界高度统一。

关键推论:AI 不应该直接操作动画骨骼、不应该自己管理 buff 堆叠、不应该维护碰撞状态。它只发出意图(“我想施放火球术”),由能力系统判断能否执行、由动画系统决定如何表现。

工作室游戏具体做法边界划定方式
Epic GamesUnreal GAS + BTAI 行为树的叶节点调用 TryActivateAbility(),GAS 自行判断前置条件(Cost、Cooldown、Tag 阻止)。如果 GAS 拒绝激活,行为树节点返回 Failed,AI 重选。AI 只发出意图,GAS 有否决权。AI 不检查蓝量是否足够——那是 GAS 的职责。AI 可以通过 CanActivateAbility 预查询来避免无效尝试,但这是优化而非职责。
Riot Games《英雄联盟》AI(机器人/PVE 怪物)通过 意图系统 向技能系统发出请求。技能系统维护所有状态(CD、资源、控制效果),AI 看到的是”技能是否可用”的只读视图。明确的 请求-响应 模式。AI 永远不直接修改游戏状态,只通过技能系统间接影响世界。
Naughty Dog《最后生还者 Part II》AI 选择”近战攻击”后,实际的动画选择、碰撞检测、伤害计算全部由 战斗系统(Combat System) 接管。AI 不知道也不关心最终播放的是左勾拳还是右直拳——它只说了”近战攻击”。意图粒度控制:AI 表达粗粒度意图,下游系统细化执行。这允许动画团队独立迭代战斗手感而不影响 AI 逻辑。
Guerrilla Games《地平线》系列机械兽的 AI 发出”使用火焰吐息”指令后,技能系统 处理蓄力时间、伤害判定、元素效果,动画系统 处理头部朝向、身体姿态调整,物理系统 处理火焰粒子与地形交互。AI 只管”什么时候用”和”对谁用”。极端的分离——一个”火焰吐息”行为的执行涉及 4 个独立系统协作,但 AI 层面只是一条指令。
FromSoftware《艾尔登法环》AI 状态机选择攻击后,执行委托给 EzState 动画事件系统。动画中嵌入的事件帧(伤害窗口、霸体窗口、位移曲线)完全独立于 AI 逻辑。设计师调整攻击时机在 AI 配置中,调整攻击手感在动画文件中。动画驱动的战斗系统:AI 触发动画,动画驱动游戏逻辑。AI 与战斗手感的迭代周期完全解耦。
Supergiant Games《哈迪斯》AI 脚本选择攻击模式(“三连斩→后跳→投射”),每个原子动作对应一个预制的 攻击定义(含伤害、范围、速度、动画剪辑)。AI 不知道伤害数值,只知道选择了哪个攻击模式。攻击定义作为契约:AI 选择 ID,战斗系统按 ID 执行。修改伤害值不需要改 AI,修改 AI 选择逻辑不需要改伤害值。

各工作室不约而同地采用了一个共同模式——AI 的输出是”意图声明”而非”状态修改”

AI 输出: "我想对目标 A 使用技能 #1234"
能力系统: "技能 #1234 冷却中 / 蓝不够 / 被沉默 → 拒绝"
"技能 #1234 可以释放 → 激活执行流"
动画系统: "技能 #1234 绑定动画 Montage_FireBlast → 播放"
战斗系统: "动画帧事件触发 → 生成伤害判定"

你的设计中 AITask.CastAbility { abilityId, target } 正是这一模式的标准实现。PreCondition.CanActivateAbility 作为决策层的预查询则是一个重要的性能优化——避免 AI 选择了一个必然被 GAS 拒绝的行为。


4. 可调试性是架构级需求,不是附加功能

Section titled “4. 可调试性是架构级需求,不是附加功能”

Bobby Anguelov 在 GDC 演讲中反复强调的核心观点——如果你无法在运行时清晰地看到 AI 为什么选择了这个行为而不是那个,你的系统就是不可维护的。这一点在工业界已成为共识。

工作室游戏具体调试工具与做法核心特点
Epic GamesUnreal EngineGameplay Debugger + Visual Logger。Gameplay Debugger 可在运行时头顶显示当前行为树执行路径、活跃黑板键值、EQS 查询结果的 3D 可视化(球体、射线、得分热力图)。Visual Logger 支持时间轴回放,可回溯任意帧的 AI 状态快照。时间轴回放是杀手特性——可以在游戏结束后逐帧检查”为什么 AI 在第 3 分 12 秒突然转身”
Naughty Dog《最后生还者 Part II》内部工具 AI Debug Overlay:每个 NPC 头顶实时显示当前行为名、感知状态(哪些刺激正在被处理)、黑板关键变量。支持暂停游戏后逐步执行 AI Tick,观察每次 Tick 的决策变化。逐 Tick 单步调试——对叙事驱动的精确编排至关重要。设计师可以精确定位”NPC 在这一帧为什么选择了躲避而不是开枪”。
Bungie《光环》系列AI Activity Viewer:一个运行时窗口,列出场景中每个 AI 的当前活动、目标选择理由、刺激源列表和响应权重。支持筛选特定 AI 类型,查看群体行为模式。在 Halo 3 中还引入了 AI 录制回放——记录整场战斗的所有 AI 决策日志,事后分析。群体行为分析能力——当 7 个 Elite 同时行动时,能看到每个个体的独立决策以及它们如何协调
id Software《DOOM Eternal》AI Director 可视化:调试模式下可以看到每个恶魔的效用分数实时柱状图,以及 AI Director(总导演)的”压力曲线”——控制战斗节奏的元 AI。Hugo Martin 公开展示过这个工具:屏幕上同时显示 12 个恶魔各自的攻击意图评分。全局 + 个体双视角:既能看到单个恶魔为什么选择冲锋,也能看到 Director 为什么决定现在该加压
Guerrilla Games《地平线》系列HTN 的调试优势:完整计划链可视化。因为 HTN 在决策时会生成一条完整的”计划”(如:接近→侧翼包抄→使用尾巴扫击→后撤),这整条链在调试视图中一目了然。失败时可以精确看到”计划在第 3 步分解失败,因为找不到有效的侧翼路径”。计划级调试而非节点级调试——可以看到 AI “打算”做的整个序列,而不只是当前一步
Monolith《中土世界》系列Nemesis System 有专门的 个性调试面板:显示每个兽人的性格特征(怯懦/暴躁/谨慎)、对玩家的记忆(被火烧过→恐惧火焰)、以及这些因素如何影响当前行为权重。个性化决策可追溯——当兽人逃跑时,调试面板清楚显示”因为上次被玩家的火焰箭杀死,恐惧火焰权重 +80,所以逃跑分数超过攻击”

从工业实践中可以归纳出调试能力的成熟度阶梯

层次能力代表
L1:状态快照运行时查看当前行为名、目标、关键变量大多数引擎的基础调试
L2:决策推理查看所有候选行为的得分、被淘汰原因、准入失败项DOOM Eternal 柱状图、你的设计目标
L3:时间轴回溯记录历史决策,事后逐帧回放分析Unreal Visual Logger、Halo AI 录制

你的设计文档将”白盒可调试性”定为一级约束,架构上支持 L2(扁平评分天然支持算分明细展示)。建议实现路径上也规划 L3 能力——在复杂 Boss 战中,问题往往出现在”30 秒前的那次重选”,而不是当前帧。


5. 打断机制必须显式设计(Interruption is a First-Class Concern)

Section titled “5. 打断机制必须显式设计(Interruption is a First-Class Concern)”

AI 行为最复杂的不是”开始做什么”,而是”什么时候停下来”。所有有经验的 AI 程序员都认同:打断不是异常处理,而是正常流程的一部分,必须在架构层面显式支持。

未显式设计打断的系统会出现:

  • 角色在自己快死时还坚持执行巡逻路径
  • Boss 在转阶段时被打断到一半卡在非法状态
  • 受击反应和当前行为的动画混合产生视觉错误
工作室游戏具体做法打断模型特点
Epic GamesUnreal Engine BT装饰节点的 Observer Aborts:行为树中的条件装饰节点可以配置 AbortType——Self(条件不满足时中止自身子树)、LowerPriority(中止右侧低优先级分支)、Both(同时中止两者)。这是 UE 行为树最核心的中断机制。声明式中止规则绑定在条件节点上,运行时自动监控并触发。优势是与条件判断天然耦合,劣势是跨层级中止的规则不直观
Naughty Dog《最后生还者 Part II》中断优先级系统:每个行为有一个 InterruptPriority 值。高优先级行为(如受击反应、玩家近身检测)可以中断低优先级行为(如搜索巡逻)。中断时触发专门的 过渡动画(如从跑步到急停转身),避免视觉跳变。动画过渡是中断设计的一等公民——不仅要决定”何时中断”,还要解决”中断时的视觉表现”。他们为每对高频中断组合都制作了定制过渡动画。
Bungie《光环》系列刺激-响应优先级:Halo 的 AI 将所有可能的中断原因分为 刺激等级(如:受伤 > 看到手雷 > 听到枪声 > 发现可用掩体)。高等级刺激立即中断当前行为;同级刺激排队等当前行为完成。中断与感知系统深度集成——中断条件不是在行为上声明的,而是在感知系统的刺激输出中内蕴的优先级。这意味着新增一种感知类型自动获得了正确的中断语义。
id Software《DOOM Eternal》无承诺机制:恶魔的效用评分每帧重算,理论上每帧都可以切换行为。但通过 动画锁定窗口(攻击动画的 active frames 期间不接受重选)实现了事实上的最小承诺时间。这不是 AI 层面的设计,而是动画系统的约束。打断由动画系统而非 AI 系统管控——AI 侧完全自由,但动画侧通过”不可中断帧”提供了硬约束。这与你的 minCommitmentTime 设计形成有趣对照。
FromSoftware《艾尔登法环》霸体 (Poise) 系统作为中断机制:Boss 的攻击行为是否被中断取决于 霸体值 是否被打空。AI 状态机中,受击中断是一个显式的全局转换(任何状态 → 受击/倒地状态),但条件是 Poise 归零。这意味着 AI 本身很少被”打断”——大多数时候是免疫中断直到霸体破。战斗系统的物理法则定义了中断边界。不是 AI 决定”我是否应该被中断”,而是战斗系统的数值判定”你是否有能力中断我”。AI 对此完全被动。
Guerrilla Games《地平线》系列HTN 计划失效 + 重规划:当计划执行过程中前提条件不再成立(如:目标移出射程),HTN 标记当前计划失效并触发重规划。重规划不是简单重选,而是可以复用部分已执行的计划步骤。计划级中断而非动作级中断——中断粒度是”整个计划是否还有效”,而不是”当前这个动作是否应该停止”。这更高层次的抽象减少了微观打断带来的行为抖动。
miHoYo/HoYoverse《原神》双层中断:全局中断层(冰冻/石化等硬控,强制中断任何行为并进入专用状态)+ 行为级中断(如目标切换触发的行为重选)。Boss 的特殊攻击标记为 “不可中断”,连硬控都无法打断(通过霸体实现)。与你的设计非常接近——global_ai_settings 对应全局中断层,abortConditions 对应行为级中断,interruptPriority 对应特权抢占。

从工业实践中可以归纳出三种打断哲学:

范式代表机制适用场景
AI 驱动中断你的设计、Halo、DOOMAI 系统主动检测条件并决定是否中断AI 有高度自主权的动作游戏
动画驱动中断FromSoftware、DOOM(补充)动画系统定义不可中断窗口,AI 对此被动服从强调动作手感和动画完整性的游戏
战斗系统驱动中断《艾尔登法环》霸体、《原神》元素反应数值系统判定是否突破防御,突破后强制中断需要玩家通过操作”赢得”中断权的游戏

你的设计主要采用范式一abortConditions + interruptPriority),辅以范式三的接口(通过 SelfHasAnyTags 读取 GAS 的控制标记实现全局硬控中断)。这是一个合理的混合:

  • AI 层面:战术中断(目标死亡、距离过远)由 abortConditions 处理
  • GAS 层面:物理中断(眩晕、死亡)由 global_ai_settings 的 Tag 查询处理
  • 动画层面:minCommitmentTime 提供了简化版的”不可中断窗口”

与 FromSoftware 的动画帧级精度相比,minCommitmentTime 是一个合理的简化——除非你的游戏需要”攻击动画前摇可中断、后摇不可中断”这种帧级控制,否则时间阈值已经足够。


横向总结:五大共识在各工作室的实现光谱

Section titled “横向总结:五大共识在各工作室的实现光谱”
共识最保守实现你的设计定位最激进实现
三段式分离薄感知+厚决策 (id)中间偏薄感知厚感知+记忆系统 (Guerrilla)
数据驱动代码+配置混合 (Epic BT)深度数据驱动(全配置)开放给模组社区 (Bethesda)
AI/能力边界AI 直接调用动画 (老式)意图声明 + GAS 执行多系统协作管线 (Guerrilla)
可调试性日志输出 (L1)L2(算分明细)L3 时间轴回溯 (Unreal VLog)
显式打断单层全局中断双轨(全局+行为级)三层(AI+动画+战斗系统)(FromSoft)

专家们存在根本分歧的三个方面

Section titled “专家们存在根本分歧的三个方面”

分歧一:行为树(Behavior Tree)vs. 效用系统(Utility AI / Flat Scoring)

Section titled “分歧一:行为树(Behavior Tree)vs. 效用系统(Utility AI / Flat Scoring)”

这是游戏 AI 架构中最持久、最激烈的路线之争。

可读性与意图表达:行为树的层级结构天然映射人类的逻辑思维。“如果有敌人 → 如果距离近 → 近战攻击;否则 → 远程攻击” 这样的逻辑在树形结构中一目了然。Mark Daly(Halo 2 AI Lead)指出,行为树的价值不在于运行时效率,而在于设计师能直接阅读和修改而不需要理解评分函数的数学含义。

确定性与可预测性:行为树的执行路径是确定的——给定相同的黑板状态,永远走相同的分支。这对于需要精确编排的叙事驱动游戏(如《最后生还者》)至关重要。设计师可以精确控制 AI 在特定剧情节点的行为,不会被一个意外的高分候选打乱。

工具链成熟度:Unreal 的 BehaviorTree + Blackboard 编辑器、Unity 的多个行为树插件经过十年以上的工业验证,拥有完善的可视化编辑器、断点调试、运行时实时预览。这不是技术优势,是生态优势

效用系统(扁平评分)阵营的最有力论点
Section titled “效用系统(扁平评分)阵营的最有力论点”

消除组合爆炸:Bobby Anguelov 的核心论点——当行为数量超过 20 个、每个行为有 3-5 个前置条件时,行为树的条件节点出现大量冗余。同一个”弹药是否充足”的检查可能散布在树的 7 个不同位置。修改一个条件逻辑需要在树中搜索所有出现位置,这是维护噩梦。

涌现行为的自然产生:Dave Mark(Behavioral Mathematics for Game AI 作者)的核心论点——效用系统天然支持权衡(trade-off)。一个行为的得分是多个因素的连续函数,而不是二元的 true/false 门控。这意味着 AI 可以表现出”虽然有点危险但回报很高所以冒险一试”的决策,这在行为树中需要大量额外节点来模拟。

调试的根本优势:在效用系统中,所有候选行为的得分可以同时显示在一个列表中。为什么 AI 没有治疗?因为治疗的分数是 35,而攻击的分数是 72。在行为树中,你看到的是”治疗分支没有被执行”——但原因可能是父节点的某个条件在上一帧刚好变为 false,你需要回溯整个遍历路径。

这不是”哪个更好”的问题,而是设计哲学的根本冲突

  • 行为树信奉”显式编排”——设计师应该精确控制 AI 的行为优先级和分支逻辑
  • 效用系统信奉”涌现组合”——设计师应该定义每个行为的价值函数,让系统自行选出最优解

分歧二:集中式黑板(Blackboard)vs. 分布式上下文(Scoped Context / Goal-Driven)

Section titled “分歧二:集中式黑板(Blackboard)vs. 分布式上下文(Scoped Context / Goal-Driven)”

这个分歧关乎”AI 的工作记忆应该如何组织”。

简单直接:一个全局键值对存储({ "target": Enemy_A, "lastSeenPosition": (10, 20, 0), "ammo": 30 }),所有行为节点都可以读写。Unreal 的 Blackboard 就是这个模式的典范。

跨行为共享:当行为 A 设定了一个追击目标,行为 B(如”掩护射击”)可以直接读取同一个 key 来获取队友的目标。不需要额外的数据传递机制。

Epic Games / Naughty Dog 的实践背书:这两家工作室在多部 AAA 作品中使用黑板模式,证明其在大规模生产中的可行性。

分布式上下文(你的设计所属阵营)的最有力论点
Section titled “分布式上下文(你的设计所属阵营)的最有力论点”

状态污染问题:黑板是全局可写的,这意味着任何行为都可以在任何时候修改任何 key。当 30 个行为共享一个黑板时,追踪”是谁在什么时候把 target 改成了 null”变成侦探工作。Bobby Anguelov 将此称为”幽灵写入问题”——一个行为的副作用在另一个行为执行时产生不可预期的影响。

生命周期耦合:目标(Goal)作为带有明确生命周期的对象(创建、验证、过期、清除)比黑板中一个可能被任意覆写的 key 更可靠。你的设计中 GoalValidator 周期性校验 Goal 合法性,这提供了黑板模式难以实现的一致性保证

单 Goal 驱动的清晰动机:每个行为声明自己需要什么类型的 Goal,系统自动从认知库中匹配。对比黑板模式中行为需要”知道”哪些 key 是相关的——这种知识是隐式的、脆弱的。

这是灵活性 vs. 安全性的经典权衡:

  • 黑板信奉”任何数据都可能被任何消费者需要,不应该人为限制访问”
  • 分布式上下文信奉”每个阶段只应该看到它需要的数据,写权限必须受控”

你的设计通过严格的 PerceiveContext / ThinkContext / ActContext 分层、以及 Goal 的单向流动,站在了后者一边。


分歧三:层级式组织(Hierarchical Grouping)vs. 完全扁平池(Pure Flat Pool)

Section titled “分歧三:层级式组织(Hierarchical Grouping)vs. 完全扁平池(Pure Flat Pool)”

这是效用系统内部的分歧——即便同意了”用评分取代行为树”,在组织结构上仍存在路线之争。

Dave Mark 的原教旨立场:所有行为放在一个池子里,每个行为独立评分,取最高分。没有 Group,没有层级,没有”先过滤再排序”的两阶段逻辑。理由是:任何层级都是隐式优先级,而隐式优先级正是行为树的核心问题。如果你引入 Group 共享条件,就是在用另一种方式重建行为树的层级,只是换了名字。

数学纯粹性:在完全扁平池中,行为 X 胜出意味着且仅意味着”X 的效用函数值是全局最高的”。没有”X 虽然分数最高但因为不在活跃 Group 中所以被跳过”的情况。调试者只需要比较数字大小。

配置爆炸的现实问题:当一个 Boss 有 40 个行为、其中 15 个近战行为都需要”距离 < 5m AND 不在眩晕中 AND 武器未损坏”的前置条件时,完全扁平意味着这三个条件写 15 遍。Group 的 sharedConditions 是工程上的必要抽象。

认知分组的调试价值:即便运行时是扁平评分,调试界面按 Group 分类展示(如”近战组”、“技能组”、“防御组”)对设计师的心智模型是巨大帮助。Kevin Dill(Lockheed Martin / IAUS 框架作者)指出,纯扁平列表在行为超过 20 个后,人眼无法快速定位问题。

你的设计的折中立场ai_behavior_group 声明为”仅用于共享 sharedConditions 以减少配置冗余,不构成运行时层级”。这是一个工程折中——运行时完全扁平,配置时允许逻辑分组。但批评者会指出,sharedConditions 在运行时确实参与了准入过滤,所以它事实上构成了一种隐式层级。

这是理论纯粹性 vs. 工程实用性的冲突:

  • 扁平派认为任何分组都是倒退回行为树
  • 分组派认为没有结构的 40 行为列表是不可维护的

对分歧一(行为树 vs. 效用系统)的判断

Section titled “对分歧一(行为树 vs. 效用系统)的判断”

我的立场:效用系统是更优的架构基底,但必须吸收行为树的优势。

行为树的真正价值不在于其运行时模型,而在于两点:(1)成熟的可视化编辑工具;(2)对确定性序列的天然表达力。效用系统解决了行为树在规模化时的核心痛点(条件冗余、调试困难),但不应该丢弃序列编排能力——这正是你的设计中 AITask.Sequence / Conditional / Loop 所做的事情:决策层用效用评分,执行层用任务序列。这是正确的混合路线。

工业实践:

工作室方案代表作备注
Guerrilla Games层级任务网络 (HTN)《地平线:零之曙光》HTN 本质上是带规划能力的行为树变体,但其 “decompose” 机制天然支持动态组合
id Software效用系统 (IAUS 变体)《DOOM Eternal》恶魔的攻击选择完全由效用函数驱动,没有行为树。高频动作游戏中效用系统的反应速度优势明显
Square Enix (Luminous)效用系统 + 有限状态机《最终幻想 XV》同伴 AI 使用效用评分决定战术角色(攻击/治疗/辅助),FSM 管理状态转换
Naughty Dog行为树 + 黑板《最后生还者 Part II》极度精细的手工编排,适合线性叙事但不适合开放世界;据内部分享,树的深度和复杂度已接近维护极限
Epic Games行为树 + 黑板 + EQSUnreal Engine 默认方案工业标准,但 EQS(环境查询系统)本质上是在行为树框架上补了效用系统的空间查询能力
CD Projekt RED行为树 + 效用系统混合《赛博朋克 2077》战斗 AI 使用效用系统选择战术,行为树执行具体动作序列

趋势判断:行业正在从纯行为树向混合架构或纯效用架构迁移。你的设计属于”效用决策 + tree执行”的混合范式,与 DOOM Eternal 和 FFXV 的思路一致。


对分歧二(集中式黑板 vs. 分布式上下文)的判断

Section titled “对分歧二(集中式黑板 vs. 分布式上下文)的判断”

我的立场:分布式上下文 + 受控共享是更健壮的选择,但需要为跨行为通信留出逃生舱口。

黑板的问题不是”全局存储”本身,而是”无约束的全局可写”。你的设计通过 PerceiveContext / ThinkContext / ActContext 的三阶段隔离,以及 Goal 作为唯一跨阶段数据载体,实现了优雅的受控流动。

但有一个实际场景值得注意:团队协作 AI(如《光环》的小队战术)需要多个 AI 共享目标分配结果(“我已经在压制 A 点了,你去包抄 B 点”)。在你的架构中,这需要通过外部系统(如 AI 协调器)向各个 AI 的感知层注入特定 Goal 来实现,而不是通过共享黑板。这是可行的,但设计师需要理解”用 Goal 注入替代黑板写入”的思维转换。

工业实践:

工作室方案评价
Bungie (Halo)分层黑板(Local + Squad + Global)黑板分层读写,小队级黑板由指挥 AI 维护,个体 AI 只读消费。是黑板模式的最佳实践
Naughty Dog集中式黑板单 Actor 黑板 + 全局感知系统。可行是因为《TLOU2》的 AI 数量有限且高度定制
Crystal Dynamics混合:事件驱动 + 黑板《古墓丽影》系列中 AI 通过事件总线传递关键状态变化,黑板仅存储持久数据
你的设计Goal 作为唯一跨阶段载体 + localStorage 作用域隔离理论上最干净,但需要为协作 AI 预留扩展点

建议:当前设计对单体 AI 已经足够。如果未来需要支持小队战术,可以考虑引入一个”SquadCoordinator”组件,它通过向队员的感知层注入 Goal.Squad.Assignment 来传递协调指令,而不是引入共享黑板。


对分歧三(层级式组织 vs. 完全扁平池)的判断

Section titled “对分歧三(层级式组织 vs. 完全扁平池)的判断”

我的立场:你的设计的折中方案(配置分组 + 运行时扁平)是工程上的最优解,但需要在文档中更诚实地承认 sharedConditions 的隐式层级性质。

Dave Mark 的纯扁平理想在数学上优美,但在 40+ 行为的生产环境中不可维护。Kevin Dill 的层级分组在工程上务实,但有倒退回行为树的风险。你的设计取了中间路线:

  • 配置时ai_behavior_group 提供 sharedConditions 共享,减少 15 个近战行为重复写 “距离 < 5m” 的冗余
  • 运行时:Group 完全展平,所有行为在同一池中评分

这个折中是好的,但有一个微妙问题:sharedConditions 在运行时确实被评估了——如果某个 Group 的 sharedCondition 失败,该 Group 下所有行为都被跳过。这事实上等同于一个运行时层级中的短路剪枝。对于调试和理解系统行为,设计师需要意识到这一点。

工业实践:

工作室方案行为数量级
id Software (DOOM Eternal)带分类标签的扁平池~15-20 / 恶魔种类
Monolith (Shadow of Mordor / War)Nemesis 系统使用标签过滤 + 扁平评分~30-50 / 兽人(含个性化变体)
Bethesda (Skyrim / Starfield)包系统 (AI Package) + 优先级栈包是层级的,但包内行为扁平
你的设计Group 配置分组 + 运行时扁平设计文档未限定,架构支持 40+

具体建议

  1. 在调试工具中,将 sharedConditions 的评估结果单独显示为一个”组级门控”,而不是混入每个行为的准入列表中。这样设计师可以一眼看到”不是行为 X 自身条件不满足,而是它所在的近战组被整体跳过了”。

  2. 考虑为 ai_behavior_group 添加可选的 isOptimizationOnly: bool 标记。当为 true 时,表示 sharedConditions 纯粹是性能优化(早期剪枝),逻辑上等价于将条件复制到每个行为中。这在文档和调试层面明确了意图。


你的设计在三大分歧中的定位:

分歧你的立场评价
行为树 vs. 效用系统效用决策 + tree执行✅ 与行业趋势一致的混合路线
黑板 vs. 分布式上下文Goal 驱动 + 阶段隔离上下文✅ 理论最干净,需为协作 AI 预留扩展
扁平 vs. 层级配置分组 + 运行时扁平✅ 务实折中,建议在调试层面更透明地暴露组级剪枝

这三个选择共同构成了一套立场清晰、工程可落地的 AI 行为系统。它不是所有场景的最优解(高度叙事驱动的线性游戏可能仍偏好行为树的精确编排),但对于动作 RPG、ARPG、开放世界等需要大量 AI 实体表现出自然、多样行为的游戏类型,这是一个成熟且有竞争力的架构选择。