本日は UniRx の小ネタ枠です。
UniRxのReactivePropertyの値が変更した場合にコールバック関数を呼び出す方法を記事にします。
実装サンプル
今回は引数で渡されたコールバック関数を呼び出す形で実現します。
先に 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); } } }
登録する側のコンポーネントは以下のように関数を呼び出して、コールバック関数を登録します。
・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; } } } }
実際にアプリケーションを起動して、モードの切り替えを発生させてみます。
ログを見るとモードが切り替わったときに、登録した各関数が呼び出されていることが分かります。