StateTree 与行为树的配合
StateTree 并不消灭行为树,而是重新分工。实践中搭配得当时,架构清晰度会有数量级提升。
推荐的分工模型
StateTree(高层:阶段)
├ 巡逻状态 ──→ 行为树 BT_Patrol(细节:绕点、观察、发呆)
├ 战斗状态 ──→ 行为树 BT_Combat(细节:追、攻击节奏、技能选择)
└ 撤退状态 ──→ 行为树 BT_Retreat(细节:找掩体、吃药、呼叫支援)
- StateTree 管"什么时候是战斗";
- 行为树管"战斗时具体做什么"。
状态里的行为不一定是完整行为树:也可以是 StateTree 自带的 Task 序列(简单的状态直接写几个任务即可)。
为什么这样分工
| 只用行为树的痛点 | 分工后的样子 |
|---|---|
| 阶段在海量装饰器里隐式存在,难维护 | 阶段就是 StateTree 的状态,一眼看清 |
| 阶段切换的资源清理(停特效 / 归位黑板)在各任务的完成回调里到处补 | StateTree 的退出任务统一清理 |
| 阶段相关数值(激进 / 保守倾向)散落装饰器参数 | 状态自己的参数,互不干扰 |
转换条件的典型来源
- 感知事件:目标感知更新 → 转换到战斗状态;
- 数值阈值:血量低于阈值 → 转换到撤退状态(StateTree 定时评估 + 事件触发);
- 状态完成:巡逻状态"绕完 3 圈" → 转换到休息状态;
- 外部系统:技能系统施加"眩晕"效果 → 广播事件 → 转换到眩晕状态。
混用期的注意
- 不要两套都做决策:高层在 StateTree,细节在行为树;如果发现行为树里又开始做"阶段切换"的事,就把它提到 StateTree;
- 调试用 StateTree 调试器:它的可视化比行为树的更直观(当前状态高亮),见 StateTree调试器快速入门。
