【Unity】Localizationでstringの多言語対応を試してみた

AvatarPosted by

この記事は GRIPHONE Advent Calendar 2021 7日目の記事です。

こんにちは、Unityエンジニアの黒板です。
今回はUnity Localizationを導入して文字列に対して多言語対応を試してみたので、その手順を紹介します。

検証環境

  • Unity 2020.3.19f1
  • Localization 1.0.5
  • Addressables 1.19.9

準備

公式のマニュアルページを参考に導入していきます。

Unityで Window > Package Manager を開き、+ボタンの “Add package from git URL” を選択し、com.unity.localization と入力してインストールします。Localizationをインストールすると、Addressablesも一緒にインストールされます。

インストールが完了したら、Quick Start Guide ページを参考に必要なファイルを生成していきます。

  • Edit > Project Settings > Localization で「Create」ボタンをクリックして設定ファイルを作成
  • 「Locale Generator」ボタンをクリックし、追加したい言語にチェックを入れて「Generate Locales」ボタンをクリック
  • Window > Asset Management > Localization Tables を開き、String Table Collectionを任意の名前で生成する。

検証

今回は日本語と英語にのみチェックを入れて試しました。
Tableには任意のKeyに対応する、出し分けたい文字列をそれぞれJapaneseとEnglishに入力していきます。

生成したString Table Collection

再生して確認するために、以下のような設定ポップアップを作成します。

例:SettingPopup

ポップアップのタイトルに使用している「TextMeshPro – Text」コンポーネントの左上のメニューから「Localize」を選択すると、「Localize String Event」というコンポーネントが追加されます。
テーブルに追加したKeyをプルダウンで選択することで、言語設定に応じて文字列をテーブル参照して動的に変更してくれるようになります。

Localize String Eventの設定

DropDownのスクリプトには、値の変更時に言語設定を変える実装をしておきます。

private void ChangeLanguage(int dropdownValue)
{
    switch (dropdownValue)
    {
        case 0:
            LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[0];
            break;
        case 1:
            LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[1];
            break;
    }
}

再生してDropDownを切り替えることで、動的にポップアップのテキストが切り替わることが確認できるようになりました。

ランタイムでの切り替え時の表示

エディタでの再生中はGameビューの左上に言語設定のプルダウンが出ているため、DropDownの実装をしなくてもstringが動的に変わる様子を確認することができます。

注意点

Quick Start Guide ページの最後にも記載がありますが、Addressableのアセットをローカルから読み込んで動作確認をする場合、Window > Asset Management > Addressable Assets > Groups を開いてビルドする必要があります。Addressableを積極的に使いたくない場合は別の方法でテーブルを読み込む方法を検討してもいいかもしれません。

補足

一つのテーブルに大量のEntryを登録すると管理が大変になりそうなので、文字列の用途に応じて細かくテーブルを分割するといいのかなと感じました。

テキストコンポーネントが参照しているテーブルのKeyを動的に変更したい場合は、以下のようにスクリプトから変更することができます。

[SerializeField]
private LocalizeStringEvent _localizedStringEvent;
public void SetTableKey(string key)
{
    _localizedStringEvent.StringReference.TableEntryReference = key;
}

また、smart string の仕組みを使うことで、文字列の中で簡単な条件判定や、変数の代入ができるようになります。

まとめ

多言語対応を試すために、Unity – Localization を導入して試してみました。
今回は紹介していませんが、stringだけでなくspriteやaudioに対してもLocalizeをすることができるようです。
かなり簡単に導入することができ、使い勝手もいいので、一度試してみてはいかがでしょうか。