当前位置: 代码迷 >> 综合 >> Unity3D NGUI Localization国际化
  详细解决方案

Unity3D NGUI Localization国际化

热度:0   发布时间:2023-12-06 22:27:37.0

转载地址: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的部分核心代码

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2. /// Name of the currently active language.  
  3. /// </summary>  
  4.   
  5. public string currentLanguage  
  6. {  
  7.     get  
  8.     {  
  9.         return mLanguage;  
  10.     }  
  11.     set  
  12.     {  
  13.         if (mLanguage != value)  
  14.         {  
  15.             startingLanguage = value;  
  16.   
  17.             if (!string.IsNullOrEmpty(value))  
  18.             {  
  19.                 // Check the referenced assets first  
  20.                 if (languages != null)  
  21.                 {  
  22.                     for (int i = 0, imax = languages.Length; i < imax; ++i)  
  23.                     {  
  24.                         TextAsset asset = languages[i];  
  25.   
  26.                         if (asset != null && asset.name == value)  
  27.                         {  
  28.                             Load(asset);  
  29.                             return;  
  30.                         }  
  31.                     }  
  32.                 }  
  33.   
  34.                 // Not a referenced asset -- try to load it dynamically  
  35.                 TextAsset txt = Resources.Load(value, typeof(TextAsset)) as TextAsset;  
  36.   
  37.                 if (txt != null)  
  38.                 {  
  39.                     Load(txt);  
  40.                     return;  
  41.                 }  
  42.             }  
  43.   
  44.             // Either the language is null, or it wasn't found  
  45.             mDictionary.Clear();  
  46.             PlayerPrefs.DeleteKey("Language");  
  47.         }  
  48.     }  
  49. }  
  50.   
  51. /// <summary>  
  52. /// Determine the starting language.  
  53. /// </summary>  
  54.   
  55. void Awake ()  
  56. {  
  57.     if (mInstance == null)  
  58.     {  
  59.         mInstance = this;  
  60.         DontDestroyOnLoad(gameObject);  
  61.   
  62.         currentLanguage = PlayerPrefs.GetString("Language", startingLanguage);  
  63.   
  64.         if (string.IsNullOrEmpty(mLanguage) && (languages != null && languages.Length > 0))  
  65.         {  
  66.             currentLanguage = languages[0].name;  
  67.         }  
  68.     }  
  69.     else Destroy(gameObject);  
  70. }  

其实就是在程序运行前,将我们场景的带有Localize脚本的物体所对应的键值进行替换,这个语言选择的选项结果也是通过PlayerPrefs保存起来的,所以你选择了中文,下次再进去游戏之后依然是显示中文的界面。


最后为了方便起见,可以将带有Localization脚本的这个空物体保存为一个预设,这样,在后面的Scene中,把这个预设拖到场景中,只要设置物体的Localize键值即可轻松国际化了,写到这里,不得不赞叹NGUI真的非常强大。


  相关解决方案