扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
多语言是游戏中比较长见的功能,实现起来也相对比较简单,在这里简单说一下思路,稍后代码附上
成都创新互联主要从事成都做网站、网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务梁平,10多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220简单说一下步骤:
步骤一、设计多语言配置表。在这里说一下多语言配置表。就是一个json格式文件,每种语言的简写作
为当前语言的键,比如简体用zh-hans,值是一个json对象。比如游戏中有一个需要多语言的
label,内容是“登陆游戏”,我们简单写一下这个表
{
"zh-hans": {
"登陆游戏": "",
" 输入昵称": "",
"***力增加{0}%":""
},
"zh-hant": {
"登陆游戏": "登錄遊戲",
"输入昵称": "輸入暱稱",
"***力增加{0}%":"攻擊力增加{0}%"
}
}
“zh-hans”表示简体表,“zh-hant”表示繁体表,可能还会有其他语言,比如,英文,德
文,法文等等,都可以加。您可能也注意到了,不管是哪个语言表,他们的键都是简体中文,
这样设计的好处就是直观,后面随着语言的增多,和表中的键值对增多,给键取名也是很难的
事。所以,干脆就是用简体中文作为键,其他的语言都通过它来翻译,这样既直观又省事。
配置表设计好了以后,将游戏各个模块中用到的,需要进行多语言设置的label中的文字,以
label为单位,每个label中的文本作为一对键值,添加到配置表里。这里有一种特殊情况,就
是label中可能有不断变化的数值,例如:“***力增加5%”,“英雄获得200金币”等,这样
的情况,这时就不能直接写到配置表里,需要一个字符串格式化处理,例如:“***力增加
5%”改为“***力增加{0}%”;“英雄获得200金币”改为“英雄获得{0}金币”。在下面的代
码中也提供相应的方法。
步骤二、初始化,主要工作就是解析多语言配置表,加载对应语言的字库。
步骤三、LanguageManager中提供了两个重载的GetValue()方法,游戏中需要多语言显示的label,普
通文本就调用GetValue(string key,UILabel label)方法,有需要格式化字符的label,例
如:“***力增加5%”就调用GetValue(string key,UILabel label, params object[]
args),args是可变参数,可以传入数值,int,float,string都可以,如:GetValue("***力
增加{0}%",label,5);因为多语言表中可以查到"***力增加{0}%"这个键,所以就可以显示出与
当前语言对应的文本。
步骤四、当切换语言的时候,LanguageManager提供了一个ChangeLanguage方法,重新设置当前的
语言键值表,并且发送一个消息,通知所有模块更新本模块内的所有涉及的多语言的label,所
以在各个模块需要监听一个多语言发生改变的事件方法,在方法里重新调用GetValue方法给
label赋值。一般切换语言后需要做一下本地存储,方便玩家下次进入游戏就可以直接进入上次
选择的语言环境。
代码如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using LitJson;
public class LanguageManager : Singleton
{
private string dataPath = "data/language";
//字体
private Dictionary
private Dictionary
private string currLanguageKey = "";
private JsonData JDAllLanguages = null;
private Dictionary
private Dictionary
///
/// 获取与当前语言对应的简体中文的键
///
///
///
public string GetSimplifiedKey(string val)
{
foreach (KeyValuePair
if (kvp.Value == val)
return kvp.Key;
return string.Empty;
}
public string GetLanguageKey(string val)
{
foreach (KeyValuePair
if (kvp.Value == val)
return kvp.Key;
return string.Empty;
}
public string GetLanguageVal(string key)
{
if (dicSupportLanguage.ContainsKey(key))
return dicSupportLanguage[key];
return string.Empty;
}
public List
{
List
foreach (KeyValuePair
list.Add(kvp.Value);
return list;
}
public void Init()
{
currLanguageKey = UserData.Instance.CurrentLanguage;
//1.初始化多语言配置表
TextAsset tex = Resources.Load(dataPath) as TextAsset;
string data = tex.text;
Debug.Log("data is " + data);
JDAllLanguages = JsonMapper.ToObject(data);
Debug.Log("jdalllanguages is " + JDAllLanguages.ToJson());
//JsonData jd = JsonMapper.ToObject(data);
if (JDAllLanguages != null)
parse(JDAllLanguages);
dicSupportLanguage.Clear();
dicSupportLanguage.Add("zh-hans", "简体中文");
dicSupportLanguage.Add("zh-hant", "繁体中文");
Font f = Resources.Load("font/hycchj") as Font;
if(!dicFonts.ContainsKey("zh-hans")) dicFonts.Add("zh-hans", f);
f = Resources.Load("font/jingdianfanghei_fanti") as Font;
if (!dicFonts.ContainsKey("zh-hant")) dicFonts.Add("zh-hant", f);
}
void parse(JsonData jd)
{
JsonData jdLan = null;
if (jd.Keys.Contains(currLanguageKey))
jdLan = jd[currLanguageKey];
dicLanguagePack.Clear();
foreach (string key in jdLan.Keys)
if (!dicLanguagePack.ContainsKey(key))
dicLanguagePack.Add(key, jdLan[key].ToString());
}
///
/// 切换语言
///
///
public void ChangeLanguage(string lan)
{
if (UserData.Instance.CurrentLanguage == lan)
return;
UserData.Instance.CurrentLanguage = lan;
currLanguageKey = lan;
RefreshGameLanguagePack();
//应该在这里发送一个语言环境改变的事件通知
MessageController.Instance.SendNotification(MessageTypes.LocalMessageType.LanguageChanged.ToString(), this, null);
}
public string GetValue(string key,UILabel label)
{
if (label)
label.trueTypeFont = GetFont();
if (dicLanguagePack.ContainsKey(key))
{
if (currLanguageKey == "zh-hans")
return key;
else
return dicLanguagePack[key];
}
return key;
}
public string GetValue(string key,UILabel label, params object[] args)
{
if (label)
{
label.trueTypeFont = GetFont();
Debug.Log(label.trueTypeFont.name);
}
return GetValue(key, args);
}
string GetValue(string key, params object[] args)
{
if (dicLanguagePack.ContainsKey(key))
{
if(currLanguageKey == "zh-hans")
return string.Format(key, args);
else
return string.Format(dicLanguagePack[key], args);
}
return key;
}
public Font GetFont()
{
if(dicFonts.ContainsKey(currLanguageKey))
return dicFonts[currLanguageKey];
return null;
}
///
/// 更新游戏语言环境,用于玩家切换语言环境
///
public void RefreshGameLanguagePack()
{
parse(JDAllLanguages);
}
//给对象添加多语言脚本
//public void AddMulLanguageTextScript(GameObject go)
//{
// if (go == null) return;
// UILabel[] labels = go.GetComponentsInChildren
// foreach (UILabel item in labels)
// {
// if(item.transform.gameObject.GetComponent
// item.transform.gameObject.AddComponent
// }
//}
}
这里只出里了文字性的多语言,另外图片也会涉及到多语言,其实都差不多,可以存一下图片的名字,在不同的语言环境调用不同的图片名(或者路径)就可以。
先写到这,有什么错误的地方,欢迎大家留言指正,谢谢!
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流