在游戏开发中,行为树(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)
控制节点是行为树的“分支结构”,用于管理子节点的执行逻辑。主要包括:
- 顺序(Sequence)节点
- 选择(Selector)节点
- 并行(Parallel)节点
- 随机(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 行为树!