Unityの多言語対応ツールLocalization Toolsをチョット触ってみた

# はじめに

京都某所のもくもく会に参加していたら、Unityの中の人からUnityの公式Localization Toolsのことを教えていただきました。未だプレビューなので、情報は[こちらのフォーラム](https://forum.unity.com/threads/release-announcements-and-notes.597262/)からです。

今回はver0.5.1を試しています。インストールするには、Packagesフォルダのmanifest.jsonに`"com.unity.localization": "0.5.1-preview"`を追加してください。

# 公式ドキュメント

ver0.5用の公式ドキュメントが[こちら](https://docs.unity3d.com/Packages/com.unity.localization@0.5/manual/Installation.html)にあります。

ほぼここの通りにやれば良いのですが、一部動かなかったりするので、一応やり方を下に書いておきます。

# セットアップ手順
まず、Project Settings のLocalizationへ。そこでLocalization SettingsをCreateして、Active Settingsとして設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/c53883f3-e05d-4eb9-f194-269121642487.png)

すると、Localeセットアップ用の画面になるので、Locale Generatorボタンを押して、言語を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/63892a7a-f6a7-6651-efb1-029d4ebe7b80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/5a6059c9-b0e1-0eed-80dd-c47bf1c1f64c.png)

選んだらGenerate Localesを押す。

すると、以下のような設定ファイルが作られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/3bfa7ffc-1255-c8bd-8ee8-5a6aa3081c21.png)

# 言語を切り替える

ドロップダウンメニューによって言語を切り替えます。以下のスクリプトを作ってください。

元情報は[こちら](https://docs.unity3d.com/Packages/com.unity.localization@0.2/manual/index.html?_ga=2.90222674.997255132.1576307822-149100506.1524631030#4-add-a-locale-selection-menu
)ですが、少し修整してます。　

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.UI;

public class LocaleDropdown : MonoBehaviour
{
    Dropdown dropdown;

    IEnumerator Start()
    {
        dropdown = GetComponent<Dropdown>();
        // Wait for the localization system to initialize, loading Locales, preloading etc.
        yield return LocalizationSettings.InitializationOperation;

        // Generate list of available Locales
        var options = new List<Dropdown.OptionData>();
        int selected = 0;
        for (int 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);
    }

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

これを作ったら、シーン内にDropdownオブジェクトを作って、それにスクリプトをアタッチしてください。シーンを実行すると、Dropdownボタンで上で設定した言語を選べるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/cff992a5-eb8b-cc44-f212-6510c43b7703.png)

# テクスチャを言語によって変える

ここで、公式ドキュメントにある言語によるテクスチャ（ここでは国旗）を変更するテストを行います。まず、各言語ごとにテクスチャを割り当てる必要があります。そのために、Windows->Asset Management->Localization Tablesを選んでLocalization Tableを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/75b35c3c-f701-bbc2-f534-373f03f83fd5.png)

Asset Tablesというウィンドウが開くので、"New Table"を選び、Table Nameを付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/e03d9308-d34a-22e0-ae82-a5fea0018855.png)

名前（今回はTextureTable）を付けたら、Createボタンを押してテーブルを作ってください。すると、下のようなテーブルが出来るので、Add New Entryを押して、Key（例えばFlag）、各言語に対応するテクスチャを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/cb8bb186-667e-d80d-d114-41a4a7de860d.png)

例えばこういう感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/7c66d655-04a9-2e54-fbb2-2eccf80329f7.png)

このテクスチャをRawImageに表示するので、シーンにRawImageを追加してください。それに、以下のスクリプトをアタッチします。

スクリプトは、[こちらの公式チュートリアル](https://docs.unity3d.com/Packages/com.unity.localization@0.2/manual/index.html?_ga=2.90222674.997255132.1576307822-149100506.1524631030#4-add-a-locale-selection-menu])のものを改変しました。

```
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System;
using static UnityEngine.Localization.Components.LocalizedAssetBehaviour<UnityEngine.Texture2D>;

public class TextureLocalizationSample : MonoBehaviour
{
    [SerializeField] public Texture2DAssetReference assetRef;
    RawImage rawImage;

    void Start()
    {
        rawImage = GetComponent<RawImage>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.L))
        {
            StartCoroutine("Load");
        }
    }

    public IEnumerator Load()
    {
        var loadOperation = assetRef.LoadAssetAsync();

        yield return loadOperation;

        if (loadOperation.IsDone)
        {
            Debug.Log("Loaded Texture: " + loadOperation.Result.name);
            rawImage.texture = loadOperation.Result;
        }
    }
}

[Serializable]
public class Texture2DAssetReference : LocalizedAssetReference { };
```

スクリプトをアタッチしたら、AssetRefに割り当てるAssetTable内のKeyをドロップダウンから選べるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/eab5c63c-cbf6-8a18-7625-4d77e16a09cd.png)

一旦選ぶと、こちらでも各言語向けのテクスチャを設定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/941f87ff-16c6-8eae-55b8-8d8667e95239.png)

準備ができたら、シーンを実行しましょう。ドロップダウンメニューで言語を選んでキーボードの"L"を押すと対応する旗が出るはずです。

![Localization.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/3be78adc-98f7-2297-a509-9cfeeeb8d51c.gif)

# テキストをローカライズする

テキストのローカライズも考え方は同じです。テクスチャと同様にLocalization Tableを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/5cbf8ee7-864f-da33-2c75-8c0a842504a6.png)

テキストのローカライズにはLocalize Stringという付属のコンポーネントを使うのが便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58503/68af63b1-4aaa-31ca-1b70-f0fbc2c20fc0.png)

こちらのコンポーネントのString ReferenceでLocalization TableとKeyを選び、Format Argumentsでテキストを表示するゲームオブジェクトを指定します。Update Stringを上図のように設定しておけば、言語を変えたときに勝手にテキストが変わります。