实战:巡逻-追击-攻击的完整 AI

把前面的零件装成一台完整的机器。这个 AI 的行为规格:

  • 无目标时在 3 个巡逻点之间巡逻;
  • 视野内看到玩家进入追击;
  • 追到攻击距离内开始攻击(有冷却);
  • 玩家逃离视野后,去最后已知位置查看,然后回巡逻。

结构总览

Selector(根)
├ 装饰器[目标有效 + 在攻击距离内] → Sequence「攻击」
│   ├ Task「攻击(含冷却)」
├ 装饰器[目标有效] → Sequence「追击」
│   ├ Task「移动到目标(更新中的位置)」
├ 装饰器[有最后已知位置] → Sequence「查看」
│   ├ Task「移动到最后已知位置」→ Task「到达后清空标记」
└ Sequence「巡逻」
   ├ Task「选下一个巡逻点」→ Task「移动到巡逻点」→ Task「原地观察一会儿」

注意优先级从左到右递减:攻击分支最左,所以一旦满足条件就会打断追击与巡逻。

需要的黑板键

键 类型 谁写
TargetEnemy Object 感知服务
LastKnownLocation Vector 感知服务(目标丢失时写)
PatrolIndex Int 巡逻任务
AttackCooldown Float 攻击任务

感知服务的设计

一个挂在根节点的服务 BTService_UpdateSenses:

  • 周期 0.3 秒;
  • 读感知组件的当前最新目标,有效则写 TargetEnemy,并更新 LastKnownLocation;
  • 目标消失(记忆超时)时清空 TargetEnemy,保留 LastKnownLocation 供"查看"分支使用。

攻击任务的冷却

黑板 AttackCooldown 记录"下次可攻击时间",攻击任务开头检查 游戏时间 >= AttackCooldown,否则返回失败(让追击分支接管一下节奏)。这样"攻击 → 冷却 → 追两步 → 再攻击"的节奏自然出现,不需要额外写节奏逻辑。

调试与验证清单

检查项 方法
巡逻正常 没有玩家时 AI 循环走三点
看见玩家 AI Debug 里看感知状态 + 黑板 TargetEnemy 有值
打断生效 巡逻中突然出现玩家,AI 立即转向(不是走完当前点)
丢失目标 玩家躲起来后 AI 去最后位置查看
回到巡逻 查看无果后回到巡逻循环

做完这个例子,你就掌握了行为树 80% 的日常用法。下一章看 StateTree 如何用另一套模型表达同一套 AI。