遊戲開發日誌 #02
在上一編的 Localization 內容,有人私訊問題,關於 dataSystem.text.en 取得系統相關的英語文字的事項,如果有十幾種語言,那不同類型文字的程序都要去編寫嗎?
像以下這樣:
string GetSystemText(int textID) {
DataSystem ds = Array.Find(dataSystems, s => s.textID == textID);
switch (localizationIndex) {
case 1:
return ds.text.en;
case 2:
return ds.text.jp;
case 3:
return ds.text.cht;
case 4:
return ds.text.chs;
default:
return ds.text.en;
}
string GetItemText(int textID) {
.
.
.
如果是上面這樣做的話,的確要為每個種類的取得文字 function 去設定重覆的步驟。其實只要做一次就足夠,不用這大廢周張。以下是本人的做法:
//Localization.cs
int localizationIndex=1; //current language
DataSystem[] dataSystem;
DataItem[] dataItem;
DataNarrative[] dataNarrative;
public string GetSystemText(int textID)
{
DataSystem ds = Array.Find(dataSystems, s => s.textID == textID);
return ds.text.GetCurrentText(LocalizationIndex);
}
public string GetDataItem(int textID)
{
DataItem di = Array.Find(dataItem, i => i.textID == textID);
return di.text.GetCurrentText(LocalizationIndex);
}
public string GetDataNarrative(int textID)
{
DataNarrative dn = Array.Find(dataNarrative, n => n.textID == textID);
return dn.text.GetCurrentText(LocalizationIndex);
}
//DataSystem.cs
public class DataSystem
{
public string type;
public int textID;
public LocalizedText text;
}
//LocalizedText.cs
public class LocalizedText
{
public string en;
public string jp;
public string cht;
public string chs;
public string GetCurrentText(int localizationIndex)
{
switch (localizationIndex)
{
case 1:
return this.en;
case 2:
return this.jp;
case 3:
return this.cht;
case 4:
return this.chs;
default:
return this.en;
}
}
}
只要在 Localized Text 中加入一個 GetCurrentText(int localizationIndex) 的 function,就可以直接取得現在語言的文字,要加減語言的話,只要更改這裡就可以,非常方便。
這就是我愛死 custom class 的原因,在知道這東西前真的很頭痛。。。
留言