MRが楽しい

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

UniRxの自作したReactivePropertyの項目をInspectorビューに表示する

本日は UniRx の小ネタ枠です。
UniRxの自作したReactivePropertyの項目をInspectorビューに表示する方法を記事にします。

実装サンプル

今回は以下のような HoloMonMode という独自の種別を持つ ReactiveProperty の変数で Inspector ビューへの表示を試します。
・HoloMonModeStatus.cs

using UnityEngine;
using UniRx;

namespace HMProject.HoloMon
{
    /// <summary>
    /// ホロモンモード種別
    /// </summary>
    public enum HoloMonMode
    {
        Standby,
        PlayerTracking,
        TargetTracking,
        Unknown
    }

    public class HoloMonModeStatusSingleton : MonoBehaviour
    {
        /// <summary>
        /// ホロモンモード
        /// </summary>
        [SerializeField, Tooltip("ホロモンモード")]
        private ReactiveProperty<HoloMonMode> p_HoloMonMode
            = new ReactiveProperty<HoloMonMode>(HoloMonMode.Standby);
        
        // ..略..
        
    }
}

このスクリプトをオブジェクトに設定して Inspector ビューを確認します。
すると、以下のように p_HoloMonMode の変数は表示されません。
f:id:bluebirdofoz:20210213230755j:plain

独自のReactivePropertyを作成する

独自の型を持つ ReactiveProperty を Inspector ビューに表示するには新規の ReactiveProperty 型を定義します。
今回は以下のような HoloMonMode の ReactiveProperty を定義しました。
・HoloMonModeReactiveProperty.cs

// Serializable参照のため
using System;

// ReactiveProperty参照のため
using UniRx;

namespace HMProject.HoloMon
{
    /// <summary>
    /// ホロモンモード種別
    /// </summary>
    public enum HoloMonMode
    {
        Standby,
        PlayerTracking,
        TargetTracking,
        Unknown
    }

    /// <summary>
    /// ホロモンモード種別を扱うReactiveProperty
    /// </summary>
    [Serializable]
    public class HoloMonModeReactiveProperty : ReactiveProperty<HoloMonMode>
    {
        public HoloMonModeReactiveProperty()
        {
        }
        public HoloMonModeReactiveProperty(HoloMonMode a_HoloMonMode) : base(a_HoloMonMode)
        {
        }
    }
}

実装サンプルの方で作成したクラスを指定します。
・HoloMonModeStatus.cs

using UnityEngine;
using UniRx;

namespace HMProject.HoloMon
{
    public class HoloMonModeStatusSingleton : MonoBehaviour
    {
        /// <summary>
        /// ホロモンモード
        /// </summary>
        //[SerializeField, Tooltip("ホロモンモード")]
        //private ReactiveProperty<HoloMonMode> p_HoloMonMode
        //    = new ReactiveProperty<HoloMonMode>(HoloMonMode.Standby);
        // ↓
        [SerializeField, Tooltip("ホロモンモード")]
        private HoloMonModeReactiveProperty p_HoloMonMode
            = new HoloMonModeReactiveProperty(HoloMonMode.Standby);
        
        // ..略..
        
    }
}

これで Inspector ビューに変数が表示されるようになります。
ただしこのままだと ReactiveProperty の構造通り、Value 変数を開いて確認する形になります。
f:id:bluebirdofoz:20210213230808j:plain

変数の値をそのまま表示するには InspectorDisplayDrawer を拡張するクラスを作成し、作成したクラスを指定します。
・AddInspectorDisplayDrawer.cs

using UnityEditor;

// InspectorDisplayDrawer参照のため
using UniRx;

namespace HMProject.HoloMon
{
    [CustomPropertyDrawer(typeof(HoloMonModeReactiveProperty))]
    public class AddInspectorDisplayDrawer : InspectorDisplayDrawer
    { }
}

これで通常の変数のように Inspector ビューに変数を表示できるようになりました。
f:id:bluebirdofoz:20210213230819j:plain

準備済みの拡張ReactiveProperty

以下の型については Inspector ビューで表示可能な拡張の ReactiveProperty が予め定義されています。

int:IntReactiveProperty
float:FloatReactiveProperty
long:LongReactiveProperty
byte:ByteReactiveProperty
double:DoubleReactiveProperty
bool:BoolReactiveProperty
string:StringReactiveProperty
Vector2:Vector2ReactiveProperty
Vector3:Vector3ReactiveProperty
Vector4:Vector4ReactiveProperty
Color:ColorReactiveProperty
Rect:RectReactiveProperty
AnimationCurve:AnimationCurveReactiveProperty
Bounds:BoundsReactiveProperty
Quaternion:QuaternionReactiveProperty