实战:巡逻-追击-攻击的完整 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。
