[unity]もっとも簡単な言語対応

大掛かりなゲームであればもっと根底から考えた方がいいですが、簡単なゲームであれば言語対応も簡単にすませたいですよね。
というわけで、紹介しておきます。

ダウンロード

日本語フォントが入っているので、ちょっと大きめです。

使い方

「はじめから」「つづきから」「せってい」の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 も定義しなくていいようにしていますが、ここは運用次第です。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA