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

はいどーもコルーチンを投げ捨てたいニートですこんばんは。
この記事の学習用サイトは以下のスライドです。
https://www.slideshare.net/torisoup/unity-unirx
例のごとくとりすーぷさんのものですね。
どの解説記事も大変わかりやすいので助かります。
ちなみにですが、このスライドで一番驚いたのはとりすーぷさんが僕と大して年齢変わらないことでした。
ぐやじい。

ダブルクリック判定

このスライドの最初に「ダブルクリック判定できますか?」と聞かれます。
恐らくほとんどのプログラマは「イエス」と答えるでしょう。
ですが同時に「実装はめんどいよね。うん。ほんとめんどい」となると思います。
ところがUniRxを使うとたったの数行で済むと言うのです!

注*ただダブルクリックって細々と考えていくと種類がいくつかあると思うので、それら全てがUniRxで作れるかどうかはよくわかりません。

どうやるのか

ここまで散々UniRxについて学習してきた僕ですが、答えあわせなしではどう書けばいいのかいまいちわかりませんでした。
というわけで答えを見つつコードをドン(スライドのままではないです)。

僕の理解では以下のような意味となります。

最初のthis.UpdateAsObservable()はUpdateメソッドをストリームに変換しています。
で、この中でマウスがクリックされたらOnNextが発火するようになっています。
このストリームをBufferオペレータで「一定個数ごと」にまとめようとしています。
バッファの中身は「200ミリ秒値が観測できなければ=200ミリ秒以内にマウスがクリックされていなければ」という意味です。
要は「200ミリ秒経過」するまでバッファに溜めておき、それから次のオペレータに進みます。
次のオペレータとはすなわちWhereですね。
これで「クリックの回数が2回以上ならば」という条件をつけています。
これは先程バッファでためたものの配列(クリック回数)をカウントして判定しています。
最後にSubscribeで購読していますね。
まとめると「最後にクリックされてから200ミリ秒経過したとき、二回以上クリックされていたら発火」といった程度の意味でしょうか。

ウーン、シンプルなサンプルなのにだいぶん複雑です。

注*学習中ゆえに間違っている可能性ありなので、鵜呑みにはしないでください。

改めてSubscribeとは

SubscribeはC#のイベントで言う+=演算子みたいなもので、例えばUpdateメソッド内でSubscribeメソッドを呼ぶと、無限にストリームが生成されてしまうようです。
なので普通はAwakeかStarでSubscribeするようですね。

Bufferってなんやねん

Bufferは「メッセージを蓄えて特定のタイミングで流す」オペレータのことのようです。
この「特定のタイミング」は何やら色々指定できるようですが、ここでは引数が一つのオーバーロードのものが紹介されていますね(スライドの例)。
まだ理解が曖昧なのですが、例えばBuffer(3)ならば、3つのストリームが流れてくるまで溜め込んで、3つ目でそのストリームの塊をを次のオペレータへと流し込みます。

この場合だとxはIList型になっています。
Countは2で、中身はどちらもHogeですね。

オペレータの紹介

図付きでわかりやすく説明してくれているので、一見の価値あり。
ただ数が多くて一度に覚えることは無理なので、徐々に覚えていきたいですね。
よく使いそうなものとしてRepeatが紹介されています。
これはOnCompletedで終了したストリームを、もう一度Subscribeさせるためのものです。

その他の具体例

UniRxを使えばどんなことができるのか参考になるかなあと思います。
通信系のサンプルは全く試していませんし、他のものについてもコード読んで一回試した程度なので省略。

ReactiveProperty

他の記事でも触れましたが、やはりUniRxで一番最初に目に入るのってコレじゃないですかね。
一言で言うと「Subscribeすることができる変数」なんですが、ほんと便利な香りしかしません。
現在制作中のゲームですが、今からでもUniRx取り入れましょうかねえ……。

終わりに

他にも色々と細かく触れられていましたが、本日は6記事目で力尽きたのでここまでにします。
Rxという考え方は他の言語でも生きると思っているので、もっと使えるようになりたいですねえ……。

めちゃ疲れました。
ほなまた。

フォローする