大掛かりなゲームであればもっと根底から考えた方がいいですが、簡単なゲームであれば言語対応も簡単にすませたいですよね。
というわけで、紹介しておきます。
ダウンロード
日本語フォントが入っているので、ちょっと大きめです。
使い方
「はじめから」「つづきから」「せってい」の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 も定義しなくていいようにしていますが、ここは運用次第です。