Unity插件之Behavior Designer学习笔记

本文详细介绍行为树设计原理,包括Task类型、属性配置、共享变量管理及动态加载子树等高级特性。通过实例演示如何利用共享变量进行状态传递,以及调试技巧确保行为树正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

趁着周末,来学习一下行为树,本博客将记录在学习过程中的实践和延伸知识点,如果是初学者,可先点击官方文档学习(也可阅读大佬的中文版教程)。

行为树插件和扩展的一些小案例在文末。

Task

1】新建一个Task,同创建一个C#脚本类似,右键选择Create-Behavior Designer-C# Action Task。

2】Task的instant属性,如果勾选,则当该Task执行完毕后同一帧会立刻移动到下一个Task。如果未勾选,则是等到下一个tick后才会移动到下一个Task

3】Selector: 等同于or 下图的意思,可以理解成
if(A == success) return;
else if(B == success) return;
在这里插入图片描述

共享变量

共享变量分为局部变量和全局变量,用法类似,作用域不同。
局部变量:作用域是本棵树
全局变量:作用域是所有树
SetVariable:

	public BehaviorTree bt;
	public SharedString oriStr;
	public SharedGameObject oriGo;

	public override void OnStart()
	{
		oriStr.Value = "i am a temp var";
		//Set a local variable with scope as the behavior tree
		bt.SetVariable("tempVariable", oriStr);

		//Set a global variable with a scope of all behavior trees
		GlobalVariables.Instance.SetVariable("tempGlobalVar", oriGo);
	}

GetVariable:

	public BehaviorTree bt;

	public override void OnStart()
	{
		string str = (bt.GetVariable("tempVariable") as SharedString).Value;
		Debug.LogError("get a variable is :" + str);

		SharedGameObject go = GlobalVariables.Instance.GetVariable("tempGlobalVar") as SharedGameObject;
		Debug.LogError("get a global variable : " + go.Value.name);
	}

本树内 共享变量get与set:

		//获取本树内的共享变量    Owner是Task类中的属性,可直接使用
		SharedVariable value = Owner.GetVariable("resPath");
		Debug.LogError("value: " + (string)value.GetValue());

		//设置共享变量值
		value.SetValue("222");
		Owner.SetVariable("resPath", value);

判断某个节点的某个值是否绑定了共享变量

	//如果绑定了,则treePath.Name打印的就是绑定的变量的名称
	if (string.IsNullOrEmpty(treePath.Name))
    {
    	//没绑定,直接用自己的值
          path = treePath.Value;
    }
    else
    {
    	//绑定了,就取值
          SharedVariable var = Owner.GetVariable(treePath.Name);
          path = (string)var.GetValue();
    }

调试

1】在行为树的属性栏中勾选Log Task Changes,我们就可以看到行为树的执行过程以及每个Task的执行状态

GameObject - Behavior: Push task Sequence (index 0) at stack index 0
GameObject - Behavior: Push task Wait (index 1) at stack index 0
GameObject - Behavior: Pop task Wait (index 1) at stack index 0 with status Success
GameObject - Behavior: Push task Wait (index 2) at stack index 0
GameObject - Behavior: Pop task Wait (index 2) at stack index 0 with status Success
GameObject - Behavior: Pop task Sequence (index 0) at stack index 0 with status Success
Disabling GameObject – Behavior

Log的含义:

{game object name }{behavior name}: {task change} {task type} (index {task index}) at stack index {stack index} {optional status}

2】鼠标右键某个任务节点,选择Set BreakPoint 添加断点,当运行到这个任务时,就会停止,可以查看参数和状态

3】任务运行时,也可以调整属性面板的值进行调试,查看效果

4】行为树太过复杂,无法立即准确找到想要的Task的时候,可以点击面板右上角的Find,快速定位
在这里插入图片描述

动态加载子树

1、设置加载的子树
在这里插入图片描述
2、子树1的设置
在这里插入图片描述
在这里插入图片描述
3、执行效果在这里插入图片描述
在这里插入图片描述

总结

主要的基础知识点,文章开头的官方文档以及中文教程已经讲解的很详细了,只是一些额外的小知识点单独拿出来做下笔记。
学习项目Git地址(在插件的基础上扩展了一些Example)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值