【Unity】【Localization】プラットフォームごとにローカライズ値を出し分けるPlatform Overrides

UnityのLocalizationパッケージで、プラットフォームごとにローカライズした値を出し分ける方法についてまとめます。

Unity 2020.3.15f2
Localization 1.2.1

はじめに

Localizationパッケージでは、言語ごとに文字列やアセットを出し分けることができます。
さらにPlatform Overridesという機能を使うと、iOSAndroidといったプラットフォームに応じて文字列やアセットを出し分けることもできます。

本記事ではこのPlatform Overridesの使い方についてまとめます。

Localizationパッケージの基礎知識については別途以下の記事にまとめていますので、必要に応じて参照してください。

light11.hatenadiary.com

基本的な使い方

Platform Overridesは以下手の手順で設定します。

  1. Localization Tablesウィンドウを開いて対象のString Tableを表示する
  2. 当該プラットフォーム用のエントリを作る
  3. Platform Overridesを設定したいエントリのMetadataパネルを開く
  4. MetadataにPlatform Overridesを追加して設定

f:id:halya_11:20220412201023p:plain
設定

上図ではPlatformがAndroidの場合に、HelloEveryoneエントリの値がHelloEveryone - Androidの値で上書きされるように設定しています。
日本語のLocaleについても同様に設定しておきます。

これをAndroidでビルドして再生すると、以下の結果が得られます。

f:id:halya_11:20220412201055j:plain
結果
Platform Overridesが正しく適用されていることを確認できました。

Entry Override Typeについて

さてPlatform Overridesの設定項目の一つに、Entry Override Typeというものがあります。

f:id:halya_11:20220412201118p:plain
Entry Override Type

この節ではこれについてもう少し詳しく見ていきます。

まずEntry Override TypeをEntryにすると、前節のように同じテーブルにあるエントリを指定してそのプラットフォーム用の値とします。

次にEntry Override TypeをTableにした場合を考えます。
この場合、指定したテーブルにある同じ名前のエントリをそのプラットフォーム用の値として使用します。
下図では新しく作ったテーブルにHelloEveryoneエントリのAndroid用のオーバーライドを作成しています。

f:id:halya_11:20220412201209p:plain
違うテーブル

このように同じエントリ名を使うのではなく、違うテーブルの違う名前のエントリを明示的にオーバーライド用として指定したい場合には、Entry Override TypeをTable And Entryとします。

f:id:halya_11:20220412201241p:plain
違うテーブルの違う名前のエントリ

独自のPlatform Overridesを作成する

IEntryOverrideを実装したクラスを作成することで、独自のPlatform Overridesを作成することもできます。
マニュアルには例として、特定の曜日にだけ適用されるPlatform Overridesの実装例が記載されています。

[Serializable]
[Metadata(AllowedTypes = MetadataType.AllTableEntries | MetadataType.StringTableEntry)]
public class DayOverride : IEntryOverride
{
    public LocalizedString myOverride = new LocalizedString();

    public DayOfWeek day = DayOfWeek.Friday;

    public EntryOverrideType GetOverride(out TableReference tableReference, out TableEntryReference tableEntryReference)
    {
        if (DateTime.Now.DayOfWeek == day)
        {
            tableReference = myOverride.TableReference;
            tableEntryReference = myOverride.TableEntryReference;
            return EntryOverrideType.TableAndEntry;
        }

        // Do not override.
        tableReference = default;
        tableEntryReference = default;
        return EntryOverrideType.None;
    }
}

関連

light11.hatenadiary.com

参考

docs.unity3d.com