behaviac组件的基本运作机制就是在运行时端(C#)和编辑器通过元信息进行交互,如图1所示。其中,元信息里面包含了类自身的描述、属性、方法及类的实例等。

图1 基于元信息的编辑器和运行时端的交互

在运行时端,也即游戏代码端,通过注册(C#通过标记Attribute的方式)并导出供行为树引擎和编辑器使用的XML元信息。运行时端主要是由程序员编写Agent的子类及其属性和方法,然后调用相关接口将这些元信息导出,就可以在编辑器中对这些元信息进行使用。

在编辑器中也可以创建和编辑元信息。在项目开始初期,也就是程序员还没把代码写出来之前,策划就可以自己手动的创建一些Agent子类、属性和方法等元信息。这样可以加速游戏原型的创建,也就是策划不用等程序员,就可以进行游戏原型的编辑。

整个工作流程主要分为以下几个步骤:

1 注册元信息

C#中编写的游戏类从behaviac.Agent派生,并通过相关的Attribute来标记元信息:

  • 类:TypeMetaInfo
  • 成员属性:MemberMetaInfo
  • 成员方法:MethodMetaInfo

这3个类都可以接受诸如显示名字,描述等更多参数。详细请参考代码。

如下代码样例所示:

[behaviac.TypeMetaInfo()]
public class AgentNodeTest : behaviac.Agent
{
    [behaviac.MemberMetaInfo()]
    public int testVar_0 = -1;

    [behaviac.MemberMetaInfo("testVar_1", "testVar_1 property", 100)]
    public int testVar_1 = -1;

    [behaviac.MemberMetaInfo()]
    public float testVar_2 = -1.0f;

    [behaviac.MemberMetaInfo()]
    public int waiting_timeout_interval = 0;

    [behaviac.MemberMetaInfo()]
    public string testVar_str_0 = string.Empty;

    public bool m_bCanSee = false;

    [behaviac.MethodMetaInfo()]
    public void setEventVarInt(int var) {
        event_test_var_int = var;
    }

    [behaviac.MethodMetaInfo()]
    public void setEventVarBool(bool var) {
        event_test_var_bool = var;
    }
}

2 导出元信息

由于C#代码中已经包含了各种Attribute来描述元信息,因而导出相比C++要简单:

  • Agent子类的实例通过Agent.RegisterInstanceName<***>(…)来进行注册。
  • 调用Workspace.Instance.FilePath设置元信息文件导出的位置。
  • 调用Workspace.Instance.ExportMetas(…)导出元信息文件。

如下代码样例所示:

public bool Init ()
{
    if (ms_fileSystem == null)
    {
        ms_fileSystem = new BehaviacFileManager();
    }

    //< write log file
    behaviac.Config.IsLogging = true;
    //behaviac.Config.IsSocketing = false;

    behaviac.Workspace.Instance.FilePath = this.WorkspaceExportPath;
    behaviac.Workspace.Instance.FileFormat = behaviac.Workspace.EFileFormat.EFF_xml;

    //register names
    behaviac.Agent.RegisterInstanceName<GameLevelCommon>("GameLevel");
    behaviac.Workspace.Instance.ExportMetas("behaviac/workspace/xmlmeta/BattleCityMeta.xml");

    behaviac.Debug.Log("Behaviac meta data export over.");
    behaviac.Agent.SetIdMask(0xffffffff);

    return true;
}

public void Uninit()
{
    behaviac.Workspace.Instance.Cleanup();
}

更多细节可以参考behaviac组件C#源码中附带的integration/BattleCityDemo工程的BehaviacSystem.cs文件。

发表评论

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