大掛かりなゲームであればもっと根底から考えた方がいいですが、簡単なゲームであれば言語対応も簡単にすませたいですよね。
というわけで、紹介しておきます。
ダウンロード
日本語フォントが入っているので、ちょっと大きめです。
使い方
「はじめから」「つづきから」「せってい」の3つの単語が、変更箇所です。
Japanese を押すと日本語、English を押すと英語になります。
テーブル
勝手に翻訳するわけではないので、テーブルが必要です。
次に紹介するクラスの中に入れてあります。
static List<LangTable> table = new List<LangTable>()
{
new LangTable("はじめから", "Start"),
new LangTable("つづきから", "Continue"),
new LangTable("せってい", "Option"),
};
Lang
適当な空 GameObject に Lang をアタッチします。


先ほどのテーブルは Lang の中に含まれています。
AutoLang
日本語<>英語切り替えをしたい TextMeshProUGUI に、AutoLang をアタッチします。


テーブル作成と、アタッチだけで完成です!
呼び出しているメソッド
ボタンを押された時
次のメソッドを呼び出しています。
ChangeLanguage() は言語を切り替えたい時、UpdateTexts() は、シーンロード完了時などに呼びだすといいと思います。
Lang.ChangeLanguage(Lang.eSelectLang.Japanese); Lang.UpdateTexts();
シーンアンロード
ちょっと面倒なのですが、Lang がシングルトン構造なので、アンロード時にバッファクリアを行う必要があります。
サンプルプロジェクトではシーンが1つしかないので、使っていません。
Lang.UnloadEntry();
UpdateTexts()、UnoadEntry() を自動的に呼び出す
SceneManager のイベントを使うことで、自動的に呼び出すことも可能です。
SceneManager.sceneLoaded += Lang.SceneLoaded_UpdateTexts; SceneManager.sceneUnloaded += Lang.SceneUnloaded_UnloadEntry;
そのほか
言語を増やしたい
Lang の eSelectLang と、テーブルを言語分増やします。
なお、TextMeshProUGUI では予めその言語のフォントを使えるようにする必要があります。
public enum eSelectLang
{
None = 0,
Japanese,
English,
NEW_LANG,
}
static List<LangTable> table = new List<LangTable>()
{
new LangTable("はじめから", "Start", "NEW_LANG"),
new LangTable("つづきから", "Continue”, "NEW_LANG"),
new LangTable("せってい", "Option", "NEW_LANG"),
};
もし、テーブルの日本語と、表示される日本語が違ったら…
起動時にエラーが出るので、修正してください。


AutoLang ではなく、プログラムでテキストを変更したい
「もっとも簡単な」ということでこちらはサンプルに入っていません。
以下、なんとなく Lang 改造方法を記しておきます。
現状のコードに Get メソッド追加
Lang.ChangeLanguage(Lang.eSelectLang.English);
string langText = Lang.Get("はじめから");
public class Lang
{
public static string Get(string jpword)
{
if (dic.ContainsKey(jpword) == false)
{
return "";
}
int langno = (int)selectLang - 1;
if (langno < 0)
{
return "";
}
return dic[jpword].Words[langno];
}
}
一番簡単なのは、Get メソッドを作成する事ですが、ソースコード上にベタ文字列が入ってしまうのは、とても不安です。
enum のサーチキーにより Get するように変更
string langText = Lang.Get(Lang.eSearch.Start);
public class Lang
{
public enum eSearch
{
None,
Start,
}
class LangTable
{
public eSearch SearchKey;
public string[] Words;
public LangTable(eSearch searchKey, params string[] words)
{
SearchKey = searchKey;
Words = words;
}
public LangTable(params string[] words)
{
SearchKey = eSearch.None;
Words = words;
}
}
static List<LangTable> table = new List<LangTable>()
{
new LangTable(eSearch.Start, "はじめから", "Start"),
new LangTable("つづきから", "Continue"),
new LangTable("せってい", "Option"),
};
static Dictionary<eSearch, LangTable> searchDic = new Dictionary<eSearch, LangTable>();
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void init()
{
foreach (LangTable row in table)
{
dic.Add(row.Search, row);
}
}
public static string Get(eSearch searchKey)
{
// searchDic と selectLang から文字列を引っ張る
}
}
サーチ用の enum を定義し、呼び出す方法です。こちらの方がインテリセンスも有効で、入力ミスもないためいいと思います。
プログラムから Get する必要のないテーブルは enum も定義しなくていいようにしていますが、ここは運用次第です。




