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调用处的手动替换,一个个排错,就不多说了

posted @ 2022-03-24 14:00  qianxun0975  阅读(1097)  评论(0编辑  收藏  举报