您的位置:首页 > 移动开发 > Unity3D

Unity3D NGUI Localization国际化

2014-02-21 10:00 176 查看
转载地址: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
plaincopy





/// <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真的非常强大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: