yotiky Tech Blog

とあるエンジニアの備忘録

Unity - Localization を使ってみる

公式マニュアルにスタートガイドがあるのでTextureとStringについてのローカライズを試す。

Quick Start Guide | Localization | 1.0.0-pre.9

検証環境

  • Unity 2019.4.25f1
  • Addressables 1.18.11
  • Localization 1.0.0-pre.9

Quick Start

0. Install

f:id:yotiky:20210706213305p:plain

“Add package from git URL” を選択して、com.unity.localization を入力してパッケージをインストールする。

f:id:yotiky:20210706213507p:plain

1. Create the Localization Settings

f:id:yotiky:20210706213557p:plain

Project Settings > Localization から "Create" をクリックし、Localization Settings.asset を保存する。

2. Create Locales

f:id:yotiky:20210706213941p:plain

"Locale Generator" をクリックすると、Locale Generator ウィンドウが表示される。

f:id:yotiky:20210706214153p:plain

使用するロケールを選択して "Generate Locales" をクリックする。

f:id:yotiky:20210706214302p:plain

ロケール毎に asset ファイルが生成される。

3. Choose a default Locale

f:id:yotiky:20210706214848p:plain

ロケール判定が上手くできなかった場合に使われるデフォルトのロケールを選択する。

Locale Selector | Localization | 1.0.0-pre.9

4. Texture Localization: Create an Asset Table Collection

f:id:yotiky:20210706215248p:plain

Window > Asset Management > Localization Tables でウィンドウを開く。

f:id:yotiky:20210706215611p:plain

New Table Collection タブで、"Asset Table Collection" を選択して名前をつけて "Create" をクリックする。

f:id:yotiky:20210706215723p:plain

<name> Shared Data.asset<name>.assetと、ロケール毎にassetファイルが生成される。

f:id:yotiky:20210706220319p:plain

Edit Table Collection タブで、"Add New Entry" をクリックしてキーとロケール毎のテクスチャを設定する。

5. Texture Localization: Use the localized Asset

f:id:yotiky:20210706220639p:plain

Scene に追加した Raw Image のコンポーネントを右リクックして、"Localize" をクリックする。

f:id:yotiky:20210706220751p:plain

Update Asset に Raw Image が設定された状態の Localize Texture Event コンポーネントが追加される。

f:id:yotiky:20210706221045p:plain

ローカライズに使用するキーを選択する。

f:id:yotiky:20210706221138p:plain

テーブルの情報が読み込まれる。

f:id:yotiky:20210706221956g:plain

Scene を実行しロケールを選択するとテクスチャが切り替わる。

f:id:yotiky:20210706222116p:plain

Game ビューにプルダウンが表示されていない場合は、 Preferences > Localization > Locale Game View Menu。

7. String Localization: Create a String Table Collection

f:id:yotiky:20210706222303p:plain

New Table Collection タブで、"String Table Collection" を選択して名前をつけて "Create" をクリックする。

f:id:yotiky:20210706222357p:plain

Texture 同様に、<name> Shared Data.asset<name>.assetと、ロケール毎にassetファイルが生成される。

f:id:yotiky:20210706222942p:plain

Edit Table Collection タブで、"Add New Entry" をクリックしてキーとロケール毎の文字列を設定する。
Smart Strings という機能で文字列のフォーマットを使う場合は、"Smart" にチェックを付ける。

8. String Localization: Use String Table Entries

f:id:yotiky:20210706223819p:plain

Scene に追加した Text のコンポーネントを右クリックして、"Localize" をクリックする。

f:id:yotiky:20210706223956p:plain

Update String に Text が設定された状態の Localize String Event コンポーネントが追加される。

f:id:yotiky:20210706224110p:plain

ローカライズに使用するキーを選択する。

f:id:yotiky:20210706224154p:plain

テーブルの情報が読み込まれる。

次のコンポーネントを作成して GameObject に追加し、Format Arguments のサイズを1にしてドラッグ&ドロップする。

public class Apples : MonoBehaviour
{
    public int appleCount = 1;
    //もしくはプロパティ
    //public int appleCount { get; set; } = 1;
}

f:id:yotiky:20210706225614p:plain

Scene を実行しロケールを選択する文字列が切り替わる。

f:id:yotiky:20210706232055g:plain

補足

Scripting

Scripting | Localization | 1.0.0-pre.9

独自のコンポーネントローカライズの文字列を扱う場合は、LocalizedString を持たせて Inspector で設定することで使用することもできる。

public class LocalizedStringWithEvents : MonoBehaviour
{
    public LocalizedString myString;

    void OnEnable()
    {
        myString.StringChanged += UpdateString;
    }

    void UpdateString(string s)
    {
        // ローカライズ文字列で更新する処理
    }
    ....

Format Arguments を使う場合。

        myString.Arguments = new[] { apples };
        myString.StringChanged += UpdateString;

マニュアルには、Locale を選択するドロップダウンのサンプルも記載がある。

public class LocaleDropdown : MonoBehaviour
{
    Dropdown dropdown;

    IEnumerator Start()
    {
        dropdown = GetComponent<Dropdown>();

        yield return LocalizationSettings.InitializationOperation;

        var options = new List<Dropdown.OptionData>();
        int selected = 0;

        for (var i = 0; i < LocalizationSettings.AvailableLocales.Locales.Count; i++)
        {
            var locale = LocalizationSettings.AvailableLocales.Locales[i];
            if (LocalizationSettings.SelectedLocale == locale)
                selected = i;
            options.Add(new Dropdown.OptionData(locale.name));
        }

        dropdown.options = options;
        dropdown.value = selected;
        dropdown.onValueChanged.AddListener(LocaleSelected);
    }

    private void LocaleSelected(int index)
    {
        LocalizationSettings.SelectedLocale = LocalizationSettings.AvailableLocales.Locales[index];
    }
}

Smart String

Format Argumentsの指定

Localize String Eventを使う場合は、Format Argumentsにコンポーネントを選択する必要があるので、メンバ変数名かプロパティ名を使ってTableに定義する。

I have {appleCount:plural:an apple| {} apples}
public class Apples : MonoBehaviour
{
    public int appleCount = 1;
    //もしくはプロパティ
    //public int appleCount { get; set; } = 1;
}

1つのFormat Argumentsで複数のメンバ変数を参照することもできる。

I have {appleCount:plural:an apple| {} apples}. 
I have {bananaCount:plural:a banana| {} bananas}}.

Format Arguments が複数になる場合は、indexを指定する。

I have {appleCount:plural:an apple| {} apples}. 
I have {1:{penCount}:plural:a pen| {} pens}.

f:id:yotiky:20210706233254p:plain

Formatters

plural複数形の書式

シンタックスは次の通り。

{ Number : plural(lang) : singular | plural | more... }

Global Valiables

ローカライズの機能としてグローバル変数も用意されている。

Global Variables | Localization | 1.0.0-pre.9

f:id:yotiky:20210707001408p:plain:w340

Assets > Create > Localization > Global Valiables Group からグループを作成する。

f:id:yotiky:20210707001937p:plain

変数を追加する。

f:id:yotiky:20210707002140p:plain

Localization Settings を開いて、String Database の Smart Fromat の Sources に Global Valiables Source を追加する。

f:id:yotiky:20210707002319p:plain

作成したグループを設定する。

これで以下の書式で利用できるようになる。

私のフロートの値は {global.my-float}
{global.my-string} グローバル変数を使用する方法。

f:id:yotiky:20210707002953p:plain

f:id:yotiky:20210707004707g:plain

スクリプトからグローバル変数を直接書き換える場合は以下のようにする。
Asset 自体の内容も変更されているので注意。

var source = LocalizationSettings.StringDatabase.SmartFormatter.GetSourceExtension<GlobalVariablesSource>();
var param = source["global"]["my-string"] as StringGlobalVariable;
param.Value = "hogehoge";

f:id:yotiky:20210707005208p:plain

f:id:yotiky:20210707005226p:plain

Addressablesに関するあれこれ

  • RemoteLoad にした場合、アプリ起動中にAssetを解放できないので再起動がほぼ必須

Unity - Localization の Addressables の挙動 - yotiky Tech Blog

Unity - Addressables (LocalLoad) で CRC チェックと Bundle Naming Mode の設定 - yotiky Tech Blog

[Unity] 多言語化対応パッケージ Localization のエラーを解決するために行ったこと - JoyPlotドキュメント

Addressables Integration | Localization | 1.0.0-pre.9

Bug - Localization and addressables compatibility is nightmare - Unity Forum

参考リンク