UE的AI行为树Selector和Sequence如何理解

在 Unreal Engine 的行为树(Behavior Tree)中,SequenceSelector 都属于“复合节点”(Composite Nodes),它们负责控制子节点的执行流程。可以把它们类比成程序里的“逻辑运算符”:


1. Sequence(序列节点)

  • 执行逻辑:从左到右依次执行它的每个子节点,

    • 如果某个子节点返回 Failure(失败),整个 Sequence 就立即返回 Failure,不再执行后续子节点。

    • 只有当所有子节点都返回 Success(成功)时,Sequence 才返回 Success

  • 用途:用来描述“并且”关系的行为流程——只有前面的动作都成功了,才继续下一个动作。

  • 示例

    1. 检查玩家是否在视野内(检测节点)

    2. 向玩家移动(移动节点)

    3. 执行攻击(攻击节点)

    如果第 1 步检测失败(玩家不在视野内),Sequence 立即失败,AI 不会执行移动和攻击。


2. Selector(选择节点)

  • 执行逻辑:同样从左到右依次执行它的每个子节点,

    • 如果某个子节点返回 Success,整个 Selector 就立即返回 Success,不再执行后续子节点。

    • 只有当所有子节点都返回 Failure 时,Selector 才返回 Failure

  • 用途:用来描述“或者”关系的行为分支——只要有一个动作成功,就当整体成功。

  • 示例

    1. 如果血量低(检测节点),则执行“寻找回血点”

    2. 否则如果看到敌人(检测节点),则执行“攻击敌人”

    3. 否则执行“巡逻”

    — 当第 1 步检测到血量低,Selector 返回成功,AI 直接去回血,不会再判断看到敌人的分支。


  • Sequence:只要遇到失败就“短路”(short-circuit)返回失败。

  • Selector:只要遇到成功就“短路”返回成功。


3. 使用建议

  • Sequence 常用在“完成一系列步骤”场景,比如:开门 → 进入房间 → 拾取物品。

  • Selector 常用在“多种策略可选”场景,比如:如果能攻击就攻击,否则就去巡逻;如果看见敌人就追踪,否则就隐藏。


掌握了这两者,就能灵活地搭建出复杂的 AI 行为逻辑:用 Sequence 组合必须按顺序完成的动作,用 Selector 划分不同的行为分支。这样既清晰又易于维护。

### Unreal Engine 行为树机制概述 行为树是一种用于实现游戏角色智能决策的技术,在Unreal Engine中得到了广泛应用支持。这种结构允许开发者创建复杂的AI逻辑,而无需编写大量的条件语句[^4]。 #### 创建基本行为树节点 在Unoreal Engine里,可以通过编辑器直观地搭建行为树。每一个节点代表一种特定的行为或判断标准。常见的节点类型有: - **Task Node(任务节点)**: 执行具体动作的任务单元。 - **Composite Node(组合节点)**: 可以包含多个子节点的容器类节点,如Sequence(序列), Selector(选择). - **Decorator Node(修饰符节点)**: 对其他节点施加额外条件限制. ```cpp // 定义一个简单的任务节点 UBTService_Blackboard::FConstructor CreateBlackBoardKey(FName KeyName); ``` #### 设计巡逻AI实例 为了展示实际应用场景下的行为树运用方式, 下面给出一段关于设置简单敌人巡逻路径的例子: 1. 新建Behavior Tree资源并打开它. 2. 添加`Selector`(选择者)作为根节点以便于后续扩展更多可能性分支. 3. 连接两个`Sequence`(顺序执行者),分别对应两种不同情况——发现目标时攻击;未发现则继续巡逻. 4. 在每个`Sequence`下挂载相应的装饰器(`Check Distance`)行动指令(`Move To`,`Attack Target`)等组件. ```mermaid graph TD; A[Root Selector] --> B{HasTarget?}; B -- Yes --> C((Attack Sequence)); B -- No --> D(Patrol Sequence); C --> E(CheckDistance Decorator); C --> F(MoveTo Task); C --> G(ShootAt Task); D --> H(GetNextPatrolPoint Service); D --> I(MoveTo Task); ``` #### 结合蓝图与C++ 除了纯蓝图外,还可以利用C++的优势增强行为树的功能。比如自定义服务、事件处理函数或是更高效的计算密集型操作都可以放在原生代码层面完成. ```cpp UCLASS() class MYGAME_API UMyCustomBTService : public UBTAIService { public: UMyCustomBTService(const FObjectInitializer& ObjectInitializer); protected: virtual void OnGameplayTaskActivated(UGameplayTask& Task) override; private: UPROPERTY(EditAnywhere, Category="Settings") float UpdateInterval; // 自定义更新间隔参数 }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UE星空

感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值