Blog ブログ

UniRx 解説 ReactiveProperty 編

お久しぶりです。

エンジニアの姫野です。
beatmania ⅡDX SP九段受からない日々が続いております。
皆様はいかがでしょうか?
・・・え?音ゲーやらない?

(´・ω・`)

さて、かなり間が空いてしまいましたが、UniRx の解説を進めていきたいと思います。
今回のお題はタイトルにもありますが「ReactiveProperty」です!
では、いってみましょう!

ReactiveProperty とは?

簡単に説明すると、値が変更されたときに通知するストリームが付属した変数です。

値が変更されたときに通知するストリームと言うと、ObserveEveryValueChanged と似たところがあるのですが若干違います。
これについてはまた別の機会に解説させていただきたいと思います。

話を戻しまして。
何かを変更したときに連動して状態が変わるもの、というのはゲームにおいてよく見られると思います。

多人数対戦パズルゲームを例に考えてみましょう。
各プレイヤーはそれぞれスコアを持ち、増加させる。
各プレイヤーの中で一番高いスコアをゲームマスターが持ち、画面に表示しています。
ソースコードにするとこんな感じでしょうか。

さて、気づかれたとは思いますが、このままでは永遠に 1位のスコア:0 と表示され続けます。
なぜなら GameMaster.FirstScore が更新されていないからです。
そこで GameMaster.FirstScore を更新する処理を考えてみましょう。

簡単に考えつくのは2つのパターンです。
1. Player が Score が更新されたときに GameMaster に FirstScore 更新を依頼する
2. GameMaster が各プレイヤーに現在のスコアを問い合わせて一番高いスコアを算出する

1 の場合はどうでしょうか。
ソースコードにしてみましょう。

相互参照することになってしまいました・・・
GameMaster.FirstScore が更新される可能性のある時は Player.Score が更新される時なので、タイミングとしては最善です。
ですが Player 側に FirstScore を更新する義務が発生しており、結合度が高まってしまっています。

2 の場合、ソースコードにすると以下の感じでしょうか。

FirstScore が GameMaster 側で完結しているのは良いのですが、
FirstScore が参照される時、つまり Update が呼び出される度に集計を行うことになります。
更新がかかっていないのにもかかわらず、再度集計しているのでパフォーマンスが悪いです。

結果、どちらも駄目な例となってしまいました。
ではどうするか?

そこで ReactiveProperty の出番です。
ReactiveProperty を使った場合こんな感じになるはずです。

Player がスコア更新のストリームを公開したので、
自然に GameMaster 内部で FirstScore の更新処理ができましたね。
ポーリングがなく、パフォーマンスも気になりません。

Push 型のプログラミングというやつですが、自分のことは自分で完結させ、単方向の参照にすることで依存関係が減ります。
依存関係が減れば変更に強いプログラムになっていくことでしょう。

さっきのコードを更に Reactive にしてみましょう。

実は ReactiveProperty は別のストリームから作ることができるんですね。
もちろんその ReactiveProperty から値が流れてくるタイミングは、更新された時だけです!

これで、FirstScore の更新タイミングのストリームが公開できました。
これにより Update にあった Text の更新処理も消え、
さらに演出クラスが1位のスコアが更新されたタイミングを Observe して演出を表示する、なんてこともできるようになりますね。

まとめ

・ReactiveProperty は値が更新されたことを通知するストリームであり、変数
・ReactiveProperty は別のストリームから作ることができる
・他のクラスがもつパラメータを参照する場合でも集計やポーリングする必要がなく、適切なタイミングで更新できる

制御用フラグなど、そのクラスしか意味を成さないパラメータは ReactiveProperty 化する必要は無いですが、
HP等の変化しうるパラメータは積極的に ReactiveProperty 化し公開することをオススメします!

今回は以上です!
ではまた次回!

(´・ω・`) oO(弐寺のライバル欲しいなぁ・・・)

採用情報

クラウドクリエイティブスタジオではエンジニア募集しております。

面白いゲーム、一緒に作ってみませんか?(今ならVRも・・・?)


採用情報