记得最早做页游时,要做多语言版本是需要提前规划的。资源要做分离,游戏内语言包也要提取出来。每在游戏内添加一段文本,就要添加一段不那么直观的代码,然后再去语言包添加一行代码。。。反正就是没那么舒服好用就是了。
那么到了U3D里,我给大家推荐一种快速提取语言包,并且批量修改代码的方法。看了我的做法,即便是游戏临近上线,相信你也能分分钟,轻松搞定多语言版本。
如何实现,下面我说下实现思路:
1.定位代码里的中文文本。
2.替换文本为函数,修改代码里的文本为函数+参数的形式,并保存新代码。
3.保存提取出来的文本,输出成语言包。
1.定位代码里的中文文本
用正则判断代码是否存在双引号包含的内容
Regex reg = new Regex("\".*?\"");
如果有双引号结构的文本则进一步判断是否包含中文字符。
public static bool HasChinese(string str) { return Regex.IsMatch(str, @"[\u4e00-\u9fa5]"); }
如果都符合,则把要里面的文本存到列表里,再对原来的代码进行修改。
2.替换文本为函数,修改代码里的文本为函数+参数的形式,并保存新代码。
TextAsset textAsset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Object)) as TextAsset;
string text = textAsset.text;
StreamWriter fs = files.CreateText();
text = text.Replace("\"" + format + "\"", "StrUtil.GetText(\"" + format + "\")");
fs.Write(text);
3.保存提取出来的文本,输出成语言包。
if (!Localization.Contains(format) && !string.IsNullOrEmpty(format)) { if (HasChinese(format)) { text = text.Replace("\"" + format + "\"", "StrUtil.GetText(\"" + format + "\")"); Localization.Add(format); staticWriteText += format + " = " + format + "\n"; } }
把提取的中文生成出来
string textPath = OutPath;
if (System.IO.File.Exists(textPath)) { File.Delete(textPath); }
using (StreamWriter writer = new StreamWriter(textPath, false, Encoding.UTF8)) { writer.Write(staticWriteText); }
Debug.Log(OutPath);
AssetDatabase.Refresh();
这样一来就大功告成了,附上源码,希望能帮到各位
链接: https://pan.baidu.com/s/1XMMBygpRSdRpu28bBGWUpg 提取码: nhuh
该篇文章是在 雨松MOMO的Unity3D研究院之多语言用中文做KEY这篇基础上加工完成的,修改了一些细节并添加了,批量修改原代码的功能。