一、为什么要这么做?
游戏中用到的所有文本都最好统一管理,为啥呢?
因为你的游戏必须统一字体吧,那么一种字体就用到底吗?肯定要换好多次,看看哪个效果更好,这种情况下,如果手动自找Text然后换的话会很麻烦,即使使用了Prefab。
包括文本内容也不可能一次到位,肯定要修改多次,确定一种格式之后把这个活儿交给策划去干就行了,而我们只需要修改一些变量。
除此之外,如果游戏用到多语言,那么也需要根据系统语言的识别来通过程序控制文字显示,这种情况下,是必须用代码对所有文本进行管理了。(虽然我的游戏还没有涉及到本地化)
二、应该怎么做?
1.把用到的变量在excel中填好。认真设置MainKey。
2.通过BeJson网站把excel中的数据转换成Json格式,保存为txt文件。导入Unity中。
3.根据文件名,把该txt读取进来,存成Unity支持的TextAsset格式:
public static string loadText(string textFileName)
{
TextAsset textAsset = Resources.Load(MainContainer.ExcelDataFolder + textFileName,
typeof(TextAsset)) as TextAsset;
if (textAsset == null)
{
Debug.LogError("error in loadText file: " + textFileName);
return null;
}
return textAsset.text;
}
4.把得到的Json格式的文本,直接转成对象数组
(1)创建DicString数据类:
public class DicString {
public string MainKey { get; set; }
public string Time { get; set; }
public string Actor { get; set; }
public string CHS { get; set; }
public string CHT { get; set; }
public string EN { get; set; }
public string JP { get; set; }
}
(2)通过JsonReader中的函数把Json文本转换成某类的对象数组:
public static T[] JsonToClasses<T>(string strJson) where T : class
{
T[] list = JsonReader.Deserialize<T[]>(strJson);
return list;
}
调用上面的函数,转成DicString对象数组:
//根据MainKey来取该对象的字典
public static Dictionary<string, DicString> stringMap = new Dictionary<string, DicString>();
public static void ReloadStringData(string strContent,bool isReplaceOrAppend=false)
{
DicString[] dicStringList = Utility.JsonToClasses<DicString>(strContent);
foreach (DicString dicString in dicStringList)
{
//根据MainKey,把对象存进字典,之后会根据MainKey属性来取得对象
stringMap[dicString.MainKey] = dicString;
}
}
4.在其他地方,可以给出MainKey,然后就可以得到该对象的其他属性了。
public static DicString getDicString(string strKey)//通过key来在字典中取得对象
{
if (stringMap.ContainsKey(strKey))//防止字典中没有存储这个对象
{
return stringMap[strKey];
}
else
{
return null;
}
if (stringMap.Count <= 0)//字典内容为空时,存内容
{
loadDictData();
}
}