MRが楽しい

MRやVRについて学習したことを書き残す

Unity Localizationを使ってプロジェクトをローカライズする その13(スクリプトから Localization の永続変数ソースを参照して変更する)

本日は Unity の技術調査枠です。
Unity Localization を使ってプロジェクトをローカライズする方法を記事にします。
今回は Localization の永続変数ソースを使ってグローバル変数グループを参照する方法です。

前回記事

以下の前回記事の続きです。
bluebirdofoz.hatenablog.com

Persistent Variables source

Persistent Variables source はグローバル変数および LocalizedString ローカル変数と連携して、スクリプトなしでローカライズに引数を指定できる仕組みです。
エディターでは様々なデータ型の引数を構成したり、カスタム引数を作成したりできます。
docs.unity3d.com

Persistent Variables source の設定手順は前述の前回記事を参照ください。
本記事では前回記事で作成したシーンを利用してスクリプトからの参照を試します。

スクリプトから Persistent Variables を参照して変更する

Persistent Variables Source はスクリプトからは以下のコードで参照可能です。

var persistentVariablesSource = LocalizationSettings.StringDatabase.SmartFormatter.GetSourceExtension<PersistentVariablesSource>();

テーブル名と値名を指定して値の参照を取得します。
IVariable 型で取得されるので適切な型に変換する必要があります。

var targetValue = persistentVariablesSource["global(テーブル名)"]["pet(値名)"] as StringVariable

以下のサンプルスクリプトを作成しました。関数を呼び出すと Persistent Variables を参照して値を変更します。
・GlobalVariableChanger.cs

using UnityEngine;
using UnityEngine.Localization.Settings;
using UnityEngine.Localization.SmartFormat.Extensions;
using UnityEngine.Localization.SmartFormat.PersistentVariables;

public class GlobalVariableChanger : MonoBehaviour
{
    public void ChangePersistentVariables()
    {
        // Persistent Variables の参照を取得する
        var persistentVariablesSource = LocalizationSettings.StringDatabase
            .SmartFormatter.GetSourceExtension<PersistentVariablesSource>();
        
        // 指定の変数を型変換して取得する
        var targetValue = persistentVariablesSource["global"]["pet"] as StringVariable;
        if (targetValue is null) return;
        Debug.Log($"Value is {targetValue.Value}");

        // Value で値を代入すると更新のトリガーが発生する
        targetValue.Value = "cat";
    }
}

シーンにボタンを追加し、ボタン押下でサンプルスクリプトの処理が呼び出されれるように設定しました。

シーンを再生して動作を確認します。

ボタンを押下すると変数グループの値が変わり、パネルの文字列が変化しました。
以下のように Persistent Variables の値をスクリプトから変更すると自動で更新のトリガーが走り、画面に変更が反映されます。