Unity Game FrameWork—模块使用—本地化

官方说明:提供本地化功能,也就是我们平时所说的多语言。Game Framework 在本地化方面,不但支持文本的本地化,还支持任意资源的本地化,比如游戏中释放烟花特效也可以做出几个多国语言的版本,使得中文版里是“新年好”字样的特效,而英文版里是“Happy New Year”字样的特效。

语言表xml

Demo中有四种语言,路径及内容如下。首先需要把对应的语言写为Xml文件,格式按照Demo的提供的格式来,一个key对应一个value。(格式可以改,后续解析语言表时会说到,解析方式需与语言表的格式对应,否则无法解析成功)本专栏后续会写一个扩展组件,将配置语言表的表格拆分转换为多种语言对应的Xml文件。这里先熟悉语言表怎么使用。
[图片]

语言设置

启动流程ProcedureLaunch的OnEnter方法进行了语言的设置

public override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    // 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言
    InitLanguageSettings();
    // 变体配置:根据使用的语言,通知底层加载对应的资源变体
    InitCurrentVariant();
    // 默认字典:加载默认字典文件 Assets/GameMain/Configs/DefaultDictionary.xml
    // 此字典文件记录了资源更新前使用的各种语言的字符串,会随 App 一起发布,故不可更新
    GameEntry.BuiltinData.InitDefaultDictionary();
}

语言的设置是从SettingComponent设置组件获取数据,首次进入游戏,这个值没有设置,会使用系统默认语言。编辑器模式下,直接使用编辑器配置的语言。
游戏内部更改并保存语言调用SettingForm里的OnSubmitButtonClick方法,可以看到在设置组件设置完成后,停止播放音乐,并重启了游戏框架。代码如下

public void OnSubmitButtonClick()
{
    if (m_SelectedLanguage == GameEntry.Localization.Language)
    {
        Close();
        return;
    }
    GameEntry.Setting.SetString(Constant.Setting.Language, m_SelectedLanguage.ToString());
    GameEntry.Setting.Save();
    GameEntry.Sound.StopMusic();
    UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Restart);
}

语言加载

语言表加载在预加载流程ProcedurePreload里完成,通过语言名称获取加载路径,并读取其中的key-value键值对,写入本地化组件。
[图片]
[图片]
语言加载完成后,如下图在UI父类UGuiForm里,获取了UI所有的text组件。并将text当前值作为key去获取对应value,并将value写入text。这里有一个不方便的地方,只有游戏运行时,才能够看到页面适配效果,调试也不方便,只能在运行模式下调试效果。后续本地化扩展会改一下这个地方。
[图片]
文本需要动态赋值也可以使用同样的方式
text.text = GameEntry.Localization.GetString(key);

资源本地化

官方有提到资源的本地化,可以作为实体或UI去调用
先看一下实体,是通过路径获取预制件,并加载预制件,那么只要语言不一样,设置的路径也不一样就可以实现该功能。
[图片]
可以在AssetUtility里找到预制件获取路径,类似于语言表,每个语言的资源的路径不同,即可实现获取不同的预制件,从而实现不同的新年好高特效。
[图片]
再看下UI,不用质疑,UI也是通过路径获取的,同样的操作。
[图片]

猜你喜欢

转载自blog.csdn.net/qq_37619255/article/details/129850957
今日推荐