MRが楽しい

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

UniRxのReactivePropertyの値が変更した場合にコールバック関数を呼び出す

本日は UniRx の小ネタ枠です。
UniRxのReactivePropertyの値が変更した場合にコールバック関数を呼び出す方法を記事にします。
f:id:bluebirdofoz:20210217015618j:plain

前提条件

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

今回はこちらの記事で作成した p_HoloMonMode の値が変更した場合に呼び出す関数の登録を行ってみます。
f:id:bluebirdofoz:20210217015510j:plain

実装サンプル

今回は引数で渡されたコールバック関数を呼び出す形で実現します。
先に HoloMonModeStatus.cs で以下のコールバック用定義と登録用の関数を作成します。
・HoloMonModeStatusSingleton.cs

using UnityEngine;
using UniRx;

namespace HMProject.HoloMon
{
    public class HoloMonModeStatusSingleton : MonoBehaviour
    {
        /// <summary>
        /// 単一インスタンス
        /// </summary>
        private static HoloMonModeStatusSingleton ps_instance;

        /// <summary>
        /// 参照用インスタンス
        /// </summary>
        public static HoloMonModeStatusSingleton Instance
        {
            get
            {
                if (ps_instance == null && ps_searchForInstance)
                {
                    ps_searchForInstance = false;
                    var ps_instances = FindObjectsOfType<HoloMonModeStatusSingleton>();
                    if (ps_instances.Length == 1)
                    {
                        ps_instance = ps_instances[0];
                    }
                    else if (ps_instances.Length > 1)
                    {
                        Debug.LogErrorFormat("Expected exactly 1 {0} but found {1}.", ps_instance.GetType().ToString(), ps_instances.Length);
                    }
                }
                return ps_instance;
            }
        }

        private static bool ps_searchForInstance = true;


        /// <summary>
        /// ホロモンモード
        /// </summary>
        [SerializeField, Tooltip("ホロモンモード")]
        private HoloMonModeReactiveProperty p_HoloMonMode
            = new HoloMonModeReactiveProperty(HoloMonMode.Standby);


        /// <summary>
        /// コールバック用定義
        /// </summary>
        /// <param name="a_HoloMonMode"></param>
        public delegate void HoloMonModeCallback(HoloMonMode a_HoloMonMode);

        // ..略..

        /// <summary>
        /// モード変化時の呼び出し関数登録
        /// </summary>
        /// <param name="a_component"></param>
        /// <param name="a_callback"></param>
        public void SetSubscribe(Component a_component, HoloMonModeCallback a_callback)
        {
            // 呼び出し処理を登録する
            p_HoloMonMode.ObserveOnMainThread().Subscribe(x => a_callback(x)).AddTo(a_component);
        }
    }
}

f:id:bluebirdofoz:20210217015534j:plain

登録する側のコンポーネントは以下のように関数を呼び出して、コールバック関数を登録します。
・TrackingMoveController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

using HMProject.HoloMon;

namespace HMProject.MoveLogic
{
    public class TrackingMoveController : MonoBehaviour
    {

        // ..略..

        /// <summary>
        /// 開始処理
        /// </summary>
        void Start()
        {
            // ..略..

            // ホロモンモード変化時のイベントを登録する
            HoloMonModeStatusSingleton.Instance.SetSubscribe(this, ChangeHoloMonMode);
        }

        // ..略..

        /// <summary>
        /// ホロモンモード変更に合わせた切り替え
        /// </summary>
        /// <param name="a_HoloMonMode"></param>
        public void ChangeHoloMonMode(HoloMonMode a_HoloMonMode)
        {
            Debug.Log("TrackingMoveController ChangeHoloMonMode:" + a_HoloMonMode.ToString());
            switch (a_HoloMonMode)
            {
                case HoloMonMode.PlayerTracking:
                case HoloMonMode.TargetTracking:
                    EnableTrackingStatus();
                    break;
                default:
                    DisableTrackingStatus();
                    break;
            }
        }
    }
}

・NavMeshPathLineRenderer.cs

tions;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

using HMProject.HoloMon;

namespace HMProject.MoveLogic
{
    [RequireComponent(typeof(LineRenderer))]
    public class NavMeshPathLineRenderer : MonoBehaviour
    {

        // ..略..

        /// <summary>
        /// 開始処理
        /// </summary>
        void Start()
        {
            // ..略..

            // ホロモンモード変化時のイベントを登録する
            HoloMonModeStatusSingleton.Instance.SetSubscribe(this, ChangeHoloMonMode);
        }

        // ..略..

        /// <summary>
        /// ホロモンモード変更に合わせた切り替え
        /// </summary>
        /// <param name="a_HoloMonMode"></param>
        public void ChangeHoloMonMode(HoloMonMode a_HoloMonMode)
        {
            Debug.Log("NavMeshPathLineRendere ChangeHoloMonMode:" + a_HoloMonMode.ToString());
            switch(a_HoloMonMode)
            {
                case HoloMonMode.PlayerTracking:
                case HoloMonMode.TargetTracking:
                    p_PathLineRenderer.enabled = true;
                    isDraw = true;
                    break;
                default:
                    p_PathLineRenderer.enabled = false;
                    isDraw = false;
                    break;
            }
        }
    }
}

実際にアプリケーションを起動して、モードの切り替えを発生させてみます。
f:id:bluebirdofoz:20210217015545j:plain

ログを見るとモードが切り替わったときに、登録した各関数が呼び出されていることが分かります。
f:id:bluebirdofoz:20210217015555j:plain