ReactivePropery(リアクティブプロパティ)は、UniRX の持つ機能の1つです。
利用するには using UniRx; の宣言が必要になります。
using UniRx;
public ReactiveProperty<int> PointReactiveProperty = new ReactiveProperty<int>(0);
ReactivePropery はジェネリック型であるため、<T> の部分には任意の型を指定できます。
今回は totalRewardPoint 変数の代わりとなるため同じ int 型ですが、自作したクラス(例えば、EarnedReward クラス)などを指定することもできます。
ReactivePropery は Value プロパティを持っており、この中に ReactivePropery の情報が代入されています。
そのため、
Value プロパティを利用することで値を参照したり、代入処理をして更新することが出来ます。
今回であれば、int 型の整数の情報、すなわち、totalRewardPoint 変数の代わりとなる値が代入されている部分が Value になります。
<Value プロパティ>
PointReactiveProperty.Value += amount;
もっとも大きな特徴として、
ReactivePropery には「値が更新されると通知を行う」という機能が備わっています。
そのため、ReactivePropery の値が 0 => 10 というように変化をすると、ReactivePropery から通知を受け取る(監視する)処理を施すことで
この処理に付随して、自動的にイベント処理を発生させることが出来ます。
今回は GameData クラスに用意した ReactivePropery の値を、
外部のクラスである UI 管理クラス側にて監視してもらうように設計しています。
ReactivePropery 側が「通知を行う側 = 発行」といい、
ReactivePropery の値の監視を行う側を「通知を受け取る側 = 購読」といいます。
<UIManager クラスが ReactivePropery の通知を受け取る(購読する)側>
// ReactivePropery から通知を受け取る(購読)側の設定をする。ReactivePropery の値が更新されると、通知が届き、この Subscribe メソッドの内容が実行される
GameData.instance.PointReactiveProperty.Subscribe(x => txtPoint.text = GameData.instance.PointReactiveProperty.Value.ToString());
ReactivePropery からの通知を受け取るためには、通知を受け取りたい ReactivePropery に対して、Subscribe メソッドを実装します。
Subscribe メソッドは引数内に、処理の実装、あるいはメソッドの呼び出し処理を実装することにより、
「
ReactivePropery の値が更新されたら、Subscribe メソッドの引数に記述してある処理を自動的に毎回実行する」という処理が動きます。
この機能によって、
「ある状態になったときに、指定してある処理を実行する」というイベント処理を実装することが出来るようになっています。
Subscribe メソッドはラムダ式で処理を記述します。引数を利用しない場合には、(_ => ) とアンダーバーを指定できます。
今回の Subscribe メソッドの処理は (x => txtPoint.text = GameData.instance.PointReactiveProperty.Value.ToString()) ですので、
ReactivePropery の値(現在の獲得ポイント)が変更になったら、その都度、txtPoint.text に GameData.instance.PointReactiveProperty.Value.ToString() の情報を代入するという処理が動いています。
そのため今回の実装では、獲得ポイントを更新したあとに、画面の表示を更新するという処理がなくなっていますが、
この ReactivePropery の機能によって、いままでと同じ処理を自動的に動作するように機能をしています。ここが大きな違いになります。
実装したプログラムを読み直してみてください。
画面の表示を更新する処理は、UIManager クラスの Start メソッドで1回実行されているだけであることが分かると思います。