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調用處的手動替換,一個個排錯,就不多說了