能帮到你的话,就给个赞吧 😘
文章目录
- 行为树:执行当前环境下的最优路径,失败后则执行下条最优路径
-
- selector:优先执行第一条路径。第一条路径执行成功后不再执行。
- sequence:按顺序执行所有路径。
- 行为树的执行
-
- [行为树的一次执行 按顺序 执行所有路径,直到某个行为节点的执行结果返回至根节点](#行为树的一次执行 按顺序 执行所有路径,直到某个行为节点的执行结果返回至根节点)
- selector:优先执行第一个选择:第一个选择成功后,结束;第一个选择失败后,执行第二个选择,直到第n个选择执行成功...
-
- 第一个节点执行成功后,selector返回成功
- 第一个节点执行失败后,选择下一个节点执行
- 语义:选择节点:从多个分支中选择一个分支执行
-
- [当下这一步有多少种选择;从中判断哪个选择成立;与if else if 一样](#当下这一步有多少种选择;从中判断哪个选择成立;与if else if 一样)
- sequence:执行全部的节点;先执行第一个任务,第一个任务成功后执行第二个任务,直到全部的任务执行成功
- [通过selector 和 sequence 组合成 行为逻辑](#通过selector 和 sequence 组合成 行为逻辑)
- 示例
- 装饰器:控制执行流的进出:动态条件评估
-
- 执行条件检查AI:执行流进入装饰器时触发一次:判断节点是否可以运行:返回装饰器执行成功还是失败
- [接收执行完成AI:节点执行结束时&中止时 触发一次](#接收执行完成AI:节点执行结束时&中止时 触发一次)
- 观察者:观察器中止:装饰器在节点运行时一直检测:中止后返回失败
- 常用装饰器
- 服务:在节点运行时更新黑板数据
-
- 接收启用AI:节点运行时触发一次
- [接收Tick AI:节点运行时Tick触发](#接收Tick AI:节点运行时Tick触发)
- 接收停用AI:节点运行结束触发一次
- 复杂行为树示例:战场指挥官AI
-
- 主策略:按照优先级执行
-
- [Sequence (紧急撤退) # 最高优先级](# 最高优先级)
- [Sequence (人质救援) # 任务关键](# 任务关键)
- [Sequence (占领目标) # 战术目标](# 战术目标)
- [Selector (攻击模式) # 战术选择](# 战术选择)
- [Sequence (巡逻侦查) # 默认行为](# 默认行为)
- [缺陷:场景中同时有待救人质 和 弹药耗尽,则AI只会逃跑:AI只会按预设的优先级执行相同的行为,而无法像真正的指挥官一样,基于战场上的因素做出不同的决策:能够在动态的战场环境中智能决策,而不是死板决策](#缺陷:场景中同时有待救人质 和 弹药耗尽,则AI只会逃跑:AI只会按预设的优先级执行相同的行为,而无法像真正的指挥官一样,基于战场上的因素做出不同的决策:能够在动态的战场环境中智能决策,而不是死板决策)
- 增加权衡系统:基于环境计算每个任务的收益,执行最高收益的任务:基于预期收益做出选择
- 决策修正系统
- 自适应学习
- 学习:根据结果改进预测模型
- 机器学习:能够自动更新函数内的规则
-
- [Q(State, Action)](#Q(State, Action))
- 将每次交战变为训练数据
- 根据数据预测而非固定规则
- 行为树:人为制定函数规则
- 机器学习:机器学习函数规则
行为树:执行当前环境下的最优路径,失败后则执行下条最优路径
selector:优先执行第一条路径。第一条路径执行成功后不再执行。
sequence:按顺序执行所有路径。
行为树的执行
行为树的一次执行 按顺序 执行所有路径,直到某个行为节点的执行结果返回至根节点
selector:优先执行第一个选择:第一个选择成功后,结束;第一个选择失败后,执行第二个选择,直到第n个选择执行成功...
第一个节点执行成功后,selector返回成功
第一个节点执行失败后,选择下一个节点执行
语义:选择节点:从多个分支中选择一个分支执行
当下这一步有多少种选择;从中判断哪个选择成立;与if else if 一样
sequence:执行全部的节点;先执行第一个任务,第一个任务成功后执行第二个任务,直到全部的任务执行成功
第一个节点执行成功后,sequence继续执行下一个节点
第一个节点执行失败后,sequence返回失败
语义:顺序节点:多个分支按顺序执行
完成顺序节点需要有多少步子任务:第一步,第二步,第三步...;与函数一样
通过selector 和 sequence 组合成 行为逻辑
selector:策略选择器:选择使用哪种策略
sequence:策略选择器:策略的具体流程
示例
cpp
Root
└── Selector (主策略)
├── Sequence (自救) //高优先策略会打断低优先策略
│ ├── Decorator (循环直到失败)?
│ │ └── Condition: 生命值 < 20%
│ └── Action: 逃跑并呼救
├── Selector (战斗策略)
│ ├── Sequence (远程攻击)
│ │ ├── Condition: 看到玩家?
│ │ ├── Condition: 弹药 > 0
│ │ ├── Action: 移动到有效射程
│ │ └── Action: 远程开火
│ └── Sequence (近战攻击)
│ ├── Condition: 与玩家距离 <= 2米
│ ├── Action: 追逐玩家
│ └── Action: 近战劈砍
└── Sequence (巡逻)
├── Action: 移动至A点
├── Action: 移动至B点
└── Decorator (永远循环)?
└── Wait: 在点停留3秒
关键设计解析
1. 自救分支 (最高优先级)
python
Sequence (自救)
├── Decorator (循环直到失败)? # 持续检查条件
│ └── Condition: 生命值 < 20%
└── Action: 逃跑并呼救
设计意图:生命危险时立即响应
执行逻辑:只要生命值低于20%,就持续执行逃跑动作
2. 战斗策略分支 (中等优先级)
python
Selector (战斗策略)
├── Sequence (远程攻击) # 优先尝试远程
│ ├── Condition: 看到玩家?
│ ├── Condition: 弹药 > 0
│ ├── Action: 移动到有效射程 # 增加了移动逻辑
│ └── Action: 远程开火
└── Sequence (近战攻击) # 远程不行再近战
├── Condition: 与玩家距离 <= 2米
├── Action: 追逐玩家 # 确保在攻击范围内
└── Action: 近战劈砍
设计意图:提供多种战斗方式,远程优先
改进点:增加了移动和追逐逻辑,使行为更完整
3. 巡逻分支 (最低优先级,默认行为)
python
Sequence (巡逻)
├── Action: 移动至A点
├── Action: 移动至B点
└── Decorator (永远循环)? # 让巡逻持续进行
└── Wait: 在点停留3秒 # 增加真实感
设计意图:当没有其他事情可做时的默认行为
改进点:增加了等待装饰器,让巡逻更自然
行为树执行情景模拟
情景1:突发受伤
text
当前行为:移动至B点 (巡逻中)
事件:玩家从背后偷袭,敌人生命值降至15%
下一帧决策:
Root → Selector(主策略) → Sequence(自救) [条件通过] → Action:逃跑并呼救
结果:立即中断巡逻,开始逃跑
情景2:完整战斗流程
text
当前行为:移动至A点 (巡逻中)
事件:看到玩家,生命值100%,弹药充足
决策流程:
1. 自救条件检查:失败
2. 战斗策略-远程攻击:
- 看到玩家? → 成功
- 弹药 > 0? → 成功
- 移动到有效射程 → Running → Success
- 远程开火 → Running
结果:执行完整的远程攻击流程
情景3:弹药耗尽切换近战
text
当前行为:远程开火
事件:弹药耗尽为0
下一帧决策:
1. 自救条件检查:失败
2. 战斗策略-远程攻击:弹药检查失败
3. 战斗策略-近战攻击:
- 距离检查? → 失败(玩家太远)
- 追逐玩家 → Running
结果:停止射击,开始追逐玩家准备近战
进阶设计技巧
1. 使用装饰器优化
python
Sequence (远程攻击)
├── Decorator (超时5秒)? # 防止卡住
│ └── Action: 移动到有效射程
├── Condition: 看到玩家?
├── Condition: 弹药 > 0
└── Action: 远程开火
2. 增加共享条件
python
Selector (战斗策略)
├── Sequence (远程攻击)
│ ├── Condition: 看到玩家? # 共享条件
│ ├── Condition: 弹药 > 0
│ └── ...
└── Sequence (近战攻击)
├── Condition: 看到玩家? # 共享条件
├── Condition: 距离 <= 2米
└── ...
装饰器:控制执行流的进出:动态条件评估
执行条件检查AI:执行流进入装饰器时触发一次:判断节点是否可以运行:返回装饰器执行成功还是失败
接收执行完成AI:节点执行结束时&中止时 触发一次
观察者:观察器中止:装饰器在节点运行时一直检测:中止后返回失败
执行条件检查AI:节点运行时一直触发:不满足时中止
接收tickAI:开启观察器且节点在运行时触发
常用装饰器
cooldown:在节点执行完成后执行:执行期间阻止执行流进入节点
服务:在节点运行时更新黑板数据
接收启用AI:节点运行时触发一次
接收Tick AI:节点运行时Tick触发
接收停用AI:节点运行结束触发一次
复杂行为树示例:战场指挥官AI
