Skip to main content
UniRx完全に理解した
2018/12/15
とりすーぷ
自己紹介
• とりすーぷ(@toRisouP)
• 株式会社バーチャルキャスト
• Unityクライアント開発
• 人類を美少女にする仕事をしてます
今回の発表内容
• これのリメイクです
• 発表してから3年半経っているのでいいかげんアップデートしたい
おしながき
• UniRxって何
• できること
• UniRxを構成する三大要素
• サンプル集
• UniRxの便利機能
• UniTask
• おすすめ資料
UniRx is 何
• Reactive ExtensionsのUnity向け実装
• @neueccさん作、MITライセンスで使えるライブラリ
• GitHubまたはUnityAssetStoreから無料で導入可能
何ができるの?
• イベント処理の強化
• イベントメッセージの扱いやハンドリングがとても簡単になる
• 非同期処理の強化
• コルーチンでは表現しきれない処理を簡単に扱えるようになる
• async/awaitの強化
• Unityの非同期系APIをawaitできるようになる
UniRxを構築する三大要素
• Observable
• Operator
• Scheduler
Observable
• UniRxの中核となる存在
• 非同期的に発行されるイベントをコレクションのように扱う
• イベントストリームとか呼ばれたりもする
• 対応するインタフェースはIObservable<T>
(文章で書くときは長いのでIO<T>って略すこともある)
イベントメッセージ
• Observableは3種類のメッセージを扱える
• OnNext
• 通常時のメッセージ。何回でも発行できる。型はIO<T>のT
• OnCompleted
• 正常終了時のメッセージ。1回だけ発行できる。型はUnit
• OnError
• 異常発生時のメッセージ。1回だけ発行できる。型はException
Operator
• Observableのメッセージハンドリングを強化する関数群
• UniRxで一番便利な機能がこれ
• IEnumerable<T>に対する便利関数群がLINQなら、
IObservable<T>に対する便利関数群がOperator
Scheduler
• UniRxにおける時間やスレッドの管理を行う存在
• UniRxが時間が絡んだ処理に強いのはSchedulerがいるから
• デフォルトではMainThreadSchedulerが使用される場合が多い
UniRxの使い方
1. Observableの源流を作る(イベントソース)
2. Operatorを繋げて処理を拡張する
3. OperatorにSchedulerを指定して処理を調整する
4. 2. 3. を繰り返す
5. 末尾でSubscribe()する
おしながき
• UniRxって何
• できること
• UniRxを構成する三大要素
• サンプル集
• UniRxの便利機能
• UniTask
• おすすめ資料
サンプル集
Update()をObservable化
• Update()のタイミングでイベント発行するObservable
• 2通りあるので用途に応じて適切な方を使う
InputイベントをObservable化
• KeyDownをObservable化
• Where Operatorを使う
連打防止Observable
• ThrottoleFirst Operatorを追加
• 最後に発火してから一定時間メッセージを無視するOperator
2度押し検知
• BufferとThrottleの合わせ技
• Buffer : 指定Observableにメッセージが来るまでメッセージを蓄える
• Throttle : メッセージが落ち着いたら最後の1個を流す
コルーチンのObservable化
• コルーチンから結果が取り出せるようになる
ややこしい処理のObservable化
• Zを押している間は1秒間隔だが、Xも同時に押すと0.5秒間隔になる
• コルーチンからObservableに変換したほうが楽
非同期処理のリトライ
• OnErrorRetry Operator
実行スレッドの切り替え
• ObserveOn / ObserveOnMainThread
• 別スレッドに処理を逃したり、メインスレッドに戻したりできる
サンプル集まとめ
• ベースになるObservableを用意すれば、
あとはOperatorの連結でなんとかなる
• Operatorだけで表現できないときはコルーチンも併用するべき
おしながき
• UniRxって何
• できること
• UniRxを構成する三大要素
• サンプル集
• UniRxの便利機能
• UniTask
• おすすめ資料
便利機能
• UniRxには便利な機能がいくつかついている
• ReactiveProperty
• AsyncOperationAwaiter
• ReactiveCommand
• ObjectPool
• ObservableLogger
• MessageBroker
ReactiveProperty
• IObservable + IObserverな変数
• 値を設定するとメッセージが発行される
AsyncOperationAwaiter
• AsyncOperationを
async/awaitで待てる
• コルーチン不要になる
おしながき
• UniRxって何
• できること
• UniRxを構成する三大要素
• サンプル集
• UniRxの便利機能
• UniTask
• おすすめ資料
UniTask
• Unity向けのTask実装
• UniRx同梱
• C# 7以降に変更すると利用可能になる(Unity 2018.3以降標準)
• C#標準Taskと比較して軽量かつUnity向けに最適化されている
UniTaskの作り方
• async/awaitなら返り値をUniTaskにするだけ
UniTaskの作り方
• Func<UniTask>を使う
• 評価タイミングで非同期処理が起動するようになる
• 非同期処理のキャッシュ機構が作れる
UniTaskの作り方
• UniTaskCompletionSourceを使う
• 手続き的に結果を設定できる
UniTaskの付随機能いろいろ
• AsyncOperationのConfigureAwait
• PlayerLoopの任意のタイミングにスイッチ
• Unityコールバックイベントのawait
• スレッドの切り替え
• Observableとの相互変換
• キャンセル処理の強化
UniTaskまとめ
• C# 7以降でUniRxを使うならUniTaskを基本的に使おう
• 素のTaskを使う理由が無い
• コルーチンもだいたいasync/awaitに置換できてしまう
全体まとめ
• UniRxは現代のUnity開発における必需品
• 標準同梱してほしいレベルでスクリプトが強化される
• Observableと周辺機能を覚えよう
• UniTaskとの使い分けもできるようになると良い
おすすめ資料
• neue cc (UniRx作者のneueccさんのブログ)
• http://neue.cc/
• Task vs Observable
• https://niconare.nicovideo.jp/watch/kn3081
• Observableで非同期処理
• https://niconare.nicovideo.jp/watch/kn3434
• ObserverパターンからはじめるUniRx
• https://niconare.nicovideo.jp/watch/kn3454
• UniRxについて書いた記事をまとめてみた
• https://qiita.com/toRisouP/items/48b9fa25df64d3c6a392