黑板:AI 的记忆

行为树的节点是"逻辑",黑板(Blackboard)是"数据"。两者分离是行为树可复用的关键。

黑板里放什么

数据类型 典型键 谁写 谁读
目标 Actor TargetEnemy 感知系统 / 服务 攻击任务、追击任务
位置 PatrolPoint / LastKnownLocation 服务 / 移动完成回调 移动任务
状态标记 HasSeenEnemy / IsInCover 服务 / 任务 装饰器
数值 AlertLevel / AmmoCount 任务 / 游戏逻辑 装饰器

黑板的设计规范

  1. 键名与类型先规划好:黑板资产(BlackboardData)定义键;改名 / 改类型是破坏性变更,所有引用它的行为树都要改;
  2. 只放"决策需要"的数据:背包里的物品数量不属于黑板——它属于 Pawn 的组件,决策要用时读组件即可;
  3. 写入集中:一类数据只有一个写入口(如"最近敌人"只由感知服务写),避免多处写造成的时序竞争。

黑板的继承与共享

黑板资产可以继承(子黑板共享父黑板的键):项目里做一个"敌人基础黑板"(含 TargetEnemy 等),Boss 再继承扩展几个键。这样基础行为树可以无缝复用给所有敌人。

常见坑

坑 表现 解法
同一个黑板实例被多个 AI 共用 一个 AI 看到敌人,全场 AI 都"看到"了 每个 Pawn 的行为树组件运行时初始化自己的黑板实例
键的类型不匹配 读出来的值永远为空 / 默认 编辑器里看键的类型是否与写入端一致
清理时机错 目标死了但黑板还引用 目标死亡时写一个事件 / 服务里校验目标有效性

调试时按 ' 键(AI Debug 视图)可以直接看到当前黑板的所有值——这是排查"AI 为什么不动"的第一手段。