unity行为树的事件函数 简单测试

本文详细解析了行为树中关键方法的执行流程,包括OnAwake、OnStart、OnUpdate、OnEnd和OnPause,展示了从行为树启用到任务完成的全过程。通过具体帧数的分析,帮助读者理解每个方法的触发时机及其作用。

// OnAwake is called once when the behavior tree is enabled. Think of it as a constructor

public virtual void OnAwake();
// OnStart is called immediately before execution. It is used to setup any variables that need to be reset from the previous run
public virtual void OnStart();
// OnUpdate runs the actual task
public virtual TaskStatus OnUpdate();
// OnEnd is called after execution on a success or failure. 
public virtual void OnEnd();
// OnPause is called when the behavior is paused and resumed
public virtual void OnPause(bool paused);

 

第一帧:

          两个任务的OnAwake均执行了--------OnAwake是行为树Enable==true时执行

          第一个任务的OnStart执行--------------OnStar是进入任务后,执行第一次OnUpdate前执行

          第一个任务的OnUpdate执行,

第二帧:

          第一个任务OnUpdate执行一遍

第三帧:

          第一个任务OnUpdate执行一遍,返回任务成功

          接着执行了第一个任务的OnEnd

          然后开始第二个任务的OnStart()    ,OnAwake已经执行了

第四帧

        第二个任务的OnUpdate执行

第五帧:

       第二个任务的OnUpdate执行,任务成功

       接着执行了第二个任务的OnEnd

 

 

 

 

### Unity行为树的实现与使用 #### 1. 行为树的基本概念 行为树是一种用于控制AI决策的数学模型,广泛应用于计算机科学、机器人技术和视频游戏领域[^3]。它的主要目的是通过一种层次化的结构来管理复杂的任务集合。在Unity中,行为树可以通过脚本编写的方式实现,并结合场景需求灵活调整。 --- #### 2. 行为树的核心组件 为了在Unity中实现行为树,通常需要定义以下几个核心部分: - **节点 (Node)** 节点是行为树的基本单元,分为组合节点和叶子节点两大类。组合节点负责协调多个子节点的行为,而叶子节点则表示具体的动作或条件判断[^4]。 - **黑板 (Blackboard)** 黑板是一个全局的数据存储区域,允许不同节点之间共享信息。这种机制使得行为树的设计更加模块化和可重用[^2]。 - **根节点 (Root Node)** 整棵树的起点,所有的执行流程都从这里开始向下展开。 --- #### 3. 实现步骤详解 ##### 定义基础节点类 `BTNode` 以下是行为树的基础节点抽象类,所有具体类型的节点都需要继承该类并实现相应功能: ```csharp public abstract class BTNode { public virtual bool Execute() { return false; } } ``` ##### 创建组合节点 组合节点包括顺序节点 (`Sequence`) 和选择节点 (`Selector`) 等类型。这些节点会依次调用其子节点的方法,并根据返回值决定下一步操作。 ###### 顺序节点 (Sequence) 当所有子节点均成功完成时才返回 true: ```csharp public class Sequence : BTNode { private List<BTNode> children; public Sequence(List<BTNode> children) { this.children = children; } public override bool Execute() { foreach (var child in children) { if (!child.Execute()) { return false; // 只要有一个失败就中断 } } return true; } } ``` ###### 选择节点 (Selector) 一旦某个子节点成功即刻返回 true: ```csharp public class Selector : BTNode { private List<BTNode> children; public Selector(List<BTNode> children) { this.children = children; } public override bool Execute() { foreach (var child in children) { if (child.Execute()) { return true; // 成功立即退出循环 } } return false; } } ``` ##### 添加叶子节点 叶子节点通常是实际的任务或者条件检测器。 ###### 条件节点 (Condition) 用来测试特定条件是否满足: ```csharp public class Condition : BTNode { private Func<bool> conditionFunc; public Condition(Func<bool> func) { conditionFunc = func; } public override bool Execute() { return conditionFunc(); // 返回布尔表达式的计算结果 } } ``` ###### 执行节点 (Action) 代表一个具体的操作指令: ```csharp public class Action : BTNode { private Action actionFunc; public Action(System.Action func) { actionFunc = func; } public override bool Execute() { actionFunc?.Invoke(); return true; // 默认认为行动总是成功的 } } ``` --- #### 4. 使用示例 下面展示了一个简单的例子,说明如何构建一棵小型的行为树并在Update函数中运行它。 ```csharp using System.Collections.Generic; using UnityEngine; public class BehaviorTreeExample : MonoBehaviour { void Start() { var tree = new Sequence(new List<BTNode>() { new Condition(() => PlayerIsInRange()), new Action(() => AttackPlayer()) }); while (tree.Execute()) {} // 运行直到整棵树结束 } private bool PlayerIsInRange() { Debug.Log("Checking player range..."); return Random.value > 0.5f; // 随机模拟玩家距离情况 } private void AttackPlayer() { Debug.Log("Attacking the player!"); } } ``` 此代码片段展示了如何将条件检查和攻击逻辑封装到行为树中,并按需触发相应的响应。 --- #### 5. 结合黑板优化设计 为了让行为树更加强大且易于维护,可以引入黑板系统来保存动态变化的状态变量。例如,记录敌人的当前位置、目标优先级等信息均可存入黑板以便随时访问。 ```csharp public static Dictionary<string, object> Blackboard = new Dictionary<string, object>(); // 设置键值对 public static void SetData(string key, object value) { Blackboard[key] = value; } // 获取指定key对应的value public static T GetData<T>(string key) where T : class { return Blackboard.ContainsKey(key) ? Blackboard[key] as T : null; } ``` 随后可在任意节点内部调用上述方法读写所需数据。 --- ### 总结 以上就是在Unity环境中搭建一套简易版行为树系统的全过程。借助此类工具可以帮助开发者快速建立智能化程度较高的NPC角色交互模式,同时保持源码清晰易懂便于后期修改扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值