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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM