相比之前版本,3.6.x版本有若干重大改动
- 3.6版本的概述,请参考文章《关于新旧版本的说明》。
- 3.6.x版本的编辑器将导出类型信息代码文件,运行时不需要注册和导出xml类型信息文件。
- 如果3.6.x版本的编辑器打开之前版本的workspace文件,将读取xml类型信息文件并且转存其中的内容,之后的版本就不再需要xml类型信息文件了
- 下列宏及函数已删除,升级后使用该宏或代码的相应代码注释掉或删掉即可(升级的时候,只需要修改编译出现错误的部分,其他的不是必须修改的,因为为了尽可能向后兼容,已经把相关宏重新定义为了空)
BEHAVIAC_REGISTER_METHOD/BEHAVIAC_REGISTER_PROPERTYBEHAVIAC_BEGIN_PROPERTIES/BEHAVIAC_END_PROPERTIESBEGIN_PROPERTIES_DESCRIPTION/END_PROPERTIES_DESCRIPTIONbehaviac::Agent::Register/behaviac::Agent::UnRegisterbehaviac::TypeRegister::Register/behaviac::TypeRegister::UnRegisterbehaviac::Agent::ExportMetas
- 升级步骤
- 备份程序代码及workspace项目
- 删掉老版本中behaviac的所有代码(src及inc等),使用新版本中behaviac的代码(src及inc等)。(因为很多文件被删除,不要只是覆盖!)
- 使用新版本的编辑器打开workspace.xml文件,重新导出(可能需要配置“代码生成位置”)
- 仔细阅读该说明,点击确定后,你的workspace文件将被更新(不能恢复,除非你预先有备份!)。
- 在弹出来的类型信息浏览器中,点击下方的“应用”按钮,生成类型代码文件,点击左下方的“打开代码生成位置”,将生成的类型代码文件添加到程序make文件或项目文件中,并编译构建成为程序的一部分:
- 你可能需要通过菜单项“文件->编辑工作区”来配置“代码生成位置”,如下图:
- 通过菜单项“文件->导出全部…”,重新导出所有的行为树及生成所有的类型文件,如下图:
- 把上一步中导出的源码加入工程中开始编译构建,并修改出现的编译错误,把出错的代码都删掉即可(如上述4中所说,那些宏和函数已删除。只需要修改编译出现错误的部分,其他的不是必须修改的,因为为了尽可能向后兼容,已经把相关宏重新定义为了空)
- 如果是C#版本,步骤基本一致。
- 等待节点和等待帧数节点的使用,请分别参考文档:/language/zh/wait/和/language/zh/waitframes/
- 按照上述步骤就可以正常运行了。对于“已有实现”的类型,如果需要修改,请参考下面的说明。
对于‘已有实现’的类型
如果需要修改的话,有两个流程可以选择。可以选择生成代码,也可以选择不生成代码,请参考下面的步骤,选择自己适合的方式。
生成代码
- 打开类型信息浏览器,如下图,“生成代码?”没有勾选上的类型就是在程序里已经实现的类型,程序里已经有了相应的类型声明以及函数定义的代码。如下图中的ChildNodeTest在代码里已经有’class ChildNodeTest’了。
- 勾选上该Checkbox,然后点击“应用”,会生成类型文件。
- 点击“打开代码生成位置”,可以看到ChildNodeTest.cs被生成了。在上图类型信息浏览器中,每个类的“生成位置”可以用来配置该类的生成位置,如果不配置,则使用工作区统一配置的代码生成位置。
- 打开ChildNodeTest.cs,可以看到如下,只能在红色框内添加自己的代码。红色框外面的修改将会在重新生成代码的时候被丢弃!需要手工的把原来类型中的代码复制到新生成的类里,而把原来的文件删掉!否则会有重复定义的错误产生。
- 从上可知,如果要修改类型名、成员名,请在“类型信息浏览器”中修改,然后“应用”就可以生成更新的代码。而其他相关代码只能添加在‘///<<< BEGIN WRITING YOUR CODE’和‘///<<< END WRITING YOUR CODE’中间,添加在这个块外面的代码在重新生成代码的时候将会丢失!C++代码也是同样的处理。不要手工修改‘///<<< BEGIN WRITING YOUR CODE’后面的内容(例如FILE_INIT,FILE_UNINIT,CLASS_PART等),该内容在重新生成代码的时候将被使用到。
- 对于enum和struct,如果需要修改,也需要勾选上其”生成代码?”的Checkbox。
不生成代码
上述生成代码的流程,需要手工的把原来的代码copy/paste到生成的代码文件中有“///<<< BEGIN WRITING YOUR CODE’和‘///<<< END WRITING YOUR CODE”这样的注释块中间,比较麻烦!而且有人可能并不喜欢这样的形式,那么可以采取下面的流程:
- 不要勾选“生成代码?”,任何修改依然在原来自己维护的代码中进行。
- 任何需要在行为树中暴露的属性或方法需要在类型信息浏览器中同样的添加,否则编辑器中将看不到该属性或方法,即不能被使用。但原来已有的不需要重复加入,添加后需要点击“应用”重新生成胶水代码。
- 另一方面,如果只是在编辑器中添加了属性或方法(添加后需要点击“应用”重新生成胶水代码),而在你的代码中没有相应的修改,编译程序的时候,会有编译错误。
- 如果运行没有重新编译的程序,有可能会有报错发生:
- 当只是添加了属性的时候,如果没有使用“应用”后重新生成的代码编译构建程序,而使用老的程序的时候,可以正常运行,只是新添加的属性作为自定义属性使用而已(编译构建后,新添加的属性就将作为Agent的真正成员,效率最高)。
- 当修改了方法(添加或改名),如果没有使用“应用”后重新生成的代码编译构建程序,而使用老的程序的时候,会有错误发生,在_behaviac_$_$.log中会有详细的错误输出。
总结比较
从上面可以知道,对于从老版本升级到3.6.*的情况下,对于已经有了大量代码的类来说,可以选择依然使用原来的代码,或者可以选择生成代码。
使用原来的代码的好处是不需要copy/paste大量代码到新生成的类型文件中了,并且所有的代码都可以保持原来的风格,缺点是之后任何关于属性、方法的修改(改名、添加、删除等)都需要在类型信息浏览器中重复的做一遍。
选择生成代码的缺点是需要手工copy/paste大量的代码到新生成的类型文件里,并且需要忍受begin/end注释块的束缚。但好处是后续的修改都只需要在类型信息浏览器中改一次,重新生成就好了。
实际上即使对于选择了生成代码的情况,后续也可以再选择不生成代码,反之亦然。选择生成代码,则编辑器负责在你指定的位置生成代码;而选择不生成代码,编辑器将不为你生成代码,所有的代码由你自己来维护。二选一,如果选择生成代码,而自己原来维护的代码没用删掉,则会有编译错误!
另外,需要说明的是,这里的生成代码是指生成class的声明代码(.h和.cpp,或者.cs)。而不管这里是否选择生成代码,在点击“应用”的时候,都会生成所有类型的胶水代码,可以在配置的代码生成位置查看生成的behaviac_agent_meta.cpp文件或AgentProperties.cs,里面的代码就是所谓的“胶水”代码。
此外,我们知道,行为树的导出格式可以是xml或bson,也可以导出cpp或c#代码。即使采用xml或bson格式的时候,这里的“胶水”代码或者类型代码都会被生成,而且需要被添加到工程项目中参与编译构建!
相比3.4.x版本,3.5.x版本有若干重大改动
- 用最新的代码把你们的游戏能够编译运行(如果可能首先删除旧的的代码及导出数据,用新代码替换。)
- 导出最新的meta的xml文件
- 用最新版本的编辑器打开老的workspace,重新导出
- 用3中导出的新的文件,重新编译构建,运行游戏
大版本升级,导出文件的版本号都会有改变,不严格按照上述步骤的话,在运行游戏或编辑器的时候都会有报错。而小版本的升级的时候,导出文件的版本号没有改变,可以不严格按照上述步骤。
对于unity,3.5.3及以后的版本,在上述步骤3中导出文件的时候,会生成c#文件(AgentProperties.cs和customizedtypes.cs),需要添加都项目中,否则运行时会发生错误。
为了支持C# GC Free,生成的代码有大的变化,需要按照上述升级步骤升级版本,否则运行游戏或者编辑器都会有报错。
相比2.x版本,3.x版本有若干重大改动
- meta browser, 变量的使用更加统一和方便
- preaction/postaction,任何一个节点都可以添加前置和后置,统一了用法和体验
- 支持了FSM
相比2.x版本,API的改动(请参考test/unittest或test/usertest中的代码):
- 删掉了behaviac::Start, behaviac::Stop
- LogManager::SetEnable -> Config::SetLogging
- 删掉了World
- 删掉了SetWorkspaceSettings
- 删掉了REGISTER_EVENT
- bttick rename to btexec
- DECLARE_BEHAVIAC_OBJECT_NOVIRTUAL rename to DECLARE_BEHAVIAC_OBJECT_STRUCT
- 删掉了REGISTER_METHOD_CHECKRESULT
- RegisterName -> RegisterIntanceName, UnRegisterName -> UnRegisterIntanceName
- behaviac::Property::Registger, behaviac::Condition::Register -> behaviac::TypeRegister::Register, UnRegister类似
- 在所有加载BT之前,调用behaviac::Workspace::GetInstance()->SetFilePath和behaviac:: Workspace::GetInstance()->SetFileFormat来设置路径和格式
- behaviac::Workspace::ExportMetas修改为behaviac::Workspace::GetInstance()->ExportMetas,其他相应的对Workspace的函数的调用也要类似的修改
- 删掉了Workspace::LogFrames和Workspace::HandleRequests, 添加了Workspace::DebugUpdate
- behaviac::World::GetInstance()->btexec()修改为behaviac::Workspace::GetInstance()->Update()
2 thoughts on “behaviac升级的步骤及注意事项”