4.1 行为树与黑板:BOSS 三阶段是数据不是代码

核心结论

Roguelike 的 BOSS 核心体验是阶段切换:血量到 50% 进入"狂暴"——换攻击模式、换特效、换音乐。这个体验的实现方式,决定了策划能否独立调 BOSS。我的答案:行为树 + 黑板 + 阶段数据表,三阶段切换全部是数据。

行为树的结构(我的模板)

BT_Boss(行为树)
+-- [Selector] 根
    +-- [Decorator: 阶段 == P3 蓄力] 子树:终极技能
    +-- [Decorator: 阶段 == P2 狂暴] 子树:冲刺+连击
    +-- [Decorator: 阶段 == P1 常规] 子树:走位+普攻
    +-- [Decorator: 及时反应] 子树:受击闪避
  • 黑板(Blackboard):存 Phase(int)、Target(Actor)、bIsStunned 等状态。
  • 阶段切换:BOSS 的 GA(或受击逻辑)检测血量,改黑板的 Phase 值——行为树下一帧自动切子树,无需代码。

阶段数据表

DT_BossPhase:

记录 血量阈值 Phase Tag 音乐 特效组 攻击系数
Boss_GoblinKing_P1 100~51% Phase.P1 Music_Boss1 VFX_P1 1.0
Boss_GoblinKing_P2 50~21% Phase.P2 Music_Boss2 VFX_P2 1.3
Boss_GoblinKing_P3 20~0% Phase.P3 Music_Boss3 VFX_P3 1.8

好处: - 策划调阶段阈值 = 改一行数字。 - 音乐/特效/数值与阶段绑定,不会出现"P2 忘了换音乐"。 - 新 BOSS?复制表 + 改数值。

小怪 AI:与 BOSS 的分工

怪物 AI 方案 理由
杂兵 行为树(共享 BT) 简单、可复用
精英 行为树 + GAS 专属技能 有技能但要可控
BOSS 行为树 + 阶段表 + 自定义 Task 重体验、重表现
纯环境生物(鸟群) 简单蓝图/State Tree 无战斗逻辑

官方文档里的选择难题(BT vs State Tree):State Tree(https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/state-tree-in-unreal-engine-b79b)架构更现代、性能好,但行为树的"黑板 + Decorator"模式对策划更直观。我的建议:新项目、AI 重的用 State Tree;小项目用 BT。

常见坑与解法

坑 1:行为树"卡死"(一直跑同一个节点)

原因:节点没返回 Success/Failure,或 Decorator 死锁。

解法:行为树调试器(编辑器里按 ' 调出)看当前节点;所有 Task 明确返回值,别用潜伏节点忘了 Finish。

坑 2:AI 傻站(目标丢了)

原因:黑板的 Target 被清空或 AIController 的 Focus 没设。

解法:感知系统配好(见 0402);黑板 Target 设过期时间,让 AI 定期"重看"。

坑 3:阶段切换时卡动作

原因:阶段切换发生在攻击中,行为树被子树锁住。

解法:切换阶段时先给 BOSS 一个"过渡 GA"(怒吼动画 1s),动画期间行为树被 GameplayTag 暂停,过渡完才切子树。

坑 4:多个 BOSS 复用同一 BT 时互相干扰

原因:共享了静态变量或同一个黑板实例。

解法:黑板是 AIController 实例级的,每个 BOSS 有自己的 Controller 就有自己的黑板;避免用全局静态。

相关节点速查

  • 官方 BT:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/behavior-trees-in-unreal-engin-dbb9
  • 黑板键类型:Blackboard 的 KeyType
  • 调试:' 键的行为树调试器
  • 阶段表:DT_BossPhase + GA 解析

心得:把 BOSS 阶段做成数据表后,我们项目出了 5 个 BOSS——每个 BOSS 策划只花两天填表 + 调动画。代码一行没动。这就是数据驱动 AI 的复利:把"写 AI"变成"配 AI"。