Unity 本地化比较实用的实现方案
2017-10-23 16:06
417 查看
本篇笔记是在I2Localization插件的基础上针对项目需求,制定的一套本地化技术解决方案,目的是实现一个语言配置文件统一来管理整个游戏的语言本地化,个人认为是非常实用的,有兴趣的同学可以简单看下这个方案的解决思路。
游戏中的本地化考虑两种资源形式:
一、图片本地化
二、文字本地化
图片本地化分为两种情况:
1、用Unity编辑器制作的静态界面图片本地化,如图
这个UI图片不需要程序动态加载,属于静态UI,我们借助本地化工具I2 Localization插件,即可实现这个UI的本地化,使用方法下面再说。
2、代码控制的动态添加的图片资源本地化,如图
这种UI变化涉及到的逻辑比较复杂,我们可能想要程序动态创建和更换这些UI的显示,本地化插件不够灵活,这时候我们把资源放入相应的语言路径下,动态加载即可(动态的资源放入Resoucres)
动态加载方法:
文字本地化也分为两种情况:
1、用Unity编辑器制作的静态文字界面本地化,如图
这种系统文字也使用本地化插件I2 Localization制作也很方便。
2、代码控制添加的系统文字,如图
在Resouces/Doc目录下编辑如下格式txt文件
写一个解析脚本,这样可以根据key值读取不同语言的文字,至于为什么是这种格式,下面介绍I2Localization插件的时候再介绍
解析脚本
获取字符串直接调用接口即可: _LocalizationManager.getInstance().getDicStr("xxx");
1、导入I2Localization插件到Unity工程中。
2、关键看这个I2Languages组件(这个预设体是全局的哦,如果不想要全局,拖拽到场景中也可以,但是暂不推荐这样做,后面的封装需要全局),添加默认语言,注意下面勾选Store
Integration IOS和android
3、添加terms,就是添加key-value
4、添加的terms类型要选择正确,区分图片类型和文字类型
5、在项目中创建一个UI(Text),拖拽I2Localization插件中的Localize脚本,然后选择要绑定的key,本地化图片操作相同,至此,本地化制作结束
6、将I2Localization配置的key-value打包(合并)成一个txt文件,方便后期统一翻译,而且用
_LocalizationManager.getInstance().getDicStr("xxx")接口也可以代码动态访问
7、如果手动修改了doc.txt,也可以import进来,点击import面板中的merge即可
优点:
1、配置多语言有可视化的界面,更方便。
2、只需要一个文件就能支持n种语言,后期翻译一键搞定。
3、扩展了I2Localization插件的文件解析方法,并且支持程序动态控制语言文字,更加灵活。
缺点:
1、所有的资源和文字都配在一个txt文件中,当游戏本地化数据足够大的时候,解析时间会增加
2、所有的语言配置都在一个文件中,容易造成多人开发冲突
游戏中的本地化考虑两种资源形式:
一、图片本地化
二、文字本地化
图片本地化
图片本地化分为两种情况:1、用Unity编辑器制作的静态界面图片本地化,如图
这个UI图片不需要程序动态加载,属于静态UI,我们借助本地化工具I2 Localization插件,即可实现这个UI的本地化,使用方法下面再说。
2、代码控制的动态添加的图片资源本地化,如图
这种UI变化涉及到的逻辑比较复杂,我们可能想要程序动态创建和更换这些UI的显示,本地化插件不够灵活,这时候我们把资源放入相应的语言路径下,动态加载即可(动态的资源放入Resoucres)
动态加载方法:
iconImg.sprite = Resources.Load(string.Format("UI/XXUI/{0}/{1}",GameTools.getInstance().getCurrentLanguageDict(),"Button"),typeof(Sprite)) as Sprite;
文字本地化
文字本地化也分为两种情况:1、用Unity编辑器制作的静态文字界面本地化,如图
这种系统文字也使用本地化插件I2 Localization制作也很方便。
2、代码控制添加的系统文字,如图
在Resouces/Doc目录下编辑如下格式txt文件
#根据";"来截取字符串,所以本地语言文字中不要存在“;”作为值,各个字段之间不能存在空格和换行 Key;Type;Desc;english [bs];Chinese (Simplified);Chinese (Traditional) reveive;Text;;;领取;
写一个解析脚本,这样可以根据key值读取不同语言的文字,至于为什么是这种格式,下面介绍I2Localization插件的时候再介绍
解析脚本
public class _LocalizationManager : _Instance<_LocalizationManager> { //存储语言字典 private Dictionary<string,string> __languageDict; //ctor public _LocalizationManager(){ __languageDict = new Dictionary<string,string>(); //根据系统语言读取文本 if(Application.isEditor) { //设置默认语言为中文 GlobalConfig.LANGUAGE = "1"; } LoadLanguageDictByTxt(); } /// <summary> /// 通过txt文件加载游戏文字语言,路径 地址:Resources/Doc/doc.txt /// </summary> private void LoadLanguageDictByTxt(){ if(__languageDict.Count > 0){ __languageDict.Clear (); } //根据语言,将text格式的行录入语言字典中 string p = "Doc/doc"; TextAsset asseet = Resources.Load<TextAsset>(p); string l = asseet.ToString(); //解析字符串 string[] firstSplit = l.Split('\n'); for(int i = 0; i< firstSplit.Length; i++){ if(!string.IsNullOrEmpty(firstSplit[i])){ string[] secondSplit = firstSplit[i].Split(';'); if("Text" == secondSplit[1]){ string value = secondSplit[int.Parse(GlobalConfig.LANGUAGE) + 2]; if(string.IsNullOrEmpty(value)){ //如果当前语言没有设置,默认读取中文 value = secondSplit[4]; } __languageDict.Add(secondSplit[0],value); } else continue; } } } /// <summary> /// 根据key值,读取文字 /// </summary> /// <returns>The dic string.</returns> /// <param name="varKey">Variable key.</param> public string getDicStr(string varKey){ if(string.IsNullOrEmpty(varKey)) return null; string text; if(__languageDict.TryGetValue(varKey,out text)){ return text; } return null; } }
获取字符串直接调用接口即可: _LocalizationManager.getInstance().getDicStr("xxx");
I2Localization插件使用说明
1、导入I2Localization插件到Unity工程中。2、关键看这个I2Languages组件(这个预设体是全局的哦,如果不想要全局,拖拽到场景中也可以,但是暂不推荐这样做,后面的封装需要全局),添加默认语言,注意下面勾选Store
Integration IOS和android
3、添加terms,就是添加key-value
4、添加的terms类型要选择正确,区分图片类型和文字类型
5、在项目中创建一个UI(Text),拖拽I2Localization插件中的Localize脚本,然后选择要绑定的key,本地化图片操作相同,至此,本地化制作结束
6、将I2Localization配置的key-value打包(合并)成一个txt文件,方便后期统一翻译,而且用
_LocalizationManager.getInstance().getDicStr("xxx")接口也可以代码动态访问
7、如果手动修改了doc.txt,也可以import进来,点击import面板中的merge即可
优缺点分析:
优点:1、配置多语言有可视化的界面,更方便。
2、只需要一个文件就能支持n种语言,后期翻译一键搞定。
3、扩展了I2Localization插件的文件解析方法,并且支持程序动态控制语言文字,更加灵活。
缺点:
1、所有的资源和文字都配在一个txt文件中,当游戏本地化数据足够大的时候,解析时间会增加
2、所有的语言配置都在一个文件中,容易造成多人开发冲突
相关文章推荐
- Android热修复:Andfix和Hotfix,两种方案的比较与实现
- Java报表工具及报表实现方案性能比较
- 三种主流的WebService实现方案(REST/SOAP/XML-RPC)简述及比较
- WINCE应用的UI实现方案 —— 上篇:几种UI实现方案比较
- Python几种并发实现方案的性能比较
- 三种主流的WebService实现方案(REST/SOAP/XML-RPC)简述及比较
- 并发实现方案的性能比较
- Python几种并发实现方案的性能比较
- 用js实现的比较经典实用的触发型导航菜单
- Python几种并发实现方案的性能比较
- 【unity实用技能】线性差值计算实现
- Android热修复:Andfix和Hotfix,两种方案的比较与实现
- Unity虚拟现实开发——鼠标开关窗户效果多种实现方案
- 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较
- 【C++基本功补习】查找三个数据中的最大值、最小值、中间值,两种实现方案比较
- 【小松教你手游开发】【unity实用技能】从NGUI的UIScrollview的实现原理
- 三种主流的Web服务实现方案(REST+SOAP+XML-RPC)简述及比较
- [转]一个比较实用的VS C++版本号自增的实现方式
- Android热修复:Andfix和Hotfix,两种方案的比较与实现
- Python几种并发实现方案的性能比较