我在Unity3d中创建游戏。
在某处,我的提示出现在HUD的底部(例如“按A行动”)。我希望我的游戏支持更多语言,我不希望这些提示在脚本中被硬编码。
解决此任务最优雅的方法是什么?我正在考虑txt文件,我会在所有语言中提供所有提示。但我不确定,如果这是一个好主意。
提前致谢。
答案 0 :(得分:3)
使用的常用方法是为每种语言提供XML文件。 XML文件应包含您在游戏中使用的每个短语,并带有唯一的ID。
在您的代码中,您可以使用正确的ID从当前语言的XML中获取正确的短语。
如果您不了解XML文件,请阅读本教程,了解如何在Unity中使用XML文件:http://xeophin.net/en/blog/2010/05/13/reading-strings-out-xml-file-using-c-unity-3d
但是如果你愿意在游戏上花一些钱,你应该看一下:http://u3d.as/content/rodrigo-barros/my-menu/32E
我还没试过,但似乎很好。
答案 1 :(得分:2)
如果你正确地执行硬编码并不是那么糟糕。
例如,创建一个抽象类,其中包含您要拥有的所有消息以及语言自动检测:
public abstract class Lang {
static Lang currentLang;
public static Lang Get {
get {
if(currentLang == null)
switch(Application.systemLanguage) {
case SystemLanguage.Polish:
currentLang=new LangPL();
break;
default:
case SystemLanguage.English:
currentLang=new LangEN();
break;
}
return currentLang;
}
}
public abstract string MenuTime {get;}
public abstract string MenuPoints {get;}
public abstract string YouWon {get;}
public abstract string YouLost {get;}
public abstract string Point(int p);
}
然后将每种语言作为单独的类实现:
public class LangPL:Lang {
public override string MenuTime {get {return "CZAS";}}
public override string MenuPoints {get {return "WYNIK";}}
public override string YouWon {get {return "Gratuluję, wygrałeś!";}}
public override string YouLost{get {return "Może następnym razem...";}}
public override string Point(int p) {
if(p == 1)
return "1 punkt";
return p+" punktów";
}
}
public class LangEN:Lang {
public override string MenuTime {get {return "TIME";}}
public override string MenuPoints {get {return "SCORE";}}
public override string YouWon {get {return "You won!";}}
public override string YouLost{get {return "Maybe next time...";}}
public override string Point(int p) {
if(p == 1)
return "1 point";
return p+" points";
}
}
用法很简单:
GUILayout.Label(Lang.Get.YouWon);
GUILayout.Label(Lang.Get.Point(5));
这样您就拥有了最多的控制权,并且可以轻松支持复杂的翻译。此方法还有助于减少错误 - 如果您在任何地方忘记或错误输入文本会导致语法错误。
答案 2 :(得分:1)
您可以尝试为每种语言创建Javascript脚本或C#脚本,然后根据选择的语言调用特定脚本。
e.g
public class English : MonoBehaviour{
public string jump = "Press 'space' to jump";
//etc
}
public class French : MonoBehaviour{
public string jump = "Appuyer sur 'espace' pour sauter";
//etc
}
在GUIText的功能
中public GameController gameController;
public GUIText text;
private string languageSelected;// obtain from the user input on language selection (better if registered in the gameController)
void Awake(){
languageSelected = System.Activator.CreateInstance(Type.GetType(gameController.languageSelected));
// where languageSelected will be e.g English
text.text = languageSelected.jump;
}
答案 3 :(得分:1)
我强烈建议不要在您的代码中嵌入文本。它会减慢本地化过程(必须通过代码查找文本并不是实现本地化的最快捷方式)。
使用单独的文件。它易于维护,翻译人员无需访问代码。
看看l2本地化。它是一个非常方便的Unity插件,可以让您管理游戏的翻译。
单个Google电子表格中的所有本地化字符串。设置完成后,您需要做的就是填写它以查看游戏中的结果。
我自己就是一名游戏翻译员,而且恰巧正在管理一个名为Level Up Translation的小型游戏翻译团队。几个月前,我们在博客中发布了localization in Unity的初学者指南。随意查看它!
答案 4 :(得分:0)
例如,您可以格式化 france.txt 的语言文件:
hello=Bonjour
goodbye=Au Revoir
然后,读取文件并将其转换为字典:
string[] lines = File.ReadAllLines("france.txt");
var dict = lines.Select(l => l.Split('=')).ToDictionary(a => a[0], a => a[1]);
现在您可以按键从字典中读取:
string hello = dict["hello"];