虚幻基础:行为树


能帮到你的话,就给个赞吧 😘


文章目录

行为树:执行当前环境下的最优路径,失败后则执行下条最优路径

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

主策略:按照优先级执行

Sequence (紧急撤退) # 最高优先级

Sequence (人质救援) # 任务关键

Sequence (占领目标) # 战术目标

Selector (攻击模式) # 战术选择

Sequence (巡逻侦查) # 默认行为

缺陷:场景中同时有待救人质 和 弹药耗尽,则AI只会逃跑:AI只会按预设的优先级执行相同的行为,而无法像真正的指挥官一样,基于战场上的因素做出不同的决策:能够在动态的战场环境中智能决策,而不是死板决策

增加权衡系统:基于环境计算每个任务的收益,执行最高收益的任务:基于预期收益做出选择

决策修正系统

决策结果分析:分析执行结果与预测结果偏差

修正:调整决策参数

自适应学习

学习:根据结果改进预测模型

预测:根据预测模式预测决策

训练:根据训练模型训练预测

机器学习:能够自动更新函数内的规则

Q(State, Action)

将每次交战变为训练数据

根据数据预测而非固定规则

行为树:人为制定函数规则

机器学习:机器学习函数规则

相关推荐
开发游戏的老王11 小时前
虚幻引擎虚拟制片入门教程目录
游戏引擎·虚幻
AA陈超2 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-11 消息小部件
c++·游戏·ue5·游戏引擎·虚幻
AA陈超2 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-09 玩家等级与战斗接口
c++·游戏·ue5·游戏引擎·虚幻
开发游戏的老王3 天前
虚幻引擎虚拟制片入门教程 之 Sequencer 常用技巧
游戏引擎·虚幻
开发游戏的老王3 天前
虚幻引擎入门教程:虚幻编辑器的基本操作
编辑器·游戏引擎·虚幻
AA陈超3 天前
虚幻引擎5 GAS开发俯视角RPG游戏 P05-08 UI 部件数据表
c++·游戏·ue5·游戏引擎·虚幻
muyouking116 天前
UE 如何迁移 DerivedDataCache 路径,避免 C 盘因海量模型缓存爆盘
虚幻
开发游戏的老王8 天前
虚幻引擎入门教程:虚幻引擎的安装
游戏引擎·虚幻
muyouking118 天前
Unreal Engine 中的旋转表示:FQuat 与 FRotator 全面解析
游戏引擎·虚幻