推荐阅读
- CSDN主页
- GitHub开源地址
- Unity3D插件分享
- 简书地址
大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
一、前言
【GameFramework框架】系列教程目录:
https://blog.csdn.net/q764424567/article/details/135831551
二、正文
2-1、介绍
本地化(Localization)
,也就是我们所说的不同地区的语言适配,比如说中文版“你好”,英文版是“Hello”。
GameFramework在本地化方面,不仅支持文本的本地化,还支持任意资源的本地化,比如说游戏中释放烟花的特效也可以做出不同地区的版本,使得中文版烟花里面的“新年好”字样的特效,在英文版里面是“Happy New Year”字样的特效。
2-2、使用说明
2-2-1、准备语言版本
官方示例项目StarForce
里面默认提供了四种语言的版本,路径在Assets/GameMain/Localization里面:
首先,需要将对应的语言写成XML文件,格式为一个Key对应一个Value,这个格式不能更改,因为涉及到后面的语言表的解析。
2-2-2、语言设置
启动流程ProcedureLaunch.cs
的OnEnter
方法中进行了语言的设置:
using GameFramework.Localization;
using System;
using UnityGameFramework.Runtime;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;namespace StarForce
{public class ProcedureLaunch : ProcedureBase{protected override void OnEnter(ProcedureOwner procedureOwner){base.OnEnter(procedureOwner);// 语言配置:设置当前使用的语言,如果不设置,则默认使用操作系统语言InitLanguageSettings();}private void InitLanguageSettings(){if (GameEntry.Base.EditorResourceMode && GameEntry.Base.EditorLanguage != Language.Unspecified){// 编辑器资源模式直接使用 Inspector 上设置的语言return;}Language language = GameEntry.Localization.Language;if (GameEntry.Setting.HasSetting(Constant.Setting.Language)){try{string languageString = GameEntry.Setting.GetString(Constant.Setting.Language);language = (Language)Enum.Parse(typeof(Language), languageString);}catch{}}if (language != Language.English&& language != Language.ChineseSimplified&& language != Language.ChineseTraditional&& language != Language.Korean){// 若是暂不支持的语言,则使用英语language = Language.English;GameEntry.Setting.SetString(Constant.Setting.Language, language.ToString());GameEntry.Setting.Save();}GameEntry.Localization.Language = language;Log.Info("Init language settings complete, current language is '{0}'.", language.ToString());}}
}
这里用到了配置组件(SettingComponent)
,获取数据,首次进入游戏,这个值没有设置,会默认使用系统语言。
编辑器模式下,直接使用编辑器配置的语言。
2-2-3、语言表加载加入本地化组件
启动流程ProcedureLaunch.cs
的LoadDictionary
方法中进行了语言表加载:
private void LoadDictionary(string dictionaryName)
{string dictionaryAssetName = AssetUtility.GetDictionaryAsset(dictionaryName, false);m_LoadedFlag.Add(dictionaryAssetName, false);GameEntry.Localization.ReadData(dictionaryAssetName, this);
}
通过语言名称获取加载路径:
public static string GetDictionaryAsset(string assetName, bool fromBytes)
{return Utility.Text.Format("Assets/GameMain/Localization/{0}/Dictionaries/{1}.{2}", GameEntry.Localization.Language, assetName, fromBytes ? "bytes" : "xml");
}
并读取其中的key-value的键值对,保存到本地化(Localization)
组件中。
2-2-4、语言加载
语言加载完成后,如下图在UI父类UGuiForm.cs
里,获取了UI所有的text组件。并将text当前值作为key去获取对应value,并将value写入text:
protected override void OnInit(object userData)
{base.OnInit(userData);m_CachedCanvas = gameObject.GetOrAddComponent<Canvas>();m_CachedCanvas.overrideSorting = true;OriginalDepth = m_CachedCanvas.sortingOrder;m_CanvasGroup = gameObject.GetOrAddComponent<CanvasGroup>();RectTransform transform = GetComponent<RectTransform>();transform.anchorMin = Vector2.zero;transform.anchorMax = Vector2.one;transform.anchoredPosition = Vector2.zero;transform.sizeDelta = Vector2.zero;gameObject.GetOrAddComponent<GraphicRaycaster>();Text[] texts = GetComponentsInChildren<Text>(true);for (int i = 0; i < texts.Length; i++){texts[i].font = s_MainFont;if (!string.IsNullOrEmpty(texts[i].text)){texts[i].text = GameEntry.Localization.GetString(texts[i].text);}}
}
文本需要动态赋值也可以使用同样的方式,比如判断版本的流程ProcedureCheckVersion.cs
的更新游戏应用的时候使用:
if (m_VersionInfo.ForceUpdateGame)
{// 需要强制更新游戏应用GameEntry.UI.OpenDialog(new DialogParams{Mode = 2,Title = GameEntry.Localization.GetString("ForceUpdate.Title"),Message = GameEntry.Localization.GetString("ForceUpdate.Message"),ConfirmText = GameEntry.Localization.GetString("ForceUpdate.UpdateButton"),OnClickConfirm = GotoUpdateApp,CancelText = GameEntry.Localization.GetString("ForceUpdate.QuitButton"),OnClickCancel = delegate (object userData) { UnityGameFramework.Runtime.GameEntry.Shutdown(ShutdownType.Quit); },});return;
}
2-2-5、游戏中切换语言
在游戏内部更改并保存语言的话,会调用SettingForm.cs
里面的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);
}
2-3、实现及代码分析
三、后记
如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。
你的点赞就是对博主的支持,有问题记得留言:
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦:
专栏 | 方向 | 简介 |
---|---|---|
Unity3D开发小游戏 | 小游戏开发教程 | 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。 |
Unity3D从入门到进阶 | 入门 | 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。 |
Unity3D之UGUI | UGUI | Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。 |
Unity3D之读取数据 | 文件读取 | 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。 |
Unity3D之数据集合 | 数据集合 | 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。 |
Unity3D之VR/AR(虚拟仿真)开发 | 虚拟仿真 | 总结博主工作常见的虚拟仿真需求进行案例讲解。 |
Unity3D之插件 | 插件 | 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等 |
Unity3D之日常开发 | 日常记录 | 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等 |
Unity3D之日常BUG | 日常记录 | 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。 |