【Unity】【Localization】ローカライズした値を適用する二通りのワークフローまとめ

UnityのLocalizationパッケージでローカライズした値を適用する二通りのワークフローをまとめました。

Unity2020.3.15f2
Localization 1.1.1

はじめに

本記事ではUnityのLocalizationパッケージでローカライズした値を適用する二通りの方法についてまとめます。

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

light11.hatenadiary.com

値を適用する二通りの方法

Localizationパッケージには、言語ごとに設定した値をコンポーネントに適用する方法が二通りあります。

一つ目は、Component Localizerと呼ばれるコンポーネントを使用する方法です。
こちらは対象のGameObjectにComponent Localizerをアタッチしてローカライズ用のエントリのキーを選択するという直感的にわかりやすい方法です。

これに対し、Localized Property Variantsという機能を使う方法もあります。
こちらは対象の値を入力した際に自動的にローカライズ用のデータとして登録してくれるという、より自然で簡潔なワークフローを実現するものになっています。

なおこのうち、Localized Property VariantsはUnity2020.3以降でのみ使える機能となっています。
マニュアルのQuick start guideを見ても、Unity2020.3と前と後で記述が変わっていることがわかります。

docs.unity3d.com

docs.unity3d.com

本記事では、実際に文字列をローカライズするワークフローを例にとり、この二つの方法についてまとめます。

準備: Localization Tableを作成する

まずローカライズを行う際にはLocalization Tableを作成する必要があります。

Window > Asset Management > Localization TablesからLocalization Tablesウィンドウを開いて、
対象のLocaleを選択して、TypeにString Table Collectionを選択し、Createをクリックします。

f:id:halya_11:20220301190545p:plain
String Table Collectionを作成

これで各Localeに応じたString Tableアセットと、それらの参照をもつString Table Collectionアセットが作られたら準備完了です。

Component Localizerを使う方法

さてそれではComponent Localizerを使ってTextコンポーネントの文字列をローカライズする方法から見ていきます。

まずシーン上に適当にTextコンポーネントがアタッチされたGameObjectを作成します。
次にTextコンポーネントコンテキストメニューからLocalizeを選択します。

f:id:halya_11:20220301190629p:plain
Localize

するとLocalize String Eventというコンポーネントがアタッチされます。
これがローカライズされた値をTextコンポーネントに伝える役割をするComponent Localizerです。

アタッチされていることを確認したらTable Collectionに先ほど作ったString Tableを選択し、
その後Add Table Entryをクリックして新しいエントリを追加します。

f:id:halya_11:20220301190657p:plain
エントリを追加

すると以下のようにエントリの情報が入力できるようになるため、各値を入力します。

f:id:halya_11:20220301190719p:plain
値を入力

これでローカライズ設定は完了です。
なおString Tableにすでに作成済みのエントリに関してはString Referenceから選択して設定することができます。

f:id:halya_11:20220301190745p:plain
String Reference

Window > Asset Management > Localization Scene Controlsを開いてLocaleを切り替えるとうまく反映されることが確認できます。

f:id:halya_11:20220301190833g:plain
反映を確認

Localized Property Variantsを使う方法

次にLocalized Property Variantsシステムを使う方法について説明します。

まず、Project SettingsからProject Locale Identifierに、プロジェクトで通常開発するときに使われているLocaleを設定します。

f:id:halya_11:20220301190952p:plain
Project Locale Identifier

次に、シーン上に適当にTextコンポーネントがアタッチされたGameObjectを作成します。

さらに、Window > Asset Management > Localization Scene Controlsを開いて、Track Changesにチェックを入れます。
String Tableには適当なテーブルをアサインしておきます。

f:id:halya_11:20220301191033p:plain
Track Changes

この状態で、Active Localeを切り替えながらTextコンポーネントを編集すると、その値がローカライズされた値としてString Tableに自動的に保存されます。

より正確には、Active LocaleProject Locale Identifierと一致しているときには何も起こりません。
Project Locale Identifierと異なるActive Localeが設定された状態でテキストを編集したときに初めてローカライズ値が保存されます。
またこのとき、GameObjectにはGame Object Localizerというコンポーネントが、上述のString Tableがセットアップされた状態でアタッチされます。

f:id:halya_11:20220301191109p:plain
Game Object Localizer

Localeを切り替えるとうまく反映されることが確認できます。

f:id:halya_11:20220301191140g:plain
反映を確認

また、もう一つの機能として、Localization Scene ControlsString TableをNoneにした状態で上記の操作を行うと、ローカライズされた値がString TableではなくGameObjectやシーンにシリアライズされます。

Game Object Localizerを見るとString Tableへの参照を持っていないことが確認できます。

f:id:halya_11:20220301191224p:plain
Game Object Localizer

このように条件に応じて挙動が変わるので若干複雑さを感じますが、実際に使ってみると実用的なワークフローがよく考慮されていることがわかります。

Localized Property Variantsでトラッキングできる値とCustom Tracked Object

さて前節のLocalized Property Variantsは、基本的にはJsonUtilityシリアライズが可能な値を対象にトラッキングすることができます。
例えば自作のMonoBehaviourのstring型のSerializeFieldなどもトラッキングできます。

これに対し、TransformCameraLightなどJsonUtilityによるシリアライズに対応していないコンポーネントについてはCustom Tracked Objectを定義する必要があります。
ただし、TransformRectTransformについてはあらかじめこれが定義されているためトラッキングできます。

Custom Tracked Objectの作り方は以下のマニュアルを参照してください。 AudioSourceAudio Clipをトラッキングするためのスクリプトの例が掲載されています。

docs.unity3d.com

関連

light11.hatenadiary.com

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com