UnityのLocalizationパッケージで、プラットフォームごとにローカライズした値を出し分ける方法についてまとめます。
Unity 2020.3.15f2
Localization 1.2.1
はじめに
Localizationパッケージでは、言語ごとに文字列やアセットを出し分けることができます。
さらにPlatform Overridesという機能を使うと、iOSやAndroidといったプラットフォームに応じて文字列やアセットを出し分けることもできます。
本記事ではこのPlatform Overridesの使い方についてまとめます。
Localizationパッケージの基礎知識については別途以下の記事にまとめていますので、必要に応じて参照してください。
基本的な使い方
Platform Overridesは以下手の手順で設定します。
- Localization Tablesウィンドウを開いて対象のString Tableを表示する
- 当該プラットフォーム用のエントリを作る
- Platform Overridesを設定したいエントリのMetadataパネルを開く
- MetadataにPlatform Overridesを追加して設定
上図ではPlatformがAndroidの場合に、HelloEveryone
エントリの値がHelloEveryone - Android
の値で上書きされるように設定しています。
日本語のLocaleについても同様に設定しておきます。
これをAndroidでビルドして再生すると、以下の結果が得られます。
Platform Overridesが正しく適用されていることを確認できました。
Entry Override Typeについて
さてPlatform Overridesの設定項目の一つに、Entry Override Typeというものがあります。
この節ではこれについてもう少し詳しく見ていきます。
まずEntry Override TypeをEntryにすると、前節のように同じテーブルにあるエントリを指定してそのプラットフォーム用の値とします。
次にEntry Override TypeをTableにした場合を考えます。
この場合、指定したテーブルにある同じ名前のエントリをそのプラットフォーム用の値として使用します。
下図では新しく作ったテーブルにHelloEveryoneエントリのAndroid用のオーバーライドを作成しています。
このように同じエントリ名を使うのではなく、違うテーブルの違う名前のエントリを明示的にオーバーライド用として指定したい場合には、Entry Override TypeをTable And Entryとします。
独自の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; } }