实战:用 StateTree 重写巡逻-追击-攻击 AI

拿第 2 章的同一个需求,看 StateTree 版本长什么样,以及两版的体感差异。

状态结构

Root
├ Patrol(巡逻)
│   ├ Task: 选下一个巡逻点
│   ├ Task: 移动到点
│   └ Task: 原地观察
├ Combat(战斗)
│   ├ Task: 追击(更新目标位置)
│   └ Task: 攻击(含冷却)
└ Search(查看)
    └ Task: 移动到最后已知位置

转换(Transition)

从 到 条件
Patrol Combat 事件"感知到敌人"(事件转换)
Combat Search "目标丢失"条件转换
Search Combat 事件"再次看到敌人"
Search Patrol "到达查看点"(状态内任务完成)

事件接入

感知组件的事件直接转发给 StateTree(它的事件入口),不用像行为树那样通过服务轮询黑板。这一步是 StateTree 最香的点:事件驱动是原生支持,而行为树需要"服务 + 装饰器"间接实现。

与行为树版的对比

维度 行为树版 StateTree 版
"当前在做什么" 要看激活的节点 当前状态一目了然(调试器高亮)
反应性 靠装饰器观察者中断 原生事件转换
资源清理 各任务的完成回调里补 状态的退出任务统一
结构阅读 树形(优先级感强) 状态图(阶段感强)
新手理解成本 低 中(要理解状态机)

结论:不是替换,是选型

  • 已有行为树的项目:留着,不用为了用 StateTree 而重写(重写本身有风险且无玩家可见收益);
  • 新项目 / 新 AI:直接用 StateTree,长期维护收益大;
  • 复杂 Boss:StateTree(阶段多、转换多、事件多)。

无论选哪个,感知层与环境查询层(EQS)都不变。下一章讲 EQS 这个"AI 的空间推理能力"。