1、打开Unity,新建一个空工程,具体如下图
2、在场景中,设计界面如下,添加两个Toggle来控制语言选择(注意添加Togglegroup来设置多组单选),添加两个文本Text用来测试语言设置的效果,其中一个文本隐藏,用来测试文本隐藏时,也能更新Text,界面具体如下图
3、在工程中添加文件夹Resources/Language,并且添加两个Txt文本(注意是UTF-8格式),分别对应命名为Chinese.txt,English.txt,具体如下图
4、Chinese.txt 的文本内容如下:Chinese_Toggle:中文English_Toggle:英文Text1:文本 1Text2:文本 2English.txt 的文本内容如下:Chinese_Toggle:ChineseEnglish_Toggle:EnglishText1:Text 1Text2:Text 2
5、新建脚本LanguageDataManager,LanguageUIText,SelectLanguageToggle,用来管理语言的动态设置,具体如下图
6、LanguageDataManager 脚本用来加载Txt内容到字典中,然后给与通过key获取文本内容的方法,具体如下图
7、LanguageDataManager 脚本具体如内容如下:using System.Collections;using System.Collections.Generic;using UnityEngine;public enum Language{ Chinese, //中文 English, //英文}public enum LanguageTextName{ Chinese_Toggle, //中文Toggle English_Toggle, //英文Toggle Text1, // 文本1 Text2, // 文本2}public class LanguageDataManager : MonoBehaviour { [SerializeField] internal Language currentLanguage = Language.Chinese; //当前设置的语言 // 中英文字典 private Dictionary<string, string> ChineseDictionary = new Dictionary<string, string>(); private Dictionary<string, string> EnglishDictionary = new Dictionary<string, string>(); private static LanguageDataManager instancce = null; public static LanguageDataManager Instancce { get { return instancce; } } private void Awake() { instancce = this; // 加载语言资源 LoadLanguageTxt(Language.Chinese); LoadLanguageTxt(Language.English); } /// <summary> /// 设置语言 /// </summary> public void SetCurrentLanguageValue(Language language) { currentLanguage = language; //获取场景中所有类型脚本 LanguageUIText[] languageUITexts = Resources.FindObjectsOfTypeAll<LanguageUIText>(); for (int i = 0; i < languageUITexts.Length; i++) { Debug.Log("SetCurrentLanguageValue:" + languageUITexts.Length); languageUITexts[i].SetLanguageTextName(); } Debug.Log("languageUITexts:" + languageUITexts.Length); } /// <summary> /// 加载对应的语言资源txt,保存到字典中 /// </summary> /// <param name="language"></param> internal void LoadLanguageTxt(Language language) { TextAsset ta = Resources.Load<TextAsset>("Language/" + language.ToString()); if (ta == null) { Debug.LogWarning("没有该语言的文本文件"); return; } string[] lines = ta.text.Split('\n'); for (int i = 0; i < lines.Length; i++) { if (string.IsNullOrEmpty(lines[i])) { continue; } string[] kv = lines[i].Split(':'); if (language == Language.Chinese) { ChineseDictionary.Add(kv[0], kv[1]); } else if (language == Language.English) { EnglishDictionary.Add(kv[0], kv[1]); } Debug.Log(string.Format("key:{0},value:{1}", kv[0], kv[1])); } } /// <summary> /// 获得对应语言字典中的对应的 key 值 /// </summary> /// <param name="key"></param> /// <returns></returns> internal string GetLanguageText(string key) { if (currentLanguage == Language.Chinese) { if (ChineseDictionary.ContainsKey(key)) { return ChineseDictionary[key]; } else { Debug.Log("!ChineseDictionary.ContainsKey(key)"); } } else if (currentLanguage == Language.English) { if (EnglishDictionary.ContainsKey(key)) { return EnglishDictionary[key]; } else { Debug.Log("!EnglishDictionary.ContainsKey(key)"); } } return string.Empty; }}
8、LanguageUIText 脚本用来绑定到需要更新的Text上,动态获取文本值添加到对应的Text上,在Start和OnEnable函数中同时更新,避免未及时更新,具体如下图
9、LanguageUIText 脚本具体内容如下:using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class LanguageUIText : MonoBehaviour { [SerializeField] private LanguageTextName languageTextName; // Use this for initialization void Start() { SetLanguageTextName(); } private void OnEnable() { SetLanguageTextName(); } /// <summary> /// 根据当前语言设置 Text 文本 /// </summary> internal void SetLanguageTextName() { string value = LanguageDataManager.Instancce.GetLanguageText(languageTextName.ToString()); if (string.IsNullOrEmpty(value) != true) { gameObject.GetComponent<Text>().text = value; } }}
10、SelectLanguageToggle 脚本用来管理选择具体的语言设置,并设置对应Toggle的监听事件,具体如下图
11、SelectLanguageToggle 脚本具体内容如下:using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class SelectLanguageToggle : MonoBehaviour { public Toggle Chinese_Toggle; public Toggle English_Toggle; // Use this for initialization void Start() { if (Chinese_Toggle != null) { Chinese_Toggle.onValueChanged.AddListener(SetChineseLanguageIsOn); } if (English_Toggle != null) { English_Toggle.onValueChanged.AddListener(SetEnglishLanguageIsOn); } } private void SetChineseLanguageIsOn(bool isOn) { if (isOn == true) { SetLanguage(Language.Chinese); } } private void SetEnglishLanguageIsOn(bool isOn) { if (isOn == true) { SetLanguage(Language.English); } } private void SetLanguage(Language language) { Debug.Log("SetLanguage :" + language); LanguageDataManager.Instancce.SetCurrentLanguageValue(language); }}
12、脚本编译正确,回到Unity,把脚本LanguageDataManager挂载到LanguageDataManager昌吉惊鸿的物体上,具体如下图
13、SelectLanguageToggle 脚本添加到,两个Toggle的父物体上,并对应赋值Toggle,具体如下图
14、把LanguageUIText 添加到对应的Text上,并对应选取文本languageTextName 值,具体如下图
15、以上正确完成后,运行场景,切换语言,即可动态设置语言Text,而且隐藏的Text,也同步更新了,可以查看Text2,具体如下图