行为树、状态机与 StateTree:怎么选
UE5 里写决策层有三把椅子:蓝图状态机(ScriptedState 逻辑)、行为树(Behavior Tree)、StateTree(状态树)。没有"最好",只有"最合适"。
三者的定位
| 框架 | 核心模型 | 最擅长 | 短板 |
|---|---|---|---|
| 行为树 | 树形节点 + 装饰器 + 服务 | 有层次的复合行为(巡逻 → 追击 → 攻击的分支组合) | 状态感弱("我在哪个阶段"要靠黑板间接表达) |
| StateTree | 状态 + 转换(增强型层级状态机) | 明确的阶段性 AI(阶段机的每个状态本身就是一棵小行为树) | 新框架,学习与排错资料相对少 |
| 蓝图状态机 | 蓝图里的 if / switch + Tick 事件 | 极简 AI(2~3 个状态) | 规模化后蓝图臋肿、无法复用 |
一个直觉的选型标准
| 你的 AI 长这样 | 推荐 |
|---|---|
| "有的情况做 A,没的情况做 B" 的简单分支 | 蓝图里的状态逻辑足够 |
| 巡逻 / 警戒 / 追击 / 攻击多个模式来回切 | 行为树或 StateTree |
| 每个模式内部又有复杂子行为 | StateTree(每个状态内嵌一个小行为树) |
| 需要多个 AI 共享一套逻辑、参数各异 | 行为树的参数化 + 数据表 |
它们不是互斥的
UE 的现代实践是混用:
- StateTree 做高层阶段切换(巡逻 / 战斗 / 撤退);
- 每个状态内部跑一个行为树处理细节(战斗状态里的攻击节奏);
- 感知系统与 EQS 伺候两边。
引擎的 StateTree概述 明确说明它的定位是"结合行为树的表达力与状态机的清晰"。新项目可以直接从 StateTree 起步,维护中的旧项目继续用行为树也完全没问题。
