转载地址:http://blog.csdn.net/w337198302/article/details/17632925
首先先要感谢前人做的巨大贡献,这部分在一些论坛上都有教程,我也是看着那些慢慢学的,不过通过自己的制作,还是发现有些说的不是很到位,所以把自己的一些见解写出来供大家参考。
这里就以中英文两种语言举例说明。
在制作游戏国际化之前,首先需要把素材都准备好,需要一个同时支持中文字体的TTF格式的字库,可以到电脑的C盘里有个字库文件夹,挑一个支持中文的字体就好了(英文字母肯定支持的),或者去网站上下个喜欢的。
然后将字库文件拖进我们的Asset中,可以建一个文件夹。注意:字库文件名和字库所在的文件夹一定不要有中文,不然拖进去会有报错无法导入。
1.创建字体预设
在菜单栏中点击“NGUI”->"Open the Font Maker",把Type类型设为动态,然后把字库拖进Font TTF中,点击Create the Font即可创建成功
2.创建本土化对应数据
首先需要创建两个txt文件,一个为English,一个为Chinese,分别为两种语言显示的内容,注意:这里文件格式一定要保存为UTF-8,不然后面显示不出来我们的效果
然后将你需要国际化的内容分别在这两个文件中写入,以类似于键值对的方式,可以先把暂时需要的写进去,后面用到再添加。
3.创建Localization
创建一个空物体,然后添加Localization脚本(Component->NGUI->Internal->Localization),将Languages大小设为2,再把我们之前的两个文本拖进去即可。
4.添加需要国际化的物体
我们首先需要有个下拉控件,设置选择语言的选项。创建一个Popup List,然后将Options的内容清空掉(可以不需要任何内容),记住要勾选Localized,如图:
在给Popup List添加一个Language Selection脚本(Component->NGUI->interaction->language selection),ok,现在可以运行看看,下拉列表里面会有中文和English两个选项了。
后面的工作就非常容易了。
选择需要国际化的文本或者图片,添加一个UILocalize脚本(Component->NGUI->UI->Localize),然后将key设置为我们之前在txt文本中添加的键名(等号左边的),这样就可以了。
在运行一次选择不同的语言,效果就出来了。
分析:
之所以在选择语言的Popup List的Options可以不添加内容,是因为这里面的Item即为Localization脚本里面的两个内容,但是我下面那个桌面颜色的下拉控件就必须添加选项,不然显示不出下拉结果,下拉选项对应的语言版本要在txt文件中添加上,不然即使勾选了Localize也显示不了。图片只要把两种图片的名字添加进txt文本中就可以了,但是这两个图片文件必须在同一个Atlas中。
原理:
可以看一下Localization.cs的部分核心代码
- /// <summary>
- /// Name of the currently active language.
- /// </summary>
- public string currentLanguage
- {
- get
- {
- return mLanguage;
- }
- set
- {
- if (mLanguage != value)
- {
- startingLanguage = value;
- if (!string.IsNullOrEmpty(value))
- {
- // Check the referenced assets first
- if (languages != null)
- {
- for (int i = 0, imax = languages.Length; i < imax; ++i)
- {
- TextAsset asset = languages[i];
- if (asset != null && asset.name == value)
- {
- Load(asset);
- return;
- }
- }
- }
- // Not a referenced asset -- try to load it dynamically
- TextAsset txt = Resources.Load(value, typeof(TextAsset)) as TextAsset;
- if (txt != null)
- {
- Load(txt);
- return;
- }
- }
- // Either the language is null, or it wasn't found
- mDictionary.Clear();
- PlayerPrefs.DeleteKey("Language");
- }
- }
- }
- /// <summary>
- /// Determine the starting language.
- /// </summary>
- void Awake ()
- {
- if (mInstance == null)
- {
- mInstance = this;
- DontDestroyOnLoad(gameObject);
- currentLanguage = PlayerPrefs.GetString("Language", startingLanguage);
- if (string.IsNullOrEmpty(mLanguage) && (languages != null && languages.Length > 0))
- {
- currentLanguage = languages[0].name;
- }
- }
- else Destroy(gameObject);
- }
其实就是在程序运行前,将我们场景的带有Localize脚本的物体所对应的键值进行替换,这个语言选择的选项结果也是通过PlayerPrefs保存起来的,所以你选择了中文,下次再进去游戏之后依然是显示中文的界面。
最后为了方便起见,可以将带有Localization脚本的这个空物体保存为一个预设,这样,在后面的Scene中,把这个预设拖到场景中,只要设置物体的Localize键值即可轻松国际化了,写到这里,不得不赞叹NGUI真的非常强大。