Unity基于Luban通过配置Excel表简化GameFrameWork的本地化流程

1,095 阅读2分钟

前言

GameFrameWork因官方教程不够丰富,所以大多数人入门靠的是官方示例项目Star Force。

其中,GameFrameWork作者使用的是xml配置本地化内容,但在实际项目中一般会使用Excel配置,本篇博客的内容就是为了解决这个问题。

具体流程

1. GameFramework接入Luban

如下图所示,将这两个文件复制到Unity项目中,路径按自己的项目组织来。

Pasted image 20250102144417.png

在Star Force下的项目演示路径如图所示:

Pasted image 20250102145549.png

依据路径修改gen.bat

set WORKSPACE=..
set CONF_ROOT=.
set LUBAN_DLL=%CONF_ROOT%\Tools\Luban\Luban.dll

dotnet %LUBAN_DLL% ^
    -t all ^
    -c cs-simple-json ^
    -d json ^
    --conf %CONF_ROOT%\luban.conf ^
    -x outputCodeDir=%WORKSPACE%\Assets\GameMain\Scripts\LubanGeneratedCode ^
    -x outputDataDir=%WORKSPACE%\Assets\GameMain\LubanGeneratedTable  ^
    -x l10n.provider=default ^
    -x l10n.textFile.path=%CONF_ROOT%\Datas\l10n\#l10nConfig.xlsx ^
    -x l10n.textFile.keyFieldName=key ^
    -x l10n.textFile.languageFieldName=ChineseSimplified ^
    -x l10n.convertTextKeyToValue=1
pause

参考Luban官网接入Unity中的Luban包

Pasted image 20250102152711.png

2. Excel表配置

如下图所示,以简体中文和英语为例进行Excel表配置

Pasted image 20250102161736.png

运行上一步更新好后的gen.bat

出现此界面表示生成数据表和代码成功

Pasted image 20250102152331.png

生成的Json表大概如下图所示:

Pasted image 20250102162301.png

3. 添加GameFrameWork的LocalizationHelper进行本地化的json数据解析

依据GameFrameWork作者的xml编写我们自己的解析函数:JsonLocalizationHelper

Pasted image 20250102180844.png

JsonLocalizationHelper.cs如下所示

using GameFramework.Localization;
using UnityGameFramework.Runtime;
using System;

namespace StarForce
{
    public class JsonLocalizationHelper : DefaultLocalizationHelper
    {
        /// <summary>
        /// 解析字典
        /// </summary>
        public override bool ParseData(ILocalizationManager localizationManager, string dictionaryString, object userData)
        {
            try
            {
                var tables = new cfg.Tables(file => JSON.Parse(dictionaryString));

                string currentLanguage = GameEntry.Localization.Language.ToString();
                int localizationLine = tables.Tbl10nConfig.DataList.Count;
                
                for (int i = 0; i < localizationLine; i++)
                {
                    string key = tables.Tbl10nConfig.DataList[i].Key;
                    string value = tables.Tbl10nConfig.DataList[i].English;
                    if (currentLanguage == "ChineseSimplified")
                    {
                        value = tables.Tbl10nConfig.DataList[i].ChineseSimplified;
                    }

                    if (!localizationManager.AddRawString(key, value))
                    {
                        Log.Warning("Can not add raw string with key '{0}' which may be invalid or duplicate.", key);
                        return false;
                    }
                }

                return true;
            }
            catch (Exception exception)
            {
                Log.Warning("解析失败" + exception.ToString());
                return false;
            }
        }
    }
}

笔者这里在ProcedurePreload中完成了Luban的读表,修改原来的相关代码如下图所示,将路径换为自己的Luban生成表路径即可

        private void LoadDictionary(string dictionaryName)
        {
            // string dictionaryAssetName = AssetUtility.GetDictionaryAsset(dictionaryName, false);
            // m_LoadedFlag.Add(dictionaryAssetName, false);
            m_LoadedFlag.Add("Assets/GameMain/LubanGeneratedTable/l10n_tbl10nconfig.json", false);
            // GameEntry.Localization.ReadData(dictionaryAssetName, this);
            GameEntry.Localization.ReadData("Assets/GameMain/LubanGeneratedTable/l10n_tbl10nconfig.json", this);
        }

补充:注意,在编写完JsonLocalizationHelper.cs后,需要在场景中的Localization物体上的脚本上选择这个Helper,即为切换原来的xml解析器,否则框架不会应用我们新编写的这个Helper。

至此,所有步骤已经完成。

4. 查看效果

运行查看,中英文界面均按配表显示。

5. 另:关于打包

使用这种方法时,因为使用了封装好的ReadData函数,所以我们不用关心编辑器模式和打包后从AB包读取资源的不同,如果不使用框架的ReadData函数,需要自己进行封装编辑器模式和从AB包读取json文件的不同,建议在对源码掌握较好的情况下进行。