【Unity】UniRxで独自オペレータを作る

UniRx

github.com

 

いつもお世話になっています。

 

オペレータとは

IObservable<T>の拡張メソッドとして用意されたストリームソースを加工するためのクラス

オペレータはIObservable<T>を継承しているので、メソッドチェーンすることができます

 

ざっくりふわふわとした説明は以上

 

作るもの

オペレータの作成のためにはまず2種類のクラスと拡張メソッドを定義する必要があります

 

具体的には

 

  • OperatorObservableBase<T>を継承したストリームをSubscribeするクラス
  • OperatorObserverBase<TSource,TResult>を継承したストリームを加工する処理を書くクラス
  • IObservable<T>をソースとして受け取り、作成したOperatorObservableBase継承クラスの中にソースを流し込んでnew()して返す拡張メソッド

 

です、最初は何言ってるかわからないと思います

 

適当に作っていきます

 

BossObservableをいうものを作ってみようと思います

原理の説明やこれなんのGenericやねんというのはまったく説明しません 

 

 

オペレータが作成された時(newされた時)に

「デキタヨ!」

オペレータの中を処理が通った時に

「トオッタヨ!」

オペレータの中をErrorが通った時に

「アワワワワワ」

ストリームがCompleteした時に

「ボクニマカセテ!」

 

を出力したいと思います、特に意図はありません。

 

まずはBossObservableを定義します

 

gist.github.com

 

これで定義できました。

基本的にObserverOperatorBaseを継承したクラスの

new()

OnNext()

OnError()

OnComplete()

にいろいろな処理を書くことができます

 

ストリーム中にインプットを止めたい・・・などはかなり多い拡張かと思います

 

 

次は拡張メソッドを定義します

 

gist.github.com

 

 

シンプルです、前回のオペレータをsourceとして引数で引っ張ってきて、newして返すだけです

途中の処理は重複回避やnullチェックですが、重複してもよければ省きましょう

 

以上でBossの定義ができました

 

 

これで全てのストリームに対して.Boss()を挟むことができます

やったぜ

 

 

最後に

UniRxに既に定義されているオペレータだけでも処理はできますが、やはり1つラップされた処理があると使う方は非常に楽です

 

書いていれば理解できてくると思うので、ぜひいろいろ試してみてください