行为树与 StateTree
Behavior Tree & StateTree
UE 的 AI 决策有两套工具:行为树 (Behavior Tree) + 黑板 (Blackboard) 是事件驱动的,条件写成装饰器 (Decorator),用 Simple Parallel、Services 和 Observer Aborts 代替传统并行节点;StateTree 是结合了行为树选择器和状态机转换的通用分层状态机,只在转换触发时按需选择状态,激活路径上的任务并发运行,通过属性绑定传递数据,也是 Mass 的行为层。优先级抢占多的战斗 AI 适合行为树,状态显式、分层或大规模的场景适合 StateTree。
两套决策工具
UE 提供两种 AI 决策结构:行为树 (Behavior Tree) + 黑板 (Blackboard),以及较新的 StateTree。它们解决同一个问题——「当前该做什么」——但调度模型不同。感知、环境查询与寻路见 AI 感知、EQS 与导航。
行为树基础
行为树在图中连接节点,黑板是独立资产,存放树决策所需的黑板键 (Blackboard Key)。执行顺序从左到右、从上到下。复合节点 (Composite:Selector、Sequence、Simple Parallel) 控制流程,装饰器 (Decorator) 挂在复合节点上做条件,任务 (Task) 是叶子动作。运行方式:Pawn 配一个 AI Controller,控制器在 Possess 时运行行为树;寻路需要关卡里有 NavMeshBoundsVolume。(Behavior Tree Overview)Pawn/Controller 分工见 Gameplay 框架。
UE 行为树与传统行为树的区别
| 特点 | UE 做法 | 好处 |
|---|---|---|
| 事件驱动 | 不每帧遍历整棵树,被动监听事件(如黑板键变化)再触发重选;高优先级分支可中断低优先级任务 | 性能好;调试历史只显示有意义的变化 |
| 条件不是叶子 | 用装饰器而非条件任务 | 图更易读;叶子全是动作;装饰器可作观察者 |
| 无完全并行节点 | Simple Parallel(一个主任务 + 一棵背景子树:「做 A 的同时做 B」) | 易优化 |
| Services | 挂在复合节点上,按指定间隔回调,执行停留在子树内期间有效 | 周期性更新(如挑选最佳目标) |
| Observer Aborts | 装饰器观察值变化,按 Self/低优先级等设置中止 | 替代并行节点里的「持续检查条件」 |
StateTree
官方定义:通用的分层状态机,把行为树的选择器 (Selector) 与状态机的状态 (State)、转换 (Transition) 结合。(StateTree Overview)
flowchart TD
Root --> A["Selector State 有子状态"]
A -->|"Enter Conditions 通过"| A1["Leaf State: Tasks 并发执行"]
A -->|"失败则试兄弟"| A2[Leaf State]
A1 -->|"首个 Task 完成/成功/失败 或 监控条件"| T{Transition}
T --> Root- 选择:从根开始逐层评估进入条件 (Enter Conditions);不通过则试下一个兄弟;到达叶子即选中;若某状态所有子状态都选不中,它本身也不被选中。选中叶子时,从根到叶的整条路径都处于激活状态,所有激活状态的任务并发执行。
- 转换:从叶向根评估,第一条成功并完成选择的转换生效,因此通用转换可以放在父状态上共享。可在任务完成时触发,也可标为每 Tick 检查。
- 与行为树的关键差异:行为树会持续执行选择逻辑;StateTree 只在转换触发时按需运行选择。
- 数据:参数 (Parameters)、上下文数据 (Context Data,取决于 Schema:Actor 或 Smart Object)、评估器 (Evaluators)、全局任务 (Global Tasks),通过属性绑定传递;任务只能绑定当前与父状态中更早的任务输出。
- 蓝图扩展:
UStateTreeTaskBlueprintBase、UStateTreeEvaluatorBlueprintBase、UStateTreeConditionBlueprintBase。 - 常见模式:分组共享转换、Next 转换做序列、分层失败处理、分层数据共享。(以上 StateTree Overview)
官方示例里大量出现 Mass 任务(如 Mass LookAt)与 Smart Object,StateTree 也是 MassEntity 数据导向框架 的行为层;而且它不限于 AI,官方举了昼夜系统的例子。(StateTree Overview)
怎么选
| 场景 | 倾向 |
|---|---|
| 优先级抢占明显的战斗 AI(看到玩家就中断巡逻) | 行为树:事件驱动 + Observer Aborts 天然契合 |
| 状态清晰、转换显式、需要分层共享逻辑 | StateTree |
| 大规模群体(Mass) | StateTree |
| 非 AI 的流程逻辑(昼夜、关卡流程) | StateTree |
(选型为基于两份官方概览的归纳。)
坑
- 行为树每帧检查条件的写法(在 Task 里轮询)会丢掉事件驱动的优势;条件应写成装饰器。(Behavior Tree Overview)
- StateTree 的任务全部并发,第一个结束的任务就会触发转换——把“只是持续运行”的任务放进状态时要注意它是否会提前结束。(StateTree Overview)
- 状态与条件常用 Gameplay 标签表达,见 Gameplay 标签深入(通识用法)。
出处
- Behavior Tree Overview UE 5.8 文档
- StateTree Overview UE 5.8 文档