ニートが学ぶUniRx 入門編その8

はいどーもこんにちはUniRxなニートです。
今回はこれ。
https://www.slideshare.net/torisoup/uni-rx
「UniRxはこんなところで便利に使えるよー」系の記事でしょうかね。
見ていきます。

Updateを消し去る

これは「ニートが学ぶUniRx 入門編その4」で扱った内容まんまですね。

コンポーネントをストリームでつなぐ

ポーリングは僕もよく使う手法でしたが、これ確かに面倒くさいですし、もっと綺麗な方法がないかなと思っていました。
UniRxを使うとコンポーネント自体をストリーム化してうまい具合に扱えるみたいですね。
今回だとタイマーを作っているようです。
タイマーは普通にObservable.Timerで実装して、Subscribe時にReactivePropertyの値をデクリメントしています。
するとデクリメント時にOnNextが発火するので、別のクラスでReactivePropertyをSubscribeして、今回だとテキストを更新するような作りにしておくわけですね。
ちなみにReactivePropertyの値を外部に公開する場合、ReadOnlyReactivePropertyやらIReadOnlyReactivePropertyやらを使う設計にするのがよさそうです。
外部から値を自由に書き換えられると保守が大変ですからね……。
ただ読み取り専用にする方法はいくつか種類があるらしく、その細かい違いはまだよくわかってません。

タイマを作ってみる

学習用として僕もタイマ処理を書いてみました。

ReactivePropertyを使っていますね。
初期値は30です。
1秒間隔でこのカウントをデクリメントしています。
外部に公開するためにIReadOnlyReactivePropertyのプロパティも用意しています。
サンプルではReadOnlyReactivePropertyという具象クラスが使われていたのですが、そうなっている理由はちょっとよくわかりませんでした。
今回のタイマではIReadOnlyReactivePropertyでも問題がなかったのでこれで行きます。
なおAddToはゲームオブジェクト破棄と一緒にストリームも破棄するためのものです。

先ほど作ったTimerComponentクラスを使っています。
公開プロパティのCountを通じてSubscribeしていますね。
かなり簡単にタイマが作れました。

タイマで詰まった箇所

このタイマを作っているとき、TimerDisplayer側でSubscribeがうまくできませんでした。
その理由はUniRx名前空間をusingしていなかったことでした。
なぜUniRx名前空間をusingする必要があるかと言えば、UniRxは拡張メソッドとして色々用意されているため、UniRx名前空間をusingしておかないと拡張メソッドが使えないからです。
拡張メソッドのことを完全に失念して一時間くらいハマったので、これは気をつけておきたいですね……。

HotとCold

これは「ニートが学ぶUniRx 入門編その7」で扱ったことですね。
これ書いてる途中で判明したのですが、ReactivePropertyはHOTな性質を持つようです。
なのでSubsribeしまくってもOKなんですね。
ようやく得心できました。

uGUIと組み合わせる

このスライドによれば、UniRxのObservableとReactivePropertyを組み合わせるとuGUIがいい感じに扱えるようになるそうです。
ちょくちょく聞くMV(R)Pパターンというやつですね。
理解した限りをまとめると、以下のような感じでしょうか。

・PresenterはModelもViewも知っている
・ModelもViewもPresenterに依存しない
・ModelはReactivePropertyを持っている
・ViewはつまりuGUI

これはあとで調べながら実際に作ってみます。

コルーチンのお話

コルーチンよ、消え去れ!

終わりに

今まで読んだ記事と重複する箇所が随分あったので、復習になってよかったです。
しかしやはりRxは奥が深くてよくわかりません。
引き続き学習を続けたいと思います。

ほなそんな感じでまた。

フォローする