VR日記その26 -UniRxについて調べてみた

unityでゲームやアプリを作っていると、何かをトリガーにして次の処理をする、とか何かが完了したらn秒後に処理する、などの実装にしばしばつきあたる。ここの部分はコルーチンやUpdate関数を使って実装することが多かったのだが、結構負荷がかかるらしい。頭を悩ませていたところ、UniRxを使って実装すると楽になるという情報を聞いてみたため調べてみた。

早速こんな記事があった。

端的に言うと今回はこちらを読んで勉強しながらまとめていく記事です。

①eventとUniRx

みなさんはC#の標準機能の」1つ、「event」を利用されたことはありますでしょうか?

無いな…今までif文とfor文で何とかしてきた筆者である。

eventは定義した指定した値が変更されたときに呼び出されるらしい。TimeCounterクラスとして定義したeventをTImerVIewで受け取ると。
timeCounter.OnTimeChanged += time =>の部分で変更された値を反映している。

UniRxはこの上位互換らしい。ところでUniRxはデフォルトで用意されているわけではないんですね。

AssetStoreか

GitHubから落としてインストールするらしい。

UniRxに書き換えると、新しくSubject, OnNext, Subscribeが登場してきた。

Subjectがイベント機構の中核となり、Subjectに値を渡す(OnNext)と、Subjectの購読(Subscribe)者にメッセージ渡すことができるシステムとなっている

というわけでとりあえずこの3つが中心に回っていくらしい。

②SubscribeとOnNext

Subscribe : メッセージの受け取り時に実行する関数を登録する
 ※IObservableインターフェースで定義されている

OnNext : Subscribeで登録された関数にメッセージを渡して実行する
 ※IObserverインターフェースで定義されている

あらかじめSubscribeに登録した処理をOnNextで値を渡して発火するらしい。最初の例だと関数を登録した直後に発火している。

最初の例と二回目の例でSubscribeの呼び出し方が異なるが、二回目の呼び出し方(省略形)がよく使われるとのこと。

そこで最初の例を省略形にしてみた。

timerSubjectをpublicにしてIObservableをコメントアウト。
timeCounter.OnTimeChanged.SubscribeをtimeCounter.timerSubject.Subscribeに変更してみると、無事呼び出せた。(画像拡大すれば見えるはず)

画像1

③オペレータとストリーム

実際に使う際は、OnNextで発火してSubscribeで実行する間に様々な処理を挟み込む。これをオペレータといい、一連の処理の流れをストリームというらしい。

用意されているオペレータは沢山あるが、頑張れば自作できるみたい。


この記事分かりやすかったのでお勧めです。
使えるかは分からないけど何となく基本は分かった気がする。全部で5回の記事があるのでまた時間見つけて勉強してみます。

あとLINQも勉強しようと思いました。なんとなく分かるけど使いこなすには程遠い…

この記事が気に入ったらサポートをしてみませんか?