変数の値が変化した場合に処理を呼ぶ

変数の値が変化した場合に処理を呼びたい場合には、変数アセットのサブアセットになっているGameEventListenerが利用できます。 これは変数アセットイベントアセットを組み合わせた機能です。

使用例

例えば、キーを押すたびに値が増えるカウンタを作ってみます。 これは変数アセットのページに記載されているTestVariableInt.csをそのまま利用できます。

using UnityEngine;
using SilCilSystem.Variables;

public class TestVariableInt : MonoBehaviour
{
    // 変数アセットをシリアライズしてインスペクタで設定可能に.
    [SerializeField] private VariableInt m_count = default;

    private void Update()
    {
        if (Input.anyKeyDown)
        {
            // キーを押すたびに値を1増やす.
            m_count.Value++;
        }
    }
}

カウンタの値が変更された場合にDebug.Logで表示することを考えます。 イベントとして処理するため、GameEventIntListenerを使用します。 これもイベントアセットのページに記載されているDebugDice.csをそのまま利用できます。 (スクリプト名が適切ではありませんが、サンプルなので気にしないでください。)

using UnityEngine;
using SilCilSystem.Variables;

public class DebugDice : MonoBehaviour
{
    // イベントアセットをシリアライズしてインスペクタで設定可能に.
    [SerializeField] private GameEventIntListener m_onDiceRolled = default;

    private void Start()
    {
        // 実行するメソッドを登録する. 第2引数に指定したGameObjectが破棄されたらイベント解除される.
        m_onDiceRolled.Subscribe(x => Debug.Log(x), gameObject);
    }
}

インスペクタ上で同じ変数を設定すれば、両者の連携が可能になります。 プロジェクトのメニューからint型の変数アセットを作成して設定します。

インスペクタ上で変数とイベントの設定を行う

実装

値が代入された場合にイベントが呼ばれるようになっています。 例えば、boolの値の代入を検出してイベントを呼ぶ実装は以下です。 イベントアセットを参照として持ち、setter内でPublishを呼んでいます。

// 使用する際は具体的な型(この場合はNotificationBool)を知る必要がないのでinternalで実装.
internal class NotificationBool : VariableBool
{
    [SerializeField] private bool m_value = default;
    [SerializeField] private GameEventBool m_onValueChanged = default;

    public override bool Value
    {
        get => m_value;
        set
        {
            m_value = value;
            // setterが呼ばれる度にイベントを呼ぶ.
            m_onValueChanged?.Publish(value);
        }
    }
}

値が変更された場合に処理を呼ぶ機能の実現には以下の2つのステップが必要になります。

  1. NotificationBoolアセットを生成する。
  2. bool型のイベントアセットを生成する。
  3. NotificationBoolアセットのm_onValueChangedに2で生成したアセットを設定する。

これを作成のたびにやるのは面倒なので、エディタ拡張で対応しています。 変数アセットを作成すると自動でイベント用のアセットが生成されます。


ドキュメントトップへ

ダウンロードページへ