本文主要介绍在不需要程序员编写任何代码的前提下,策划如何在编辑器中快速开发行为树原型。
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 导出行为树
需要注意的是,如果行为树使用到了这里在编辑器里创建的’自定义方法’的话,那个行为树是不允许导出的。因为运行时还没有实现那个方法,如果运行时试图运行那个行为树的话,由于那个方法没有定义,没办法处理。
这种情况下,编辑器只是作为‘设计’工具。