节点类型与执行机制
行为树的表面是"一棵树",本质是一套带返回值的执行协议。每种节点有自己的职责和返回值语义。
四种核心节点
| 节点 | 职责 | 典型例子 |
|---|---|---|
| 复合节点(Composite) | 决定怎么执行子节点 | Selector(选一个成功的)、Sequence(依次全部成功) |
| 装饰器(Decorator) | 条件守卫,决定节点能否执行 | "有敌人吗"、"血量低于 30% 吗" |
| 任务节点(Task) | 具体做一件事,返回成功 / 失败 | "移动到目标"、"播放攻击动画" |
| 服务节点(Service) | 周期性执行(挂在复合节点上) | "每隔 0.5 秒刷新最近敌人" |
执行规则:Selector vs Sequence
| 复合节点 | 子节点执行顺序 | 何时返回成功 | 何时返回失败 |
|---|---|---|---|
| Selector | 从左到右依次尝试 | 任一子节点成功 | 全部子节点失败 |
| Sequence | 从左到右依次执行 | 全部子节点成功 | 任一子节点失败 |
| (Parallel) | 同时执行多个 | 按配置(全部成功 / 主任务成功即终止) | 按配置 |
一个经典结构:
Selector(任一成功即可)
├ Sequence(巡逻链:满足条件 → 走到点 → 等待)
├ Sequence(追击链:看到敌人 → 追上 → 攻击)
└ Task(原地待命)
左边放优先级高的行为:追击排在巡逻前,所以 Selector 每次都会先试追击分支——试不成功(装饰器拦住了)才退回巡逻。
装饰器与服务的配合
- 装饰器是"条件":不通过则整条分支不执行(行为树的中断机制会让正在进行的行为立刻停止);
- 服务是"刷新":周期性更新黑板上的条件数据("最近敌人是谁"),供装饰器读。
注意:服务的执行间隔(Tick Interval)直接决定 AI 的反应速度与开销,默认 0.5 秒是平衡值,不要无故调到 0.05 秒。
行为树的中断(Interrupt)
行为树的精华机制:当高优先级分支的条件满足时(如巡逻中突然看到敌人),它会打断当前正在执行的低优先级行为。这是行为树"看起来自然"的核心。配置中断的关键概念是 NotifyObserver / Observer Abort:装饰器条件变化时要通知哪个范围的节点中断。设错了,AI 会出现"看到敌人还继续巡逻走完"的迟钝表现。
