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 的记忆模块记录与玩家的每次交互。决策层:个性化效用评分(怯懦的兽人降低进攻权重)。执行层:语音+动画+战斗系统联合驱动。 | 感知层包含持久记忆——兽人记得上次被火焰杀死、记得玩家的武器类型。这种”感知→记忆→决策”的链条是三段式的自然延伸。 |
关键变体与边界争议
Section titled “关键变体与边界争议”虽然三段式本身无争议,但各工作室在**感知层应该多”聪明”**上有分歧:
- 厚感知派(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 Games | Unreal 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_archetype 到 ai_behavior 到 AITask 全部是配置数据,甚至条件表达式(PreCondition、AICondition)都是声明式的数据结构而非代码。这意味着运行时可以完整重建任何决策的推理路径,调试友好度极高。代价是配置复杂度较高,需要配套的编辑器工具支撑。
3. 关注点分离:AI 决策 vs. 能力/动画系统的边界
Section titled “3. 关注点分离:AI 决策 vs. 能力/动画系统的边界”AI 系统决定”做什么”和”对谁做”,但”怎么做”的物理表现交给下游系统(GAS、动画状态机、物理引擎)。你的文档中表述为”AI 是大脑,GAS 是躯体”,这一原则在业界高度统一。
关键推论:AI 不应该直接操作动画骨骼、不应该自己管理 buff 堆叠、不应该维护碰撞状态。它只发出意图(“我想施放火球术”),由能力系统判断能否执行、由动画系统决定如何表现。
| 工作室 | 游戏 | 具体做法 | 边界划定方式 |
|---|---|---|---|
| Epic Games | Unreal GAS + BT | AI 行为树的叶节点调用 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 选择逻辑不需要改伤害值。 |
关键实践模式
Section titled “关键实践模式”各工作室不约而同地采用了一个共同模式——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 Games | Unreal Engine | Gameplay 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,所以逃跑分数超过攻击” |
调试工具的三个层次
Section titled “调试工具的三个层次”从工业实践中可以归纳出调试能力的成熟度阶梯:
| 层次 | 能力 | 代表 |
|---|---|---|
| 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 Games | Unreal 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 对应特权抢占。 |
打断模型的三种范式
Section titled “打断模型的三种范式”从工业实践中可以归纳出三种打断哲学:
| 范式 | 代表 | 机制 | 适用场景 |
|---|---|---|---|
| AI 驱动中断 | 你的设计、Halo、DOOM | AI 系统主动检测条件并决定是否中断 | 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 架构中最持久、最激烈的路线之争。
行为树阵营的最有力论点
Section titled “行为树阵营的最有力论点”可读性与意图表达:行为树的层级结构天然映射人类的逻辑思维。“如果有敌人 → 如果距离近 → 近战攻击;否则 → 远程攻击” 这样的逻辑在树形结构中一目了然。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 的工作记忆应该如何组织”。
集中式黑板阵营的最有力论点
Section titled “集中式黑板阵营的最有力论点”简单直接:一个全局键值对存储({ "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)”这是效用系统内部的分歧——即便同意了”用评分取代行为树”,在组织结构上仍存在路线之争。
完全扁平池阵营的最有力论点
Section titled “完全扁平池阵营的最有力论点”Dave Mark 的原教旨立场:所有行为放在一个池子里,每个行为独立评分,取最高分。没有 Group,没有层级,没有”先过滤再排序”的两阶段逻辑。理由是:任何层级都是隐式优先级,而隐式优先级正是行为树的核心问题。如果你引入 Group 共享条件,就是在用另一种方式重建行为树的层级,只是换了名字。
数学纯粹性:在完全扁平池中,行为 X 胜出意味着且仅意味着”X 的效用函数值是全局最高的”。没有”X 虽然分数最高但因为不在活跃 Group 中所以被跳过”的情况。调试者只需要比较数字大小。
层级式组织阵营的最有力论点
Section titled “层级式组织阵营的最有力论点”配置爆炸的现实问题:当一个 Boss 有 40 个行为、其中 15 个近战行为都需要”距离 < 5m AND 不在眩晕中 AND 武器未损坏”的前置条件时,完全扁平意味着这三个条件写 15 遍。Group 的 sharedConditions 是工程上的必要抽象。
认知分组的调试价值:即便运行时是扁平评分,调试界面按 Group 分类展示(如”近战组”、“技能组”、“防御组”)对设计师的心智模型是巨大帮助。Kevin Dill(Lockheed Martin / IAUS 框架作者)指出,纯扁平列表在行为超过 20 个后,人眼无法快速定位问题。
你的设计的折中立场:ai_behavior_group 声明为”仅用于共享 sharedConditions 以减少配置冗余,不构成运行时层级”。这是一个工程折中——运行时完全扁平,配置时允许逻辑分组。但批评者会指出,sharedConditions 在运行时确实参与了准入过滤,所以它事实上构成了一种隐式层级。
这是理论纯粹性 vs. 工程实用性的冲突:
- 扁平派认为任何分组都是倒退回行为树
- 分组派认为没有结构的 40 行为列表是不可维护的
AI的判断与工业实践
Section titled “AI的判断与工业实践”对分歧一(行为树 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 | 行为树 + 黑板 + EQS | Unreal 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+ |
具体建议:
-
在调试工具中,将
sharedConditions的评估结果单独显示为一个”组级门控”,而不是混入每个行为的准入列表中。这样设计师可以一眼看到”不是行为 X 自身条件不满足,而是它所在的近战组被整体跳过了”。 -
考虑为
ai_behavior_group添加可选的isOptimizationOnly: bool标记。当为 true 时,表示 sharedConditions 纯粹是性能优化(早期剪枝),逻辑上等价于将条件复制到每个行为中。这在文档和调试层面明确了意图。
你的设计在三大分歧中的定位:
| 分歧 | 你的立场 | 评价 |
|---|---|---|
| 行为树 vs. 效用系统 | 效用决策 + tree执行 | ✅ 与行业趋势一致的混合路线 |
| 黑板 vs. 分布式上下文 | Goal 驱动 + 阶段隔离上下文 | ✅ 理论最干净,需为协作 AI 预留扩展 |
| 扁平 vs. 层级 | 配置分组 + 运行时扁平 | ✅ 务实折中,建议在调试层面更透明地暴露组级剪枝 |
这三个选择共同构成了一套立场清晰、工程可落地的 AI 行为系统。它不是所有场景的最优解(高度叙事驱动的线性游戏可能仍偏好行为树的精确编排),但对于动作 RPG、ARPG、开放世界等需要大量 AI 实体表现出自然、多样行为的游戏类型,这是一个成熟且有竞争力的架构选择。