1、Behavior Designer 插件的安装
新建一个项目,命名为 BehaviorTreeTest
新建的工程,菜单栏没有行为树插件,我们需要首先安装插件
首先,去网上下载 Behavior Designer(本例中使用 Behavior Designer 1.6.4.unitypackage),然后在 Project 视图的 Assets 目录上右键,选择 Import Package→Custom Package... 导入下载的 Behavior Designer 1.6.4.unitypackage 即可:
导入成功后,可以看到两处变化:第一,unity的菜单栏多了一个名为 Tools 的菜单;第二,Project 中多了两个行为树相关的目录:
至此,Behavior Designer 已经安装完毕,下面我们来设计我们的第一颗简易行为树。
2、第一棵简单行为树
在Hierarchy视图里选中要添加行为树的游戏对象,然后点击菜单栏的 Tools→Behavior Designer→Editor,打开行为树设计窗口:
在行为树设计窗口中右键,选择 Add Behavior Tree,游戏对象上就添加了一棵行为树,
接下来,点击行为树设计窗口左侧Tasks列表中的 Composites/Sequence,添加一个 Sequence 组合节点:
然后再按下图所示操作为Sequence添加一个Log 任务:
设置Log的属性:
再以同样的方法为 Sequence 添加一个 Wait(暂停N秒) 行为和另一个 Log 行为:
完成之后点击行为树编辑窗口左下角的播放按钮,来测试一下:
3、自定义行为任务
下面,我们来自定义一个行为任务。首先,在Assets中新建一个名为AI的目录用来保存我们的自定义任务。然后,在AI目录中新建一个名为 RotateAndMove.cs 的 C# 脚本,修改其内容如下:
using UnityEngine;
namespace BehaviorDesigner.Runtime.Tasks.Custom
{
[TaskCategory("Custom")]
[TaskDescription("Rotate and move gameobject.")]
public class RotateAndMove : Action
{
public float rotateSpeed = 100f;
public float moveSpeed = 5f;
public float toX = 10;
public float toY = 10;
public float toZ = 50;
private Vector3 startPos;
private Vector3 endPos;
public override void OnAwake()
{
if (startPos == new Vector3(0, 0, 0))
{
startPos = gameObject.transform.position;
}
else
{
gameObject.transform.position = startPos;
}
endPos = new Vector3(toX, toY, toZ);
base.OnAwake();
}
public override TaskStatus OnUpdate()
{
Transform tf = gameObject.transform;
if (tf.position != endPos)
{
float dt = Time.deltaTime;
tf.Rotate(Vector3.up * rotateSpeed * dt, Space.World);
tf.position = Vector3.MoveTowards(tf.position, endPos, moveSpeed * dt);
return TaskStatus.Running;
}
return TaskStatus.Success;
}
public override void OnBehaviorComplete()
{
base.OnBehaviorComplete();
}
public override void OnReset()
{
base.OnReset();
}
}
}
其中 TaskCategory 特性指明了 RotateAndMove 这个任务在行为树编辑器中右键菜单里的归类目录。 TaskDescription 特性声明了点击行为树编辑器中的任务后,编辑器下方显示的提示内容。
需要注意,如果是 Action 任务,必须继承 BehaviorDesigner.Runtime.Tasks 命名空间中的 Action 类;如果是 Composite 任务,则必须继承 Composite;是 Decorator 则必须继承 Decorator;是 Conditional 则必须继承 Conditional。关于这四类任务的作用和不同之处,请自行百度关键字“行为树”来学习,概念不复杂,一看就明白。
行为任务类创建完毕之后,Ctrl + S 保存它,然后我们回到行为编辑器界面,右键 Add Task 就可以看到它了:
添加后,在行为任务的属性面板中,我们可以观察和设置它的 public 属性:
设置好后,我们运行它看看效果: