本文主要介绍在不需要程序员编写任何代码的前提下,策划如何在编辑器中快速开发行为树原型。

1 新建工作区

打开编辑器,点击菜单项“文件”->“新建工作区”新建一个自己的工作区,如下图所示:

图1.1 新建工作区

暂不设置“元数据位置”,表示没有从运行时端导出任何元信息文件,元信息都会在编辑器中创建出来。

点击确认,创建完之后,整个编辑器几乎是空的,如下图所示:

图1.2 初始的编辑器

2 新建行为树

从工具栏中点击“新建行为树”按钮,开始创建我们的第一棵行为树,如下图所示:

图2.1 新建行为树

创建后,将这棵行为树命名为“first_behavior”,如下图所示:

图2.2 第一棵行为树

从图2.2中可以看出这棵行为树只有一个根节点,鼠标点击该根节点后,可以看到它的Agent类型只有一个behaviac::Agent可以选择,但是不要选它,如下图所示:

图2.3 根节点的Agent类型

3 新建自定义的Agent子类及其属性和方法

为了让行为树可以描述一个Agent类型,首先需要创建一个我们的Agent子类,通过菜单项“视图”->“元信息浏览”(或通过快捷键Ctrl+M)打开元信息浏览器,如下图所示:

图3.1 元信息浏览器

点击元信息浏览器右上角的“新建”按钮,开始创建我们的第一个Agent子类,命名为FirstAgent,如下图所示:

图3.2 新建Agent子类

从上图可以看出,FirstAgent类没有任何的成员属性和方法,我们接着为其添加属性和方法。

点击元信息浏览器中间靠右的“新建”按钮,为FirstAgent类添加第一个成员属性,如下图所示:

图3.3 开始添加成员属性

为这个属性命名为FirstProperty,并设置为int类型,如下图所示:

图3.4 新建成员属性

创建完之后,我们可以看到,FirstAgent类已经有了第一个成员属性FirstProperty,如下图所示:

图3.5 第一个成员属性

类似的,在元信息浏览器中,选择“成员类型”为“Method”,为FirstAgent类添加第一个成员方法,如下图所示:

图3.6 新建成员方法

创建完之后,我们可以看到,FirstAgent类已经有了第一个成员方法FirstMethod,如下图所示:

图3.7 第一个成员方法

这样,我们的第一个Agent子类(FirstAgent)就有了一个成员属性(FirstProperty)和一个成员方法(FirstMethod)。

在元信息浏览器上点击下面的“确认”按钮,关闭元信息浏览器,回到编辑器主视口,继续编辑之前创建的第一棵行为树。

4 编辑行为树

鼠标选中根节点,为其设置Agent类型,这时,我们可以看到有了FirstProperty可供选择,如下图所示:

图4.1 设置Agent类型

编辑该行为树,通过鼠标将左边的节点列表中的节点拖拽到主视口中,为该行为树添加一个序列节点、一个条件节点和一个动作节点,如下图所示:

图4.2 为行为树添加节点

为条件节点选择刚才创建的属性FirstProperty,如下图所示:

图4.3 设置条件节点

为动作节点选择刚才创建的方法FirstMethod,如下图所示:

图4.4 设置动作节点

这样,我们就编辑完了第一棵行为树。

注意,如果点击当前行为树主视图窗口右上角的“检查错误”按钮,如下图所示:

图4.5 检查错误

检查当前行为树是否包含错误,将会弹出如下图所示的错误信息提示框:

图4.6 错误信息提示框

如何消除该错误,请查看使用说明文档动作节点

5 生成C++源码文件

为了方便讨论,下面只介绍生成C++源码文件,生成C#源码文件的流程基本类似,也可以分别参考下面两篇文档:

开始导出C++源码文件,点击工具栏中的“导出行为树”按钮,如下图所示:

图5.1 开始导出C++源码文件

弹出导出行为树设置窗口,我们看到“first_behavior”是一棵“有错误的行为树”,暂时忽略这个错误,直接选择下面的“导出设置”,只选择“C++ Behavior Export”,如下图所示:

图5.2 导出C++源码文件

点击“C++ Behavior Export”最右侧的“…”按钮,弹出如下图所示的配置窗口:

图5.3 导出C++源码文件设置

在上图中,暂时不用修改任何设置,只需使用默认值,直接点击“确认”按钮,回到图5.2中的导出行为树窗口,点击“导出”按钮。

导出结束后,在工作区设置的导出路径(本文示例中的导出路径是“D:\test\exported”)中,会生成“behaviac_generated”文件夹,里面又有“types”文件夹,可以看到包含了“FirstAgent.h”和“FirstAgent.cpp”文件。

这两个文件正是编辑器为运行时自动生成FirstAgent类的源码文件,需要程序员接着实现该类的其他属性和方法逻辑等代码,并添加进自己的游戏项目中去。

“FirstAgent.h”文件内容如下所示:


// ---------------------------------------------------------------------
// This agent file is auto-generated by behaviac designer, but you should
// implement the methods of the agent class if necessary!
// ---------------------------------------------------------------------

#ifndef BEHAVIAC_FIRSTAGENT_H
#define BEHAVIAC_FIRSTAGENT_H

#include "behaviac/behaviac.h"

class FirstAgent : public behaviac::Agent
{
public:
	FirstAgent();
	virtual ~FirstAgent();

	DECLARE_BEHAVIAC_AGENT(FirstAgent, behaviac::Agent)

public:
	int FirstProperty;

public:
	int FirstMethod();

};

BEHAVIAC_DECLARE_TYPE_VECTOR_HANDLER(FirstAgent*);

#endif

“FirstAgent.cpp”文件内容如下所示:


// ---------------------------------------------------------------------
// This agent file is auto-generated by behaviac designer, but you should
// implement the methods of the agent class if necessary!
// ---------------------------------------------------------------------

#include "FirstAgent.h"

FirstAgent::FirstAgent()
{
	FirstProperty = 0;
}

FirstAgent::~FirstAgent()
{
}

BEGIN_PROPERTIES_DESCRIPTION(FirstAgent)
{
	// CLASS_DISPLAYNAME(L"FirstAgent");
	// CLASS_DESC(L"");

	REGISTER_PROPERTY(FirstProperty);

	REGISTER_METHOD(FirstMethod);
}
END_PROPERTIES_DESCRIPTION()

int FirstAgent::FirstMethod()
{
	// Write your logic codes here.

	return 0;
}

6 导出元信息文件

将上面自动生成的“FirstAgent.h”和“FirstAgent.cpp”文件添加到自己的游戏项目中,并参考C++元信息的注册和导出的做法导出元信息文件。

这里我们假设生成的元信息文件名为“firstagent.xml”,并放在meta文件夹中,meta文件夹放在这个工作区的路径中,如下图所示:

图6.1 元信息文件

回到编辑器中,点击菜单项“文件”->“编辑工作区”,为当前的工作区设置“元信息位置”,如下图所示:

图6.2 设置元信息位置

点击工具栏中的“重新加载”按钮,重新加载整个工作区,如下图所示:

图6.3 重新加载工作区

重新加载整个工作区之后,再次打开我们的第一棵行为树“first_behavior”,然后点击主视口中右上角的“检查错误”按钮,如下图所示:

图6.4 检查错误

这个时候,我们发现该行为树已经没有任何错误,可以导出了,这里我们只导出XML行为树,如下图所示:

图6.5 开始导出XML行为树

导出结束后,在工作区的导出路径下,导出了我们的第一棵行为树,如下图所示:

图6.6 第一棵导出的XML行为树

有了导出的行为树,就可以参考C++运行时端的使用上手的做法开始使用运行时库。

7 导出行为树

需要注意的是,如果行为树使用到了这里在编辑器里创建的’自定义方法’的话,那个行为树是不允许导出的。因为运行时还没有实现那个方法,如果运行时试图运行那个行为树的话,由于那个方法没有定义,没办法处理。

这种情况下,编辑器只是作为‘设计’工具。

发表评论

电子邮件地址不会被公开。 必填项已用*标注