黑板:AI 的记忆
行为树的节点是"逻辑",黑板(Blackboard)是"数据"。两者分离是行为树可复用的关键。
黑板里放什么
| 数据类型 | 典型键 | 谁写 | 谁读 |
|---|---|---|---|
| 目标 Actor | TargetEnemy |
感知系统 / 服务 | 攻击任务、追击任务 |
| 位置 | PatrolPoint / LastKnownLocation |
服务 / 移动完成回调 | 移动任务 |
| 状态标记 | HasSeenEnemy / IsInCover |
服务 / 任务 | 装饰器 |
| 数值 | AlertLevel / AmmoCount |
任务 / 游戏逻辑 | 装饰器 |
黑板的设计规范
- 键名与类型先规划好:黑板资产(BlackboardData)定义键;改名 / 改类型是破坏性变更,所有引用它的行为树都要改;
- 只放"决策需要"的数据:背包里的物品数量不属于黑板——它属于 Pawn 的组件,决策要用时读组件即可;
- 写入集中:一类数据只有一个写入口(如"最近敌人"只由感知服务写),避免多处写造成的时序竞争。
黑板的继承与共享
黑板资产可以继承(子黑板共享父黑板的键):项目里做一个"敌人基础黑板"(含 TargetEnemy 等),Boss 再继承扩展几个键。这样基础行为树可以无缝复用给所有敌人。
常见坑
| 坑 | 表现 | 解法 |
|---|---|---|
| 同一个黑板实例被多个 AI 共用 | 一个 AI 看到敌人,全场 AI 都"看到"了 | 每个 Pawn 的行为树组件运行时初始化自己的黑板实例 |
| 键的类型不匹配 | 读出来的值永远为空 / 默认 | 编辑器里看键的类型是否与写入端一致 |
| 清理时机错 | 目标死了但黑板还引用 | 目标死亡时写一个事件 / 服务里校验目标有效性 |
调试时按
'键(AI Debug 视图)可以直接看到当前黑板的所有值——这是排查"AI 为什么不动"的第一手段。
