SlideShare a Scribd company logo
1 of 45
Download to read offline
Observerパターンから
はじめるUniRx
2018/09/26
とりすーぷ
自己紹介
• とりすーぷ(@toRisouP)
• 株式会社バーチャルキャスト所属
UniRx
•むずかしい
• どこから手を付けていいかわからない
• 動作原理がわからない
ObserverパターンとUniRx
• UniRxのベースはGoFのObserverパターン
• Observerパターンを覚えればUniRxは8割は理解できる
• UniRxで登場する主要インタフェースの意味を理解しよう
Observerパターン
Observerパターン
• イベントの発行・購読を実現するデザインパターン
• 「Observer」と「Subject」の2者が登場する
ObserverとSubject
• Observer
• 観察者、イベントリスナ、メッセージの受信側
• Subject
• 観察対象、イベントの発行側
• 自分を購読しているObserverを全員記憶している
2者の関係
• 「ObserverがSubjectを観察する」
• 実際は、Subjectが各Observerを管理する
• SubjectがObserverにメッセージを送る
Observerパターンを作ってみよう
シンプルなObserverパターン
• シンプルなObserverパターンを実装してみよう
• UniRxよりもずっとシンプルなもの
つくるもの
• IMyObserver<T>インタフェースと、その実装
• MySubject<T>クラス
IMyObserver<T>インタフェース
• メッセージの受信を表現するインタフェース
Observerの具体的な実装
• PrintObserver
• 受信メッセージをログに出すだけ
MySubject<T>クラス
MySubject<T>クラス(上半分)
MySubject<T>クラス(下半分)
使用例
Observerパターンそのものは簡単
• Observerを登録してメッセージを送るだけ
• 名前と挙動が一致していないところがややこしい
• Subject側がObserverへの参照を持つ(参照関係に注意!)
• 「Observer」という名前のくせに、こいつは受け身
ObserverパターンからUniRxへ
シンプルなパターンからUniRxへ
• 自前実装をUniRxへと置き換えていく
• 置き換えていく途中で、
UniRxでよく使うインタフェースが登場する
UniRx.IObserver<T>
• IMyObserver<T> → UniRx.IObserver<T>
• .NET 4.6のときはSystem.IObservable<T>になる点に注意
UniRx.IObserver<T>
• OnRecieved()がOnNext() に変わった
• OnError()とOnCompleted()が増えた
1つのインタフェースで3種類のメッセージを同時に
扱うことができるようになった!
PrintObserverをIObserver<T>へ
UniRx.Subject<T>
• 下準備
• MySubject<T>のインタフェースを分解する
Observerを扱う部分をインタフェースに切り出す
UniRx.IObservable<T>
• RegisterObserver() が Subscribe() に変わった
• UnRegisterObserver() が IDisposable.Dispose()になった
Subjectのメッセージ送信
• IObserver<T>で代用ができそう!
• OnNext()がそのままメッセージの「入力」に使える
ISubject<T>インタフェース
• 「Subjectである」ということを明示するインタフェース
• SubjectはIObserver<T>とIObservable<T>の両方を実装する
MySubject<T> -> UniRx.Subject<T>
• UniRx.Subject<T> は ISubject<T>を実装している
• 中身はめっちゃ長いので省略
使用例
いつもSubscribe()でラムダ式使ってるじゃん?
• 本来Subscribe()は、IObserver<T>しか引数にとらない
拡張メソッドが用意されているから!
• IObservable<T>に拡張メソッドが用意されている
• デリゲートを渡すと内部でObserverのインスタンスを生成してくれる
拡張メソッドを使った記法
• これでいつものUniRxの感じになった
UniRxのインタフェース
• IObserver<T>インタフェース
• メッセージを受け取る機能が定義されている
• IObservable<T>インタフェース
• IObserver<T>を登録できる機能が定義されている
UniRx is Observerパターン
• 動作原理はまんまObserverパターン
• UniRxの各インタフェースの意味が理解できた
• IObservable<T>の本来の意味
• IObserver<T>の重要性
Operator
こういうことできそうじゃない?
• IObserver<T>とIObservable<T>を両方実装した何かを
作ればメッセージ伝達処理の途中に機能を付け足せない?
Operator
• IObserver<T>とIObservable<T>の2つの実装するもの
• Subject -> Observer間に挟まってメッセージ処理を行う
• ちなみにこういうの「Decoratorパターン」っていいます
Operatorの使用例
Scheduler
Scheduler
• メッセージの処理タイミングや、処理スレッドを管理するもの
• UniRxは基本的にUnityのWaitForSecondsを使って時間を計測する
(MainThreadScheduler)
• WaitForSecondsが嫌なら他のSchedulerに差し替えれば、
時間の計測方法を切り替えられる
Observable
Observable
• 発行されたメッセージは、いくつかのOperatorを経由し、
末端のObserverへと到達する
• このメッセージが伝達される経路・仕組み・機構を
Observableと呼ぶ
• 「ストリーム」って呼ばれてたりもする
Observable
• 「Observable」に対して「Observer」が「Subscribe」する
UniRxを構成する3大要素
• Observable
• メッセージシーケンスを扱う機構
• Operator
• Observableに機能を付与する機構
• Scheduler
• Observableの時間管理・スレッド管理を担当する機構

More Related Content

What's hot

What's hot (20)

Unityでオニオンアーキテクチャ
UnityでオニオンアーキテクチャUnityでオニオンアーキテクチャ
Unityでオニオンアーキテクチャ
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
Unityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTipsUnityでパフォーマンスの良いUIを作る為のTips
Unityでパフォーマンスの良いUIを作る為のTips
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!UE4のためのより良いゲーム設計を理解しよう!
UE4のためのより良いゲーム設計を理解しよう!
 
Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編Unityではじめるオープンワールド制作 エンジニア編
Unityではじめるオープンワールド制作 エンジニア編
 
UniRxでMV(R)Pパターン をやってみた
UniRxでMV(R)PパターンをやってみたUniRxでMV(R)Pパターンをやってみた
UniRxでMV(R)Pパターン をやってみた
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
Unity道場08「絵づくりの基礎」ライティング虎の巻
Unity道場08「絵づくりの基礎」ライティング虎の巻Unity道場08「絵づくりの基礎」ライティング虎の巻
Unity道場08「絵づくりの基礎」ライティング虎の巻
 
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
 
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 

More from torisoup

More from torisoup (13)

MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunityUnityで作ったゲームをDLカードで配布してみた話 #roppongiunity
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
 
ARでVRアバターを表示するシステムを構築しよう
ARでVRアバターを表示するシステムを構築しようARでVRアバターを表示するシステムを構築しよう
ARでVRアバターを表示するシステムを構築しよう
 
【Unity】 Behavior TreeでAIを作る
 【Unity】 Behavior TreeでAIを作る 【Unity】 Behavior TreeでAIを作る
【Unity】 Behavior TreeでAIを作る
 
Photon Cloud ことはじめ
Photon Cloud ことはじめPhoton Cloud ことはじめ
Photon Cloud ことはじめ
 
アバター生放送支援アプリ「アバれぽ」
アバター生放送支援アプリ「アバれぽ」アバター生放送支援アプリ「アバれぽ」
アバター生放送支援アプリ「アバれぽ」
 
コールバックと戦う話
コールバックと戦う話コールバックと戦う話
コールバックと戦う話
 
UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話UnityとNCMBでユーザ管理を実装してみた話
UnityとNCMBでユーザ管理を実装してみた話
 
Task vs Observable
Task vs ObservableTask vs Observable
Task vs Observable
 
UniRxでPUNを使いやすくする
UniRxでPUNを使いやすくするUniRxでPUNを使いやすくする
UniRxでPUNを使いやすくする
 
未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-未来のプログラミング技術をUnityで -UniRx-
未来のプログラミング技術をUnityで -UniRx-
 
みくみくまうすについて&Unity で使えるコーディングノウハウ
みくみくまうすについて&Unity で使えるコーディングノウハウみくみくまうすについて&Unity で使えるコーディングノウハウ
みくみくまうすについて&Unity で使えるコーディングノウハウ
 
Unity講習会(初級)
Unity講習会(初級)Unity講習会(初級)
Unity講習会(初級)
 

Recently uploaded

Recently uploaded (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

ObserverパターンからはじめるUniRx