(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発した新作VRゲームがもうすぐ発売です!


UniRx(ReactiveProperty)とOdin(ShowInInspector)を使ったテストプレイやデバッグで重宝する変数【Unity】【UniRx】【Odin】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2019.4.17f1
Odin - Inspector and Serializer 3.0.4
UniRx - Reactive Extensions for Unity 7.1.0


はじめに

今回はUnity用のRxライブラリUniRxと、



Inspectorを圧倒的に使いやすくするOdinを使って



テストプレイやデバッグで重宝する以下のような変数の紹介です!

  • 値の変更を検知出来る
  • プレイ中にInspector上で値を変更可能
  • プログラム的にはprivateで、外部から変更出来ない(取得は可能)
f:id:kan_kikuchi:20210314071544g:plain



ReactiveProperty&ShowInInspector

今回使うのはUniRxのReactiveProperty(値の変更を検知する物)というクラスと、

OdinのShowInInspector(プロパティでもInspectorに表示できる物)という属性です。


実装方法はReactivePropertyの変数のうちIObservableをpublicで公開し、

ReactivePropertyのValueのプロパティ(※setはprivate)をShowInInspectorの属性を付けて実装するだけ。

//変更を監視する値
private ReactiveProperty<int> _num = new ReactiveProperty<int>(7);
  
//IObservableだけを公開し、数値の変化を監視処理を登録できるように
public IObservable<int> NumObservable => _num;
    
//外部から数値を参照、Inspectorから変更するためのプロパティ
[ShowInInspector, InfoBox("※プロパティなので再生してない時に値を変更しても保存されません")]
public int Num {
  get => _num.Value;
  private set => _num.Value = value;
}


後は変更を検知したい所から公開されているIObservableを使って処理を登録するだけ。

//値の変更を検知(Subscribe時にも一度検知される)
_sampleClass.NumObservable.Subscribe(num => Debug.Log($"値の変更 : {num}")).AddTo(gameObject);
f:id:kan_kikuchi:20210314071544g:plain


上記のようにInspectorから値の変更は出来ますが、プログラム的には外部から変更出来ないので、

安全な状態を保ちつつ、テストプレイやデバッグがやりやすくなります。

//値の変更は外部から出来ないので、↓はエラー
_sampleClass.Num = 1;

//ただし値の取得は可能
Debug.Log($"現在の値 : {_sampleClass.Num}");


余談ですがShowInInspectorはStatic、readonly、constな物まで表示可能ですし、

[ShowInInspector]
public static int _staticNum = 5;
  
[ShowInInspector]
public static readonly int _staticReadonlyNum = 5;
  
[ShowInInspector]
public const int _constNum = 5;
f:id:kan_kikuchi:20210316145626j:plain


値を変更出来なくするReadOnlyを併せて、

確認用の値(計算結果でもOK)をInspectorに表示するなんて事も可能です。

private ReactiveProperty<int> _num = new ReactiveProperty<int>(7);

[ShowInInspector, ReadOnly]
public int Speed => _num.Value * 100;
f:id:kan_kikuchi:20210314073413j:plain