Unity 行为树(Behavior Tree)各个节点解析

在游戏开发中,行为树(Behavior Tree, BT)是一种用于控制 NPC、AI 角色行为的结构化方式。相比传统的有限状态机(FSM),行为树提供了更强的扩展性、可读性和复用性,因此被广泛应用于敌人 AI、NPC 交互、任务系统等领域。

本篇博客将详细介绍行为树的各个节点类型,帮助开发者理解行为树的基本结构及其应用场景。


1. 行为树的基本结构

行为树的核心是一个树状层级结构,每个节点都有不同的功能,最终决定 AI 的行为。
行为树的节点可以分为以下几类:

  • 根节点(Root)
  • 控制节点(Composite Nodes)
  • 装饰节点(Decorator Nodes)
  • 任务节点(Leaf Nodes)

2. 行为树的各类节点

2.1 根节点(Root Node)

根节点是行为树的起点,它没有输入,只能有一个子节点。根节点的作用是执行行为树的入口逻辑

示例:

  • AI_BehaviorTree(整个 AI 行为的起点)

2.2 控制节点(Composite Nodes)

控制节点是行为树的“分支结构”,用于管理子节点的执行逻辑。主要包括:

  1. 顺序(Sequence)节点
  2. 选择(Selector)节点
  3. 并行(Parallel)节点
  4. 随机(Random)节点
① 顺序节点(Sequence Node)
  • 执行方式:从左到右依次执行子节点,如果所有子节点都成功,则返回成功,一旦有子节点失败,则立即停止执行并返回失败。
  • 应用场景:用于确保一系列任务按顺序执行,比如“巡逻 -> 发现敌人 -> 追踪 -> 攻击”。

示例:

[Sequence]
 ├── 巡逻
 ├── 发现敌人
 ├── 追踪
 ├── 攻击

② 选择节点(Selector Node)
  • 执行方式:从左到右依次执行子节点,一旦有一个子节点成功,则停止执行并返回成功,如果所有子节点都失败,则返回失败。
  • 应用场景:用于尝试多个可能的行为,直到找到一个成功的,比如“寻找掩体 -> 逃跑 -> 乞求饶命”。

示例:

[Selector]
 ├── 寻找掩体(失败)
 ├── 逃跑(成功)
 ├── 乞求饶命(未执行)

③ 并行节点(Parallel Node)
  • 执行方式
    • 强制模式(所有子节点需成功,才返回成功)
    • 任意模式(任意一个子节点成功就返回成功)
  • 应用场景:执行多个任务,比如“攻击时播放音效 & 触发动画”。

示例:

[Parallel]
 ├── 播放攻击动画(成功)
 ├── 计算伤害(成功)
 ├── 生成粒子特效(成功)

④ 随机节点(Random Node)
  • 执行方式:随机选择一个子节点执行。
  • 应用场景:AI 角色有多种行为选择,如“巡逻、原地站立、绕圈”等,每次选择不同的行为。

示例:

[Random]
 ├── 巡逻
 ├── 站立
 ├── 绕圈

2.3 装饰节点(Decorator Nodes)

装饰节点只有一个子节点,用于控制子节点的执行条件,例如:

  • 反转(Inverter)
  • 重复(Repeat)
  • 条件检查(Condition)
  • 冷却时间(Cooldown)
① 反转节点(Inverter)
  • 执行方式:如果子节点返回成功,则变为失败;如果失败,则变为成功。
  • 应用场景:适用于“如果没有敌人,执行某个行为”。
[Inverter]
 ├── 发现敌人(失败 → 成功)

② 重复节点(Repeat)
  • 执行方式:不断重复执行子节点,直到达到指定次数或某个条件满足。
  • 应用场景:适用于循环行为,如巡逻、检测敌人、射击等
[Repeat 3 次]
 ├── 攻击

③ 条件检查(Condition Node)
  • 执行方式:检查某个条件是否满足,满足时才继续执行子节点。
  • 应用场景:适用于敌人生命值是否低于 50% 才撤退
[Condition: 敌人血量 < 50%]
 ├── 逃跑

④ 冷却时间(Cooldown Node)
  • 执行方式:当冷却时间未结束时,不执行子节点。
  • 应用场景:适用于“技能 CD 时间到达后才释放”。
[Cooldown 5s]
 ├── 使用技能

2.4 任务节点(Leaf Nodes)

任务节点是行为树的叶子节点,负责执行具体的动作,比如:

  • 巡逻
  • 攻击
  • 躲避
  • 拾取物品

这些节点通常会调用游戏中的实际逻辑,例如:

public class AttackNode : TaskNode
{
    
    
    public override NodeStatus Execute()
    {
    
    
        // 执行攻击逻辑
        AttackEnemy();
        return NodeStatus.Success;
    }
}

3. 行为树的应用案例

案例 1:敌人巡逻 AI

[Selector]
 ├── [Sequence] 发现敌人 → 追踪 → 攻击
 ├── [Sequence] 没发现敌人 → 巡逻
  • 如果发现敌人,就追踪并攻击。
  • 如果没发现敌人,就继续巡逻。

案例 2:BOSS 战斗 AI

[Selector]
 ├── [Sequence] 生命值 < 30% → 进入狂暴模式
 ├── [Sequence] 发现玩家 → 选择攻击方式(随机)
  • 如果生命值低于 30%,进入狂暴模式。
  • 如果发现玩家,则随机选择攻击方式。

4. 结论

行为树是一种强大的 AI 控制方式,能够提供清晰、直观的行为管理方式。不同的控制节点、装饰节点、任务节点的组合,使 AI 能够做出复杂的决策,并提供良好的扩展性。

在游戏 AI 设计中:

  • 选择节点 适用于多种行为选择。
  • 顺序节点 适用于依次执行任务。
  • 装饰节点 适用于行为控制,如冷却时间、条件检查等。

掌握行为树的各个节点,将有助于开发更加智能、灵活的 NPC 和游戏 AI。希望这篇博客能帮助你更好地理解和使用 Unity 行为树!