Localized Property Variants
ノート: この機能を使用するにはバージョン 2020.3 以降の Unity が必要です。
Localized Property Variants システムは、1 つのシーン内で複数のロケールを扱うためのより自然な方法を提供します。Inspector 内やシーンビュー内でコンポーネントのプロパティを直接変更することが可能です。全ての変更は現在アクティブなロケールのバリアントとして記録されます。 このバリアントは、エディターやプレイヤーでロケールを切り替えた時に自動的に適用されます。 以下は、Localized Property の一般的な用途の例です。
- テキストを、ロケール毎に異なる翻訳値やフォント、(UI 内における) 位置を持つように設定する。
- 特定のロケール用のテキストが収まらない場合などに、選択したロケールのコンポーネントに小さな変更を加える。
- 特定のロケールのオーディオ/テクスチャ/スプライトを変更する。
- 追加的なコードを記述せずにカスタムスクリプトをローカライズする。
Localized Property Variants システムは以下をサポートしています。
- 全ての MonoBehaviour あるいは、Unity の Text および TextMeshPro コンポーネントを含む派生クラス。
- トランスフォーム
- RectTransform
カスタムクラスで追加的なコンポーネントがサポート可能です。詳細は Custom Tracked Objects を参照してください。
Localization の設定
コンポーネントを変更すると、Unity は、値を直接コンポーネント内に格納するかプロパティバリアントとして格納します。どのロケールの値をコンポーネント内に直接格納するか定義するには、Project Locale Identifier フィールド (Project Settings > Localization) を設定します。これはデフォルトでは English(en) になっています。任意のロケールが選択可能です。Unity では、ゲームの開発に使用されている言語に設定することを推奨しています。ノート: プロパティが LocalizedString または LocalizedAsset を使用している場合、値は常に関連の String Table または Asset Table 内に格納され、ローカルには格納されません。
Scene Controls の設定
Property Variant System の設定は Localization Scene Controls ウィンドウ (Windows/Asset Management/Localization Scene Controls) で行えます。
プロパティ | 説明 |
---|---|
Active Locale | シーン内で現在プレビューおよび編集されている ロケール です。シーン内でコンポーネントを変更すると、その変更は Active Locale に関連付けられ、ローカルでコンポーネント内に格納されるか、String Table 内または Asset Table 内に格納されている GameObject Localizer コンポーネントの中にバリアントとして格納されます。 |
Track Changes | Active Locale と組み合わせて使用され、プロパティの変更の格納場所を指定します。 |
String Table | 新しい String Property Variant の作成時に使用される String Table Collection です。この値が設定されていない場合、値が String Table 内ではなくローカルに格納されます。ノート: Unity では、翻訳が必要な文字列はローカルに格納しないことを推奨しています。 |
Asset Table | 新しい Asset プロパティバリアントの作成時に使用される Asset Table Collection です。この値が設定されていない場合、アセット参照が Asset Table 内ではなくローカルに格納されます。 |
シーン内の値の変更
シーン内の変更を Localized Property Variant として記録するためには、Track Changes フィールドが有効になっていて、Active Locale が Project Locale 以外のロケールに設定されている必要があります。 これにより、加えられた全ての変更がバリアントとして記録され、Active Locale に関連付けられるようになります。
Inspector 内で、あるいは Undo システムを使用して値を変更すると、Unity が、その変更をプロパティバリアントとして記録するかどうかと、バリアントデータの格納方法を決定します。 Unity は、以下のいずれかの場所にプロパティバリアントを格納します。
Locally - 通常通りにコンポーネント内に値が格納されます。
Local Variant - GameObject Localizer というコンポーネント内に値が格納されます。バリアントの表示と編集は GameObject Localizer コンポーネント内とソースコンポーネント内の両方で行えます。
ゲームオブジェクトの位置の Local Variant
- String Table / Asset Table - String あるいは Asset Table Collection 内に値が格納されます。バリアントの値の表示と編集は、GameObject Localizer、関連の String Table Collection、ソースコンポーネントから行えます。ノート: 新しく値が作成されると、その Entry Name は
<Scene Name>/<Game Object Hierarchy>
という形式になります。名前の値は変更できます。
String Table Variant の例
以下の図は、プロパティが変更された時に、Property Variant System がどのように値の記録方法を決定するかを示しています。
Inspector で Tracked Property を追加する
Track Changes オプションは、シーン内に変更が加えられた時に、ローカライズされたプロパティを自動的に追加および設定します。Inspector のコンテキストメニューを使用して、トラッキングするプロパティを手動で追加し、シーン内に変更を加えずにバリアントの値を設定することもできます。
コンテキストメニューを表示するには、Inspector 内でプロパティのラベルを右クリックします。プロパティの設定に応じて、Inspector に以下のオプションが表示されます。
- Localize Property: プロパティのトラッキングを可能にするために Tracked Property を持つ GameObjectLocalizer を追加します。特定の ロケール でプロパティをオーバーライドするには、Add Variant を選択してください。ロケールにバリアントがないない場合は Project Locale バリアントが使用されます。
- Remove Localized Property: プロパティのトラッキングを停止するには、このオプションを使用してそれを GameObjectLocalizer から削除します。他にトラッキングされているプロパティがない場合は GameObjectLocalizer も削除されます。
- Remove Localized Property Variant: Active Locale が設定されている場合、このオプションは、全ての既存のバリアントを削除してプロパティがデフォルト値を使用するようにします。
Font Size を Localized Property Variant として有効にした後の Inspector のビュー
GameObject Localizer
GameObject Localizer コンポーネントは、その添付先 ゲームオブジェクト の Localized Property Variants の設定を全て格納および適用します。このコンポーネントは、トラッキングされているプロパティがゲームオブジェクトに含まれている場合に自動的に追加されます。
Inspector に Tracked Components (トラッキングされるコンポーネント) と Localized Properties (ローカライズされるプロパティ) が表示されます。プロパティの値は GameObject Localizer の Inspector 内で直接編集できます。プロパティはその Serialized Property Path を使用してトラッキングされます。
バリアントの適用
各 Tracked Object が (GameObject Localizer からリクエストされた時に) そのプロパティバリアントを適用します。これはデフォルトでは、Monobehaviour コンポーネントには JsonSerializerTrackedObject クラスを使用し、Unity コンポーネントには TrackedObject から派生されたカスタムスクリプトを使用します。
JSON Serialization には、Update Type と呼ばれる、Tracked Object に値を適用するためのモードが 2 種類あります。
- Partial モードは、空の JSON ファイルを作成し、その中にプロパティをパッチ適用して Tracked Object に適用します。JSON には新しい値のみが含まれます。
- Full モードは、最初にコンポーネントを JSON 内にシリアル化し、新しい値を JSON 内にパッチ適用して、JSON をオブジェクト内に適用し戻します。この方法はパフォーマンスにより大きな影響を及ぼしますが、(種類に関わらず) List や Array を扱う場合や、Rect などの serializedVersion を含む可能性のあるフィールドを扱う場合には必要です。
Unity は、プロパティバリアントを使用して、実行する Update Type を自動的に決定します。ただし、この値は Inspector 内で手動で設定することもできます。
Tracked Object とプロパティをコードで追加する
Localized Property Variant System には、エディターとランタイム API の両方が含まれています。 詳細は GameObjectLocalizer API ドキュメントを参照してください。
カスタムの Tracked Object
デフォルトでは、Unity はプロパティバリアントの変更を JSON Serialization によって適用します。 Transform、Camera、Light などの Unity コンポーネントは、ランタイムでの JSON Serialization をサポートしていないため、バリアントの適用にカスタムコードが必要となります。Localization パッケージには RectTransform と Transform 用の実装が含まれています。他の Unity コンポーネントをサポートしたい場合はカスタムの Tracked Object を実装する必要があります。
カスタムの Tracked Object は TrackedObject から継承する必要があり、CustomTrackedObject 属性を含んでいる必要があります。
以下の例は、カスタムの Tracked AudioSource を作成して Audio Clip プロパティを変更する方法を示しています。
[Serializable]
[DisplayName("Audio Source")]
[CustomTrackedObject(typeof(AudioSource), false)]
public class TrackedAudioSource : TrackedObject
{
public override AsyncOperationHandle ApplyLocale(Locale variantLocale, Locale defaultLocale)
{
var audioClipProperty = GetTrackedProperty("m_audioClip");
if (audioClipProperty == null)
return default;
// Check if the Asset is stored in an Asset Table
if (audioClipProperty is LocalizedAssetProperty localizedAssetProperty &&
localizedAssetProperty.LocalizedObject is LocalizedAudioClip localizedAudioClip)
{
localizedAudioClip.LocaleOverride = variantLocale;
var loadHandle = localizedAudioClip.LoadAssetAsync();
if (loadHandle.IsDone)
AudioClipLoaded(loadHandle);
else
{
loadHandle.Completed += AudioClipLoaded;
return loadHandle;
}
}
// Check if the Asset is stored locally
else if (audioClipProperty is UnityObjectProperty localAssetProperty)
{
if (localAssetProperty.GetValue(variantLocale.Identifier, defaultLocale.Identifier, out var clip))
SetAudioClip(clip as AudioClip);
}
return default;
}
void AudioClipLoaded(AsyncOperationHandle<AudioClip> loadHandle)
{
SetAudioClip(loadHandle.Result);
}
void SetAudioClip(AudioClip clip)
{
var source = (AudioSource)Target;
source.Stop();
source.clip = clip;
if (clip != null)
source.Play();
}
public override bool CanTrackProperty(string propertyPath)
{
// We only care about the Audio clip
return propertyPath == "m_audioClip";
}
}
Localized Property Variant ではなく Component Localizer の使用が推奨されるケース
Localized Property Variants は、最も柔軟で自然なシーン編集体験を実現し、ローカライゼーションにおけるデフォルトのソリューションとして推奨されます。ただし、絶えず変化する動的要素を扱う場合などには、Component Localizer やカスタムスクリプトのほうが適していることもあります。
例えば、短時間の間に複数回変化する動的テキストを扱う場合は、スクリプトか Component Localizer の使用が有用かもしれません。何故なら変更の適用は、Localized Property Variants が使用する JSON Serialization の使用よりもオーバーヘッドが小さいためです。ただしこの場合も、選択されたロケールで頻繁に変更されない値 (Font、Font Size、Transform プロパティなど) の処理には Localized Property Variants を併用することも可能です。 Component Localizer を使用する動的要素と Localized Property Variants を使用する静的要素を組み合わせると、パフォーマンスの向上に役立つ場合があります。