ET6.0接Luban步骤的整理
Luban是一个超级强大且易用的游戏配置解决方案,而且免费开源无限制
具体了解可跳转Github:https://github.com/focus-creative-games/luban,这里对自己在ET框架接入Luban的过程做一个总结
基本步骤查看官方说明:https://focus-creative-games.github.io/lubandoc/start_up.html
致谢:宝鱼的相关项目和脚本文件,以及官方群SJ的指点,具体luban问题可以前往官方群692890842询问。
1、下载文件
从luban_examples下载Lib文件和案例文件(https://github.com/focus-creative-games/luban_examples)
2、生成数据
找到MiniDesignerConfigsTemplate目录,整个复制到自己的项目,比如根目录,改个名叫Config,里面已经包含了一个示例item.xlsx。
从\luban_examples\Tools目录复制Luban.ClientServer到ET项目目录下的Tools目录。
从luban_examples\Projects\Csharp_Unity_bin\Assets找C#对应的LubanLib
ByteBuf.cs放到Unity.Mono/Core,其他放到Unity.Model/Core
准备转表脚本,随便放到哪个目录,根目录或者Config都可以,方便就行
注意脚本里面有一个CustomTemplate,对应的是自定义转表模板enum.tpl,数值枚举会用这个自动生成NumericType的bas、add等5项枚举,如果不需要这个功能,可以不用这个文件。
enum.tql文件内容和转表脚本内容见下面两个附带的代码
查看代码
这里是tql文件
{{~
name = x.name
namespace_with_top_module = x.namespace_with_top_module
comment = x.comment
items = x.items
~}}
namespace {{namespace_with_top_module}}
{
{{~if comment != '' ~}}
/// <summary>
/// {{comment | html.escape}}
/// </summary>
{{~end~}}
{{~if x.is_flags~}}
[System.Flags]
{{~end~}}
public enum {{name}}
{
{{~ for item in items ~}}
{{~if item.comment != '' ~}}
/// <summary>
/// {{item.escape_comment}}
/// </summary>
{{~end~}}
{{if (has_tag item 'range_attr')}}
[ET.NumericRange({{(get_tag item 'range_attr')}})]
{{~end~}}
{{item.name}} = {{item.value}},
{{if (has_tag item 'numeric')}}
{{item.name}}Base = {{item.value}} * 10 + 1,
{{item.name}}Add = {{item.value}} * 10 + 2,
{{item.name}}Pct = {{item.value}} * 10 + 3,
{{item.name}}FinalAdd = {{item.value}} * 10 + 4,
{{item.name}}FinalPct = {{item.value}} * 10 + 5,
{{~end~}}
{{~end~}}
}
}
查看代码
这里是转表脚本文件
set WORKSPACE=..\
set GEN_CLIENT=%WORKSPACE%\Tools\Luban.ClientServer\Luban.ClientServer.exe
set CONF_ROOT=%WORKSPACE%\Config
@ECHO =======================SERVER==========================
%GEN_CLIENT% --template_search_path %CONF_ROOT%\CustomTemplate -j cfg --^
-d %CONF_ROOT%\Defines\__root__.xml ^
--input_data_dir %CONF_ROOT%\Datas ^
--output_code_dir %WORKSPACE%\Server\Model\Generate\Config ^
--output_data_dir %WORKSPACE%\Server\ConfigBin ^
--gen_types code_cs_bin,data_bin ^
-s server
@ECHO =======================CLIENT==========================
%GEN_CLIENT% --template_search_path %CONF_ROOT%\CustomTemplate -j cfg --^
-d %CONF_ROOT%\Defines\__root__.xml ^
--input_data_dir %CONF_ROOT%\Datas ^
--output_code_dir %WORKSPACE%\Unity\Codes\Model\Generate\Config ^
--output_data_dir %WORKSPACE%\Unity\Assets\Bundles\ConfigBin ^
--gen_types code_cs_bin,data_bin ^
-s client
@ECHO =======================JSONONLYVIEW==========================
%GEN_CLIENT% -j cfg --^
-d %CONF_ROOT%\Defines\__root__.xml ^
--input_data_dir %CONF_ROOT%\Datas ^
--output_data_dir %CONF_ROOT%\Output_Json\Server ^
--gen_types data_json ^
-s server
%GEN_CLIENT% -j cfg --^
-d %CONF_ROOT%\Defines\__root__.xml ^
--input_data_dir %CONF_ROOT%\Datas ^
--output_data_dir %CONF_ROOT%\Output_Json\Client ^
--gen_types data_json ^
-s client
pause
3、到此为止应该可以正常的转表了,luban生成的文件分为Table和Bean两种类型,具体文件名是自己在Define的xml文件里面,Excel也可以,看luban教程。
一般来说Table会命名为TbXXX格式,Bean自己看着办,Table关联的Bean可以是XXXConfig,按实际需要和习惯。
如果按ET风格,想完全一致,则Table可以命名为XXXConfigCategory,Table关联的Bean会命名为XXXConfig,其他Bean看情况。
4、调整ConfigComponent组件
调用配置的代码调整为ConfigComponent.Instance.Tables.TbXXX.Get
public class ConfigComponent : Entity, IAwake, IDestroy
{
public static ConfigComponent Instance;
public Tables Tables;
}
public static class ConfigComponentSystem
{
public static void LoadOneConfig(this ConfigComponent self, Type configType)
{
}
public static async ETTask LoadAsync(this ConfigComponent self, Func<string, ByteBuf> loadFunc)
{
self.Tables = new Tables(loadFunc);
await ETTask.CompletedTask;
}
}
5、调整服务端和客户端的AppStart_Init.cs,替换ET原本的加载配置代码
服务端
await ConfigComponent.Instance.LoadAsync((file) =>
{
return new ByteBuf(File.ReadAllBytes($"../Server/ConfigBin/{file}.bytes"));
});
客户端
public class AppStart_Init : AEvent<EventType.AppStart>
{
protected override async ETTask Run(EventType.AppStart args)
{
Game.Scene.AddComponent<TimerComponent>();
Game.Scene.AddComponent<CoroutineLockComponent>();
Game.Scene.AddComponent<ResourcesComponent>();
//await ResourcesComponent.Instance.LoadBundleAsync("config.unity3d");
//加载配置
Game.Scene.AddComponent<ConfigComponent>();
await ConfigComponent.Instance.LoadAsync((file) =>
{
return new ByteBuf(File.ReadAllBytes($"../Unity/Assets/Bundles/ConfigBin/{file}.bytes"));
});
//ResourcesComponent.Instance.UnloadBundle("config.unity3d");
Game.Scene.AddComponent<OpcodeTypeComponent>();
Game.Scene.AddComponent<MessageDispatcherComponent>();
Game.Scene.AddComponent<NetThreadComponent>();
Game.Scene.AddComponent<SessionStreamDispatcher>();
Game.Scene.AddComponent<ZoneSceneManagerComponent>();
Game.Scene.AddComponent<GlobalComponent>();
Game.Scene.AddComponent<AIDispatcherComponent>();
//await ResourcesComponent.Instance.LoadBundleAsync("unit.unity3d");
Scene zoneScene = SceneFactory.CreateZoneScene(1, "Game", Game.Scene);
await Game.EventSystem.PublishAsync(new EventType.AppStartInitFinish() { ZoneScene = zoneScene });
}
}
6、把ET自带的配置文件都调整为Luban格式,然后调整StartProcesConfig和StartSceneConfig这两个partial类
因为有PostInit和PostResolve两个后处理方法,所以基本上没什么调整成本,直接小改即可↓
public override void EndInit() 调整为 partial void PostInit()
public override void AfterEndInit() 调整为 partial void PostResolve()
注意这两个partial类的命名空间要和Tb类保持一致
附带我的Server相关Define文件
<module name="StartServer">
<!-- StartZoneConfig -->
<bean name="StartZoneConfig">
<var name="id" type="int"/>
<var name="dB_connection" type="string"/>
<var name="dB_name" type="string"/>
</bean>
<table name="TbStartZoneConfig" value="StartZoneConfig" input="Server/StartZoneConfig.xlsx"/>
<!-- StartMachineConfig -->
<bean name="StartMachineConfig">
<var name="id" type="int"/>
<var name="inner_iP" type="string"/>
<var name="outer_iP" type="string"/>
<var name="watcher_port" type="int"/>
</bean>
<table name="TbStartMachineConfig" value="StartMachineConfig" input="Server/StartMachineConfig.xlsx"/>
<!-- StartProcessConfig -->
<bean name="StartProcessConfig">
<var name="id" type="int"/>
<var name="machine_id" type="int"/>
<var name="inner_port" type="int"/>
<var name="app_name" type="string"/>
</bean>
<table name="TbStartProcessConfig" value="StartProcessConfig" input="Server/StartProcessConfig.xlsx"/>
<!-- StartSceneConfig -->
<bean name="StartSceneConfig">
<var name="id" type="int"/>
<var name="process" type="int"/>
<var name="zone" type="int"/>
<var name="scene_type" type="string"/>
<var name="name" type="string"/>
<var name="outer_port" type="string"/>
</bean>
<table name="TbStartSceneConfig" value="StartSceneConfig" input="Server/StartSceneConfig.xlsx"/>
<!-- ServerInfoConfig -->
<bean name="ServerInfoConfig">
<var name="id" type="int" />
<var name="server_name" type="string" />
</bean>
<table name="TbServerInfoConfig" value="ServerInfoConfig" input="Server/ServerInfoConfig.xlsx"/>
</module>
7、剩下的工作就是比较繁琐的ConfigComponent调用处的手动替换,一个个排错,就不多说了