趁着周末,来学习一下行为树,本博客将记录在学习过程中的实践和延伸知识点,如果是初学者,可先点击官方文档学习(也可阅读大佬的中文版教程)。
行为树插件和扩展的一些小案例在文末。
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)