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真的非常强大。
首先先要感谢前人做的巨大贡献,这部分在一些论坛上都有教程,我也是看着那些慢慢学的,不过通过自己的制作,还是发现有些说的不是很到位,所以把自己的一些见解写出来供大家参考。
这里就以中英文两种语言举例说明。
在制作游戏国际化之前,首先需要把素材都准备好,需要一个同时支持中文字体的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真的非常强大。
相关文章推荐
- Unity3D ReadFile
- Unity3d-除了C#还需要学习什么语言?
- Unity3d_AssetPostprocessor简单用法
- unity3D 制作3D塔防游戏(二) 制作敌人行走路径 无限循环
- 【Unity开发】Unity3d之MiniJson与LitJson之间的较量
- unity3D—查询基础
- Unity3d中添加json的system.web.script.serialization
- 关于c#的unity3d中双问号操作符(??)无法正确判断null值的问题
- Unity3D之Lightmap详解
- unity3d 常用参考网址
- Unity3D 5 官方教程:标准着色器
- Unity3D学习记录——爆炸特效
- 利用Unity3d中的自动寻路来为角色设置目的地
- UNITY3D MAC版本破解
- unity3d上用vuforia开发AR
- Unity3D的碰撞检测遇到的有趣BUG
- Unity3D的四种坐标系
- 【Unity3D游戏开发】基础知识之Tags和Layers (三二)
- 【Unity3D与23种设计模式】建造者模式(Builder)