前言
GameFrameWork因官方教程不够丰富,所以大多数人入门靠的是官方示例项目Star Force。
其中,GameFrameWork作者使用的是xml配置本地化内容,但在实际项目中一般会使用Excel配置,本篇博客的内容就是为了解决这个问题。
具体流程
1. GameFramework接入Luban
如下图所示,将这两个文件复制到Unity项目中,路径按自己的项目组织来。
在Star Force下的项目演示路径如图所示:
依据路径修改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包
2. Excel表配置
如下图所示,以简体中文和英语为例进行Excel表配置
运行上一步更新好后的gen.bat
出现此界面表示生成数据表和代码成功
生成的Json表大概如下图所示:
3. 添加GameFrameWork的LocalizationHelper进行本地化的json数据解析
依据GameFrameWork作者的xml编写我们自己的解析函数:JsonLocalizationHelper
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文件的不同,建议在对源码掌握较好的情况下进行。