1、Behavior Designer 插件的安装

新建一个项目,命名为 BehaviorTreeTest

Unity 行为树代码 unity行为树教程_游戏

 

新建的工程,菜单栏没有行为树插件,我们需要首先安装插件

Unity 行为树代码 unity行为树教程_unity_02

 

首先,去网上下载 Behavior Designer(本例中使用 Behavior Designer 1.6.4.unitypackage),然后在 Project 视图的 Assets 目录上右键,选择 Import Package→Custom Package... 导入下载的 Behavior Designer 1.6.4.unitypackage 即可:

Unity 行为树代码 unity行为树教程_c#_03

 

Unity 行为树代码 unity行为树教程_Unity 行为树代码_04

 

导入成功后,可以看到两处变化:第一,unity的菜单栏多了一个名为 Tools 的菜单;第二,Project 中多了两个行为树相关的目录:

Unity 行为树代码 unity行为树教程_c#_05

 

至此,Behavior Designer 已经安装完毕,下面我们来设计我们的第一颗简易行为树。

 

2、第一棵简单行为树

在Hierarchy视图里选中要添加行为树的游戏对象,然后点击菜单栏的 Tools→Behavior Designer→Editor,打开行为树设计窗口:

Unity 行为树代码 unity行为树教程_游戏_06

 

在行为树设计窗口中右键,选择 Add Behavior Tree,游戏对象上就添加了一棵行为树,

Unity 行为树代码 unity行为树教程_Unity 行为树代码_07

 

接下来,点击行为树设计窗口左侧Tasks列表中的 Composites/Sequence,添加一个 Sequence 组合节点:

Unity 行为树代码 unity行为树教程_游戏开发_08

 

然后再按下图所示操作为Sequence添加一个Log 任务:

Unity 行为树代码 unity行为树教程_游戏开发_09

 

设置Log的属性:

Unity 行为树代码 unity行为树教程_Unity 行为树代码_10

 

再以同样的方法为 Sequence 添加一个 Wait(暂停N秒) 行为和另一个 Log 行为:

Unity 行为树代码 unity行为树教程_unity_11

 

完成之后点击行为树编辑窗口左下角的播放按钮,来测试一下:

Unity 行为树代码 unity行为树教程_c#_12

 

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 就可以看到它了:

Unity 行为树代码 unity行为树教程_c#_13

 

添加后,在行为任务的属性面板中,我们可以观察和设置它的 public 属性:

 

Unity 行为树代码 unity行为树教程_游戏_14

设置好后,我们运行它看看效果: