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"。
