本文档描述的是3.6及以后版本,对于3.5及以前的老版本请参考分类“3.5”。

在《教程1.1:编辑器生成类型代码的工作流程》中,介绍了通过编辑器自动生成类型代码的基本原型,然后在生成的代码模板上继续添加自己的逻辑代码。

而对于习惯手工编写代码,或已经有了大量手工编写的类型代码(如从老版本升级到3.6新版本),可以依然使用原来的代码,但需要在编辑器中创建对应的类型信息。

本教程详细介绍相关的具体步骤,包括:从创建Agent类型到手工编辑代码文件,并利用该Agent类型创建行为树,最后执行该行为树的结果。

1. 新建Agent类型

首先需要在编辑器中创建跟程序端同名的Agent类型。

通过编辑器的菜单项“视图”->“类型信息”(或快捷键Ctrl+M),打开类型信息浏览器,如下图所示:

empty_types

点击右上角的“新增”按钮,弹出“新增类型”窗口,添加SecondAgent类,不要勾选“生成代码”选项,如下图所示:

详细的类型信息编辑过程以及相关操作面板的参数说明,请参考文章《编辑类型信息》。

2. 新增成员属性

为SecondAgent类添加int类型的成员属性p1,如下图所示:

3. 新增成员方法

再为SecondAgent类添加成员方法m1,如下图所示:

添加完SecondAgent类型及其成员属性和方法之后,可以在类型信息浏览器中看到如下所示:

4. 修改成员

如果修改了成员属性和方法,例如改名、加参数等操作后,只需点击右下方的“应用”按钮即可。

例如,将成员属性p1改名为p2,如下图所示:

5. 生成“胶水”代码

点击右下方的“应用”按钮,在工作区配置的“代码生成位置”生成了“胶水”代码文件,如下图所示:

在上图中的internal文件夹中生成了Agent类型的“胶水”代码,但并没有生成SecondAgent类型本身的代码文件,如下图所示:

需要将types文件夹中的所有代码文件都加到自己的项目中一起编译构建,并只需在程序端代码中包含头文件types/behaviac_types.h即可,其他“胶水”代码头文件不用包含,如下代码所示:

#include "behaviac_generated/types/behaviac_types.h"

6. 添加类型代码

在代码项目中手工添加SecondAgent.h/.cpp文件,如下图所示:

为了提高手工编写代码的效率并保持与编辑器中定义的一致性,请点击类型信息浏览器中的“预览原型代码”按钮,如下图所示:

可以看到SecondAgent类的原型代码如下所示,复制粘贴需要的类型、成员属性或方法的申明代码到自己的SecondAgent.h头文件中:

#ifndef _BEHAVIAC_SECONDAGENT_H_
#define _BEHAVIAC_SECONDAGENT_H_

#include "behaviac_headers.h"

class SecondAgent : public behaviac::Agent
{
public:
    SecondAgent();

    virtual ~SecondAgent();

    BEHAVIAC_DECLARE_AGENTTYPE(SecondAgent, behaviac::Agent)

private: int p1;

private: void m1(behaviac::string& value);

};

#endif

在SecondAgent.cpp中实现该类的各个方法如下所示:

#include "SecondAgent.h"

SecondAgent::SecondAgent()
    : p1(0)
{
}

SecondAgent::~SecondAgent()
{
}

void SecondAgent::m1(behaviac::string& value)
{
    printf("\n%s\n\n", value.c_str());
}

在类型信息浏览器中点击右上方的”设置头文件“,添加刚才手工新建的SecondAgent类的头文件路径,如下图所示:

这样在生成的types/internal/behaviac_headers.h文件中,就自动包含了上面添加的SecondAgent.h头文件,如下代码所示:

#ifndef _BEHAVIAC_HEADERS_H_
#define _BEHAVIAC_HEADERS_H_

#include "behaviac/behaviac.h"

// YOU SHOULD SET THE HEADER FILES OF YOUR GAME WHEN EXPORTING CPP FILES ON THE BEHAVIAC EDITOR:
#include "../../../SecondAgent.h"

#endif // _BEHAVIAC_HEADERS_H_

注意上图中左下方的选项“生成代码时使用相对路径”,该选项用于生成上述包含头文件时,是否生成相对路径。

如果已经在自己的代码项目中设置了包含路径,可以不勾选该选项,生成的代码如下所示:

#ifndef _BEHAVIAC_HEADERS_H_
#define _BEHAVIAC_HEADERS_H_

#include "behaviac/behaviac.h"

// YOU SHOULD SET THE HEADER FILES OF YOUR GAME WHEN EXPORTING CPP FILES ON THE BEHAVIAC EDITOR:
#include "SecondAgent.h"

#endif // _BEHAVIAC_HEADERS_H_

7. 手工编辑类型信息

有的程序员可能不喜欢使用类型信息浏览器来编辑类型信息,那么可以编写自己的导出工具或者直接手工编辑类型信息文件*.meta.xml。

该文件保存在工作区配置的“行为树源位置”中的behaviac_meta文件夹中,例如本教程对应的类型信息文件tutorial_1_2_cpp.meta.xml就在源码包tutorials/tutorial_1_2/workspace/behaviors/behaviac_meta目录下,该文件的内容如下:

可以手工编辑该文件,根据自己的需要添加或修改自己的类型信息,但需要确保内容格式跟上图保持一致,没有任何错误,否则会加载失败。

此外,编辑器还支持加载多个类型信息文件,支持混用编辑器编辑的类型信息和通过自己编写导出工具或手工编辑生成的类型信息这两种方式,那么可以将自己生成的*.meta.xml文件,也放在行为树源位置中的behaviac_meta目录里,如下图所示:

重新加载工作区后,会弹出如下提示窗口:

如果没有弹出上述提示窗口,说明已经合并过多个类型信息文件,可以打开工作区文件tutorial_1_2_cpp.workspace.xml,并修改promptmergingmeta的值为”false”,如下图所示:

重新加载工作区,会再次弹出上述提示窗口。点击”是(Y)“,编辑器会自动合并多个类型信息文件。

这样,在类型信息浏览器中就可以查看手工编辑的所有类型信息,并在行为树中使用这些类型信息了。

8. 添加行为树

利用新加的SecondAgent类及其成员属性和方法,添加行为树”SecondBT”,如下图所示:

9. 执行行为树

加载并执行该行为树,可以看到输出结果如下图所示:

本教程相关的工作区和代码工程详见源码包的目录tutorials/tutorial_1_2

3 thoughts on “教程1.2:手工编写类型代码的工作流程

  1. 在behaviac_heads.h中有#include “SecondAgent.h”,而在SecondAgent.h中又有#include “behaviac_headers.h”,这样相互include,在C++中会有问题的吧

    1. 没有问题,因为每个.h文件的第一句代码都是类似这种语句:#ifndef _BEHAVIAC_HEADERS_H_,所以不会造成循环include

  2. Does this means using editor and editing xml file are the only ways to let the editor know what the properties and methods are defined in hand coded agent class? I saw from other article talking about using macro to generate xml file from c++ code? (/tutorial3_1_meta_cpp_register/)

发表评论

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