SlideShare a Scribd company logo
1 of 56
Copyright © 2018 TIS Inc. All rights reserved.
戦略技術センター
大島昇時
緩く触って覚える ゼロからしっかり覚える
Copyright © 2018 TIS Inc. All rights reserved.
自己紹介
名前 : 大島昇時
ハンドル : さんすうP @Sansuusetto
所属 : TIS株式会社 戦略技術センター
1
Copyright © 2018 TIS Inc. All rights reserved.
・三菱のグループ会社で、組み込み系エンジニア約4年
・映像系の中小で、マネージャ、映像制作、VRゲーム制作約3年
・TISに2018/02入社。xRの研究開発を行う
2
経歴
Copyright © 2018 TIS Inc. All rights reserved.
Agenda
導入編
・UniRxとは
・UniRxで出来ること
基本編
・Subject, OnNext, Subscribe
・Lesson_01
・ストリーム
・オペレータ
・Lesson_02
応用編
・Lesson_03
・Lesson_04
3
Copyright © 2018 TIS Inc. All rights reserved.
導入編
4
Copyright © 2018 TIS Inc. All rights reserved.
はじめに
UniRxは非常に便利なライブラリです。
ただし、銀の弾丸的な効果を期待しないでください。
突然設計がきれいになったり、生産性が上がったりは
しません。
UniRxを使いこなし、有効なパターンを学ぶことで、きれい
な設計で高い生産性を発揮することが出来るようになります。
とても便利なライブラリなので、まずはUniRxで出来ること
を知り、興味を持って触ってみましょう!
5
Copyright © 2018 TIS Inc. All rights reserved.
ハンズオン資料
イベントページ
https://techcircle.connpass.com/event/96518/
パワポ資料
HandsOnのProject
https://github.com/sansuu/UniRxHandsOnVol1
6
Copyright © 2018 TIS Inc. All rights reserved.
UniRxとは
neueccさんが作成された(現在もアップデート中)Unity向けの
ReactiveExtensions (*1) ライブラリ。
UnityAssetStoreにて、無料でダウンロード可能。
*1:Rx(ReactiveExtensions)
C#向けの非同期処理ライブラリ。
Rx ≒ event
機能的にはeventの上位互換。
7
Copyright © 2018 TIS Inc. All rights reserved.
UniRxで出来ること
下記は、UniRxでできることのほんの一部です。
・メソッドチェーンでイベントに対する処理を美しく書ける
・PureClass(*1)でUpdate処理を実行できる
・PureClassでCoroutineを実行できる
・Coroutine使わなくてもTimer処理ができる
・変数を触っている感覚でイベントの配信が実装できる
・uGUIのイベント処理が非常に簡潔に書ける
・イベントの購読側で、イベントに対するフィルタをかけるのが
得意(Where,Skip,Repeat,Select...)
・複数のイベントを合成したり、一つのイベントを
分岐させたりできる
*1:MonoBehaviourを継承していないClass
8
Copyright © 2018 TIS Inc. All rights reserved.
UniRxでコードが簡潔に書ける例
9
<お題>
アプリ立ち上げた5秒後以降、毎秒ログを出力する。
15秒経過後はログ出力を停止する。
Copyright © 2018 TIS Inc. All rights reserved.
UniRxを使わない記述例
10
Copyright © 2018 TIS Inc. All rights reserved.
UniRxでの記述例
11
Copyright © 2018 TIS Inc. All rights reserved. 12
どうでしょうか?
無駄なメソッドが減って、コードが簡潔になりましたね。
まずは、なんかUniRx便利そうだなーというのを
感じていただけると嬉しいです。
Copyright © 2018 TIS Inc. All rights reserved.
基本編 ― Subject, OnNext,
Subscribe ―
13
Copyright © 2018 TIS Inc. All rights reserved.
イベントの基本
UniRxはイベントの拡張です。
以下の図は基本的なイベントの概念なので覚えておきましょう
14
Subject
Subscribe
観察者A
(Observer)
観察者B
観察者C
Subject
Notify
観察者A
(Observer)
観察者B
観察者C
Copyright © 2018 TIS Inc. All rights reserved.
単語を覚えよう
15
単語 直訳
Subject 主題
Observable 観察可能
Observer 観察者
Subscribe 購読する
UniRxを覚える上で、避けては通れない頻出単語がありま
す。とりあえずこれだけは覚えておきましょう。
Copyright © 2018 TIS Inc. All rights reserved.
eventとUniRx
16
結果は同じ
基本的な書き方は、大きく変わらない
event UniRx
Copyright © 2018 TIS Inc. All rights reserved.
UniRxの基本構文(SubscribeとOnNext)
17
Subjectの定義
Subjectの購読+受信時の振る舞い定義
Observerにメッセージを流す
Copyright © 2018 TIS Inc. All rights reserved.
Subjectってなに?
18
IObserverとIObservableを実装したClass。
SubjectにOnNext等で値を渡すことで、
Subjectの購読者(Observer)にメッセージを通知する。
OnCompleted
OnError
OnNext
Subscribe
Subject
IObserver IObservable
図で表すとこう
Copyright © 2018 TIS Inc. All rights reserved.
Subjectってなに?
19
Subject
Subscribe
観察者A
(Observer)
観察者B
観察者C
Subject
OnNext
OnError
OnCompleted
観察者A
(Observer)
観察者B
観察者C
前述の図で表すと以下のようになる。
Copyright © 2018 TIS Inc. All rights reserved.
とりあえず自分で作ってみよう
20
SubjectがUniRxの基本と説明しましたが、深堀すると実は
結構難しい概念です。(Hot,Cold,スケジューラ等)
今回はその辺りすっ飛ばして、とりあえず触ってみましょう。
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_01
21
以下をSubjectとObserverの2つのClassに分解する。
「Assets/UniRxHandsOn/Projects/02_Lesson/01_Lesson_01」
以下にScene及びClassが格納されているので、それを利用すること
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_01― 解答例 ―
22
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_01― 解説 ―
23
Subjectそのものを外部に公開した場合、
外部からSubjectそのものを触れてしまう
ので、ちゃんとカプセル化しましょう
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_01― Betterな解答例 ―
24
Point
Subjectは外部に公開せず、
IObservableのInterfaceを公開する
Copyright © 2018 TIS Inc. All rights reserved.
OnCompletedとOnError
25
OnCompleted
OnError
OnNext
Subscribe
Subject
IObserver IObservable
IF 役割
OnCompleted ストリームの停止及び完了通知
OnError ストリームの停止及びエラー通知
OnNext メッセージの変化通知
Copyright © 2018 TIS Inc. All rights reserved.
OnCompletedの挙動
26
OnCompleted, OnErrorを通知した場合、
以降のOnNextは通知されない
Copyright © 2018 TIS Inc. All rights reserved.
OnCompleted, OnErrorの振る舞いを定義す
る
27
Copyright © 2018 TIS Inc. All rights reserved.
SubscribeIFの定義
28
Copyright © 2018 TIS Inc. All rights reserved.
基本編 ― ストリーム ―
29
Copyright © 2018 TIS Inc. All rights reserved.
ストリームって?
30
Rxで扱うメッセージの流れのこと。
メッセージは後述のオペレータによって加工され、
Subscribeした際に登録した処理を行う。
メッセージ Subject 加工 処理
上記メッセージの流れをストリームという
Copyright © 2018 TIS Inc. All rights reserved.
ストリームって?(コードで)
31
①メッセージをストリームに流す
②Subscribe時に登録した処理を行う
Copyright © 2018 TIS Inc. All rights reserved.
ストリームソース
32
メッセージを発行するソースとなる物をストリームソースと
呼ぶ。
Rxではストリームソースを用意しないと何も始まりません。
以下はUniRxにおけるストリームソースの一部です。
・Subject
・ReactiveProperty
・UniRx.Triggers~
Copyright © 2018 TIS Inc. All rights reserved.
ストリームソース ―ReactiveProperty―
33
変数にSubjectの機能を追加したもの。
値の変更を通知してくれる変数みたいなもの。
非常に使い勝手が良いので、覚えておきましょう。
Copyright © 2018 TIS Inc. All rights reserved.
ストリームソース ―ReactiveProperty―
34
ReactivePropertyのValueを変更した時点で
ストリームにメッセージが流れる
Subject→ReactiveProperty
IObservable→IReadOnlyReactiveProperty
に変更しただけ
購読側は基本的に変わらない
Copyright © 2018 TIS Inc. All rights reserved.
ストリームソース ―ReactiveProperty―
35
先ほどのコードを実行すると、実行結果は下記のようになり
ます。
ReactivePropertyは、Subscribe時に必ず値をPushする
設計となっているため注意が必要です。
これを無視したい場合、後述のオペレータが活躍します
Copyright © 2018 TIS Inc. All rights reserved.
基本編 ― オペレータ ―
36
Copyright © 2018 TIS Inc. All rights reserved.
オペレータって?
37
ストリームに流れるメッセージを加工するための機能。
UniRxにはオペレータが大量に用意されています。
以下はほんの一部。
オペレータ できること
Where 条件を満たすメッセージを通す
Select メッセージを変換する
Skip メッセージを指定数スキップする
Take ストリームを先頭から指定した件数までで切る
Copyright © 2018 TIS Inc. All rights reserved.
オペレータとメソッドチェーン
38
オペレータは下記の様にメソッドチェーンで繋ぐ事ができま
す。
それは、下記の様にすべてのオペレータが、IObservable
の拡張メソッドとして定義され、IObservableを返す設計
となっているからです。
上記の記法により、Where<T>が、
IObservableの拡張メソッドとして定義される
Copyright © 2018 TIS Inc. All rights reserved.
IObservableのIF
39
つまり、IObservableのIFはSubscribeだけでなく
実体としては大量のオペレータIFを定義しているということ
OnCompleted
OnError
OnNext
Subscribe
Where
Select
Skip
Take
・
・
・
Subject
IObserver IObservable
OnCompleted
OnError
OnNext
Subscribe
Subject
IObserver IObservable
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_02
40
以下のストリームから、偶数(0を除く)の2乗をログ出力す
るObserverをオペレータを用いて作成する
「Assets/UniRxHandsOn/Projects/02_Lesson/02_Lesson_02」
以下にScene及びClassが格納されているので、それを利用すること
実行結果
(以降も続く)
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_02― 解答例 ―
41
Copyright © 2018 TIS Inc. All rights reserved.
休憩
42
Copyright © 2018 TIS Inc. All rights reserved.
応用編
43
Copyright © 2018 TIS Inc. All rights reserved.
uGUIイベントをストリームに変換する
44
下記の様にして、uGUIイベントをストリームに変換するこ
とができる。
IObservable同様にUnityEventの拡張メソッドとして定義されている
onClick(UnityEvent)をストリームに変換
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_03
45
uGUIイベントをストリームに変換し、下記の機能を作成す
る。
Sliderの値を表示する
DropDownListで選んだColorを
表示する
タイマーログ停止
タイマーログ開始
「Assets/UniRxHandsOn/Projects/02_Lesson/03_Lesson_03」
以下にScene及びClassが格納されているので、それを利用すること
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_03 ― 解答例 ―
46
各UnityEventをストリームに変換
してuGUIに対する処理を行う
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_03 ― 補足 ―
47
1秒ごとにストリームに
メッセージを流すストリームソース
Timer停止のため、
ストリームを解放する
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_04
48
UniRxを利用して、プレイヤーのコントロール機能を作成す
る。
プレイヤーコントロールの仕様
・アローキーで前後左右移動する(走る)
・スペースキーでジャンプする
・「C」キーでしゃがむ(しゃがみ歩き可能)
・LeftShiftキーで歩く
「Assets/UniRxHandsOn/Projects/02_Lesson/04_Lesson_04」
以下にScene及びClassが格納されているので、それを利用すること
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_04
49
参考動画
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_04 ― 前提 ―
50
本演習では、StandardAssetsのClassをUniRx化したClass
にて、キャラクターの移動処理(Model)を行う。
移動量及び、状態を受け取
るIFとなっている
毎フレーム移動量及び、状態を投げる仕様のため、
Inputの状態を常に最新に更新する必要がある
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_04 ― 解答例 ―
51
Copyright © 2018 TIS Inc. All rights reserved.
Lesson_04 ― 解説 ―
52
UpdateAsObservableは毎フレーム
ストリームにメッセージを流す
ストリームソース
Select内でInputを取得することで
true/false何れの場合でもストリー
ムにメッセージを流せる
Copyright © 2018 TIS Inc. All rights reserved.
まとめ
53
・ストリームに流れるメッセージの種類は下記の3種類
OnNext, OnError, OnCompleted
・ストリームにオペレータを挟むことで、メッセージを
加工できる
・IObservableはIFの拡張により、メソッドチェーンで
繋げることができる
・上記をうまく使うことで、どの様な条件で何をしたいか
明確なコードとなり、可読性が向上する
Copyright © 2018 TIS Inc. All rights reserved.
参考資料
54
敬称略
• neue cc blog(neue cc)
• UniRx入門シリーズ 目次(torisouP)
THANK YOU

More Related Content

What's hot

Game Creators Conference 2019 Takashi Itai
Game Creators Conference 2019 Takashi ItaiGame Creators Conference 2019 Takashi Itai
Game Creators Conference 2019 Takashi ItaiTakashi Itai
 
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014 杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014 Maki Sugimoto
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...エピック・ゲームズ・ジャパン Epic Games Japan
 
任天堂の呪いとナラティブについてバンナム編
任天堂の呪いとナラティブについてバンナム編任天堂の呪いとナラティブについてバンナム編
任天堂の呪いとナラティブについてバンナム編Kawamura Yasuhisa
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得Reimi Kuramochi Chiba
 
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンスLivesense Inc.
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介torisoup
 
自己組織化ゲーム
自己組織化ゲーム自己組織化ゲーム
自己組織化ゲームKiichi Kajiura
 
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of VeinTokoroten Nakayama
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)mosa siru
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理torisoup
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Masa Tadokoro
 
4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗toshihiro ichitani
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解したtorisoup
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 

What's hot (20)

Game Creators Conference 2019 Takashi Itai
Game Creators Conference 2019 Takashi ItaiGame Creators Conference 2019 Takashi Itai
Game Creators Conference 2019 Takashi Itai
 
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014 杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
杉本真樹【インセンティブプレゼンテーション】 Incentive Presentation by Maki Sugimoto MD. August 2014
 
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...  そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
そう、UE4ならね。あなたのモバイルゲームをより快適にする沢山の冴えたやり方について Part 2 <Texture Streaming, メモリプロ...
 
任天堂の呪いとナラティブについてバンナム編
任天堂の呪いとナラティブについてバンナム編任天堂の呪いとナラティブについてバンナム編
任天堂の呪いとナラティブについてバンナム編
 
エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得エンジニアから飛んでくるマサカリを受け止める心得
エンジニアから飛んでくるマサカリを受け止める心得
 
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
学生時代に知っておきたかったWeb技術の学び方の学び方 | リブセンス
 
Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介Unity開発で使える設計の話+Zenjectの紹介
Unity開発で使える設計の話+Zenjectの紹介
 
Epic Online Services でできること
Epic Online Services でできることEpic Online Services でできること
Epic Online Services でできること
 
自己組織化ゲーム
自己組織化ゲーム自己組織化ゲーム
自己組織化ゲーム
 
UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編UE4における大規模背景制作事例 最適化ワークフロー編
UE4における大規模背景制作事例 最適化ワークフロー編
 
Startup Science ①
Startup Science ①Startup Science ①
Startup Science ①
 
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
心理的安全性と、Veinの紹介 Psychological safety and introduction of Vein
 
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
多機能ボイチャを簡単に導入する方法
多機能ボイチャを簡単に導入する方法多機能ボイチャを簡単に導入する方法
多機能ボイチャを簡単に導入する方法
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
 
4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗4つの戦犯から考えるサービスづくりの失敗
4つの戦犯から考えるサービスづくりの失敗
 
インタフェース完全に理解した
インタフェース完全に理解したインタフェース完全に理解した
インタフェース完全に理解した
 
世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト世界最強のソフトウェアアーキテクト
世界最強のソフトウェアアーキテクト
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 

Similar to UniRxHandsOnVol1

HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9Shoji Oshima
 
RT ミドルウェアの IoT プラットフォームへの適用
RT ミドルウェアの IoT プラットフォームへの適用RT ミドルウェアの IoT プラットフォームへの適用
RT ミドルウェアの IoT プラットフォームへの適用Device WebAPI Consortium
 
IoT共創ラボ発表資料_TIS_20180327
IoT共創ラボ発表資料_TIS_20180327IoT共創ラボ発表資料_TIS_20180327
IoT共創ラボ発表資料_TIS_20180327Shingo Mori
 
ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)aitc_jp
 
xRLT02_Holoで大量にモデルを出してみる
xRLT02_Holoで大量にモデルを出してみるxRLT02_Holoで大量にモデルを出してみる
xRLT02_Holoで大量にモデルを出してみるShoji Oshima
 
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-imatrix_share
 
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例Amazon SageMakerを使った機械学習モデル管理運用システム構築事例
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例Seongduk Cheon
 
2018年12月15日 AITC女子会 会話の記録と分析
2018年12月15日 AITC女子会 会話の記録と分析2018年12月15日 AITC女子会 会話の記録と分析
2018年12月15日 AITC女子会 会話の記録と分析aitc_jp
 
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用Daiyu Hatakeyama
 
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例秀 齊藤
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotNobuyuki Matsui
 
JTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTJTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTNobuyuki Matsui
 
ソフトウェアベンチャーのサポートエンジニア
ソフトウェアベンチャーのサポートエンジニアソフトウェアベンチャーのサポートエンジニア
ソフトウェアベンチャーのサポートエンジニアHideto Masuoka
 
Enterprise hacknight 1-igarashi
Enterprise hacknight 1-igarashiEnterprise hacknight 1-igarashi
Enterprise hacknight 1-igarashiTomohiro Igarashi
 
20190313_SDGsや社会課題にxRはどう活かせるか
20190313_SDGsや社会課題にxRはどう活かせるか20190313_SDGsや社会課題にxRはどう活かせるか
20190313_SDGsや社会課題にxRはどう活かせるかShingo Mori
 
20180130 設計イベント
20180130 設計イベント20180130 設計イベント
20180130 設計イベントAtsushi Takayasu
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①Yahoo!デベロッパーネットワーク
 
Netadashi Meetup #6 20170629
Netadashi Meetup #6 20170629Netadashi Meetup #6 20170629
Netadashi Meetup #6 20170629Shigeki Morizane
 

Similar to UniRxHandsOnVol1 (20)

Extreme Management Center を活用したネットワークの見える化
Extreme Management Center を活用したネットワークの見える化Extreme Management Center を活用したネットワークの見える化
Extreme Management Center を活用したネットワークの見える化
 
HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9HoloLens参考書読書会 vol9
HoloLens参考書読書会 vol9
 
RT ミドルウェアの IoT プラットフォームへの適用
RT ミドルウェアの IoT プラットフォームへの適用RT ミドルウェアの IoT プラットフォームへの適用
RT ミドルウェアの IoT プラットフォームへの適用
 
IoT共創ラボ発表資料_TIS_20180327
IoT共創ラボ発表資料_TIS_20180327IoT共創ラボ発表資料_TIS_20180327
IoT共創ラボ発表資料_TIS_20180327
 
ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)
 
xRLT02_Holoで大量にモデルを出してみる
xRLT02_Holoで大量にモデルを出してみるxRLT02_Holoで大量にモデルを出してみる
xRLT02_Holoで大量にモデルを出してみる
 
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-
「未知の脅威」を検出するために -Securitydays2015 imatrixセミナー@KITTE-
 
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例Amazon SageMakerを使った機械学習モデル管理運用システム構築事例
Amazon SageMakerを使った機械学習モデル管理運用システム構築事例
 
2018年12月15日 AITC女子会 会話の記録と分析
2018年12月15日 AITC女子会 会話の記録と分析2018年12月15日 AITC女子会 会話の記録と分析
2018年12月15日 AITC女子会 会話の記録と分析
 
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用
AI for Media 2018 Update セミナー: 株式会社ユニゾンシステム: スピーチ AI を活用した文字起こしプラットホームの活用
 
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例
国内外AIコンペティションからみるAI技術者のキャリアパスの潮流およびAIコンペサイトSIGNATEにおけるAWS活用事例
 
Jazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & RobotJazug-8th: Azure AKS & FIWARE & Robot
Jazug-8th: Azure AKS & FIWARE & Robot
 
JTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoTJTF2018 FIWARE x robot x IoT
JTF2018 FIWARE x robot x IoT
 
ソフトウェアベンチャーのサポートエンジニア
ソフトウェアベンチャーのサポートエンジニアソフトウェアベンチャーのサポートエンジニア
ソフトウェアベンチャーのサポートエンジニア
 
Enterprise hacknight 1-igarashi
Enterprise hacknight 1-igarashiEnterprise hacknight 1-igarashi
Enterprise hacknight 1-igarashi
 
20190313_SDGsや社会課題にxRはどう活かせるか
20190313_SDGsや社会課題にxRはどう活かせるか20190313_SDGsや社会課題にxRはどう活かせるか
20190313_SDGsや社会課題にxRはどう活かせるか
 
20180130 設計イベント
20180130 設計イベント20180130 設計イベント
20180130 設計イベント
 
リースまるみえくん
リースまるみえくんリースまるみえくん
リースまるみえくん
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション①
 
Netadashi Meetup #6 20170629
Netadashi Meetup #6 20170629Netadashi Meetup #6 20170629
Netadashi Meetup #6 20170629
 

UniRxHandsOnVol1

  • 1. Copyright © 2018 TIS Inc. All rights reserved. 戦略技術センター 大島昇時 緩く触って覚える ゼロからしっかり覚える
  • 2. Copyright © 2018 TIS Inc. All rights reserved. 自己紹介 名前 : 大島昇時 ハンドル : さんすうP @Sansuusetto 所属 : TIS株式会社 戦略技術センター 1
  • 3. Copyright © 2018 TIS Inc. All rights reserved. ・三菱のグループ会社で、組み込み系エンジニア約4年 ・映像系の中小で、マネージャ、映像制作、VRゲーム制作約3年 ・TISに2018/02入社。xRの研究開発を行う 2 経歴
  • 4. Copyright © 2018 TIS Inc. All rights reserved. Agenda 導入編 ・UniRxとは ・UniRxで出来ること 基本編 ・Subject, OnNext, Subscribe ・Lesson_01 ・ストリーム ・オペレータ ・Lesson_02 応用編 ・Lesson_03 ・Lesson_04 3
  • 5. Copyright © 2018 TIS Inc. All rights reserved. 導入編 4
  • 6. Copyright © 2018 TIS Inc. All rights reserved. はじめに UniRxは非常に便利なライブラリです。 ただし、銀の弾丸的な効果を期待しないでください。 突然設計がきれいになったり、生産性が上がったりは しません。 UniRxを使いこなし、有効なパターンを学ぶことで、きれい な設計で高い生産性を発揮することが出来るようになります。 とても便利なライブラリなので、まずはUniRxで出来ること を知り、興味を持って触ってみましょう! 5
  • 7. Copyright © 2018 TIS Inc. All rights reserved. ハンズオン資料 イベントページ https://techcircle.connpass.com/event/96518/ パワポ資料 HandsOnのProject https://github.com/sansuu/UniRxHandsOnVol1 6
  • 8. Copyright © 2018 TIS Inc. All rights reserved. UniRxとは neueccさんが作成された(現在もアップデート中)Unity向けの ReactiveExtensions (*1) ライブラリ。 UnityAssetStoreにて、無料でダウンロード可能。 *1:Rx(ReactiveExtensions) C#向けの非同期処理ライブラリ。 Rx ≒ event 機能的にはeventの上位互換。 7
  • 9. Copyright © 2018 TIS Inc. All rights reserved. UniRxで出来ること 下記は、UniRxでできることのほんの一部です。 ・メソッドチェーンでイベントに対する処理を美しく書ける ・PureClass(*1)でUpdate処理を実行できる ・PureClassでCoroutineを実行できる ・Coroutine使わなくてもTimer処理ができる ・変数を触っている感覚でイベントの配信が実装できる ・uGUIのイベント処理が非常に簡潔に書ける ・イベントの購読側で、イベントに対するフィルタをかけるのが 得意(Where,Skip,Repeat,Select...) ・複数のイベントを合成したり、一つのイベントを 分岐させたりできる *1:MonoBehaviourを継承していないClass 8
  • 10. Copyright © 2018 TIS Inc. All rights reserved. UniRxでコードが簡潔に書ける例 9 <お題> アプリ立ち上げた5秒後以降、毎秒ログを出力する。 15秒経過後はログ出力を停止する。
  • 11. Copyright © 2018 TIS Inc. All rights reserved. UniRxを使わない記述例 10
  • 12. Copyright © 2018 TIS Inc. All rights reserved. UniRxでの記述例 11
  • 13. Copyright © 2018 TIS Inc. All rights reserved. 12 どうでしょうか? 無駄なメソッドが減って、コードが簡潔になりましたね。 まずは、なんかUniRx便利そうだなーというのを 感じていただけると嬉しいです。
  • 14. Copyright © 2018 TIS Inc. All rights reserved. 基本編 ― Subject, OnNext, Subscribe ― 13
  • 15. Copyright © 2018 TIS Inc. All rights reserved. イベントの基本 UniRxはイベントの拡張です。 以下の図は基本的なイベントの概念なので覚えておきましょう 14 Subject Subscribe 観察者A (Observer) 観察者B 観察者C Subject Notify 観察者A (Observer) 観察者B 観察者C
  • 16. Copyright © 2018 TIS Inc. All rights reserved. 単語を覚えよう 15 単語 直訳 Subject 主題 Observable 観察可能 Observer 観察者 Subscribe 購読する UniRxを覚える上で、避けては通れない頻出単語がありま す。とりあえずこれだけは覚えておきましょう。
  • 17. Copyright © 2018 TIS Inc. All rights reserved. eventとUniRx 16 結果は同じ 基本的な書き方は、大きく変わらない event UniRx
  • 18. Copyright © 2018 TIS Inc. All rights reserved. UniRxの基本構文(SubscribeとOnNext) 17 Subjectの定義 Subjectの購読+受信時の振る舞い定義 Observerにメッセージを流す
  • 19. Copyright © 2018 TIS Inc. All rights reserved. Subjectってなに? 18 IObserverとIObservableを実装したClass。 SubjectにOnNext等で値を渡すことで、 Subjectの購読者(Observer)にメッセージを通知する。 OnCompleted OnError OnNext Subscribe Subject IObserver IObservable 図で表すとこう
  • 20. Copyright © 2018 TIS Inc. All rights reserved. Subjectってなに? 19 Subject Subscribe 観察者A (Observer) 観察者B 観察者C Subject OnNext OnError OnCompleted 観察者A (Observer) 観察者B 観察者C 前述の図で表すと以下のようになる。
  • 21. Copyright © 2018 TIS Inc. All rights reserved. とりあえず自分で作ってみよう 20 SubjectがUniRxの基本と説明しましたが、深堀すると実は 結構難しい概念です。(Hot,Cold,スケジューラ等) 今回はその辺りすっ飛ばして、とりあえず触ってみましょう。
  • 22. Copyright © 2018 TIS Inc. All rights reserved. Lesson_01 21 以下をSubjectとObserverの2つのClassに分解する。 「Assets/UniRxHandsOn/Projects/02_Lesson/01_Lesson_01」 以下にScene及びClassが格納されているので、それを利用すること
  • 23. Copyright © 2018 TIS Inc. All rights reserved. Lesson_01― 解答例 ― 22
  • 24. Copyright © 2018 TIS Inc. All rights reserved. Lesson_01― 解説 ― 23 Subjectそのものを外部に公開した場合、 外部からSubjectそのものを触れてしまう ので、ちゃんとカプセル化しましょう
  • 25. Copyright © 2018 TIS Inc. All rights reserved. Lesson_01― Betterな解答例 ― 24 Point Subjectは外部に公開せず、 IObservableのInterfaceを公開する
  • 26. Copyright © 2018 TIS Inc. All rights reserved. OnCompletedとOnError 25 OnCompleted OnError OnNext Subscribe Subject IObserver IObservable IF 役割 OnCompleted ストリームの停止及び完了通知 OnError ストリームの停止及びエラー通知 OnNext メッセージの変化通知
  • 27. Copyright © 2018 TIS Inc. All rights reserved. OnCompletedの挙動 26 OnCompleted, OnErrorを通知した場合、 以降のOnNextは通知されない
  • 28. Copyright © 2018 TIS Inc. All rights reserved. OnCompleted, OnErrorの振る舞いを定義す る 27
  • 29. Copyright © 2018 TIS Inc. All rights reserved. SubscribeIFの定義 28
  • 30. Copyright © 2018 TIS Inc. All rights reserved. 基本編 ― ストリーム ― 29
  • 31. Copyright © 2018 TIS Inc. All rights reserved. ストリームって? 30 Rxで扱うメッセージの流れのこと。 メッセージは後述のオペレータによって加工され、 Subscribeした際に登録した処理を行う。 メッセージ Subject 加工 処理 上記メッセージの流れをストリームという
  • 32. Copyright © 2018 TIS Inc. All rights reserved. ストリームって?(コードで) 31 ①メッセージをストリームに流す ②Subscribe時に登録した処理を行う
  • 33. Copyright © 2018 TIS Inc. All rights reserved. ストリームソース 32 メッセージを発行するソースとなる物をストリームソースと 呼ぶ。 Rxではストリームソースを用意しないと何も始まりません。 以下はUniRxにおけるストリームソースの一部です。 ・Subject ・ReactiveProperty ・UniRx.Triggers~
  • 34. Copyright © 2018 TIS Inc. All rights reserved. ストリームソース ―ReactiveProperty― 33 変数にSubjectの機能を追加したもの。 値の変更を通知してくれる変数みたいなもの。 非常に使い勝手が良いので、覚えておきましょう。
  • 35. Copyright © 2018 TIS Inc. All rights reserved. ストリームソース ―ReactiveProperty― 34 ReactivePropertyのValueを変更した時点で ストリームにメッセージが流れる Subject→ReactiveProperty IObservable→IReadOnlyReactiveProperty に変更しただけ 購読側は基本的に変わらない
  • 36. Copyright © 2018 TIS Inc. All rights reserved. ストリームソース ―ReactiveProperty― 35 先ほどのコードを実行すると、実行結果は下記のようになり ます。 ReactivePropertyは、Subscribe時に必ず値をPushする 設計となっているため注意が必要です。 これを無視したい場合、後述のオペレータが活躍します
  • 37. Copyright © 2018 TIS Inc. All rights reserved. 基本編 ― オペレータ ― 36
  • 38. Copyright © 2018 TIS Inc. All rights reserved. オペレータって? 37 ストリームに流れるメッセージを加工するための機能。 UniRxにはオペレータが大量に用意されています。 以下はほんの一部。 オペレータ できること Where 条件を満たすメッセージを通す Select メッセージを変換する Skip メッセージを指定数スキップする Take ストリームを先頭から指定した件数までで切る
  • 39. Copyright © 2018 TIS Inc. All rights reserved. オペレータとメソッドチェーン 38 オペレータは下記の様にメソッドチェーンで繋ぐ事ができま す。 それは、下記の様にすべてのオペレータが、IObservable の拡張メソッドとして定義され、IObservableを返す設計 となっているからです。 上記の記法により、Where<T>が、 IObservableの拡張メソッドとして定義される
  • 40. Copyright © 2018 TIS Inc. All rights reserved. IObservableのIF 39 つまり、IObservableのIFはSubscribeだけでなく 実体としては大量のオペレータIFを定義しているということ OnCompleted OnError OnNext Subscribe Where Select Skip Take ・ ・ ・ Subject IObserver IObservable OnCompleted OnError OnNext Subscribe Subject IObserver IObservable
  • 41. Copyright © 2018 TIS Inc. All rights reserved. Lesson_02 40 以下のストリームから、偶数(0を除く)の2乗をログ出力す るObserverをオペレータを用いて作成する 「Assets/UniRxHandsOn/Projects/02_Lesson/02_Lesson_02」 以下にScene及びClassが格納されているので、それを利用すること 実行結果 (以降も続く)
  • 42. Copyright © 2018 TIS Inc. All rights reserved. Lesson_02― 解答例 ― 41
  • 43. Copyright © 2018 TIS Inc. All rights reserved. 休憩 42
  • 44. Copyright © 2018 TIS Inc. All rights reserved. 応用編 43
  • 45. Copyright © 2018 TIS Inc. All rights reserved. uGUIイベントをストリームに変換する 44 下記の様にして、uGUIイベントをストリームに変換するこ とができる。 IObservable同様にUnityEventの拡張メソッドとして定義されている onClick(UnityEvent)をストリームに変換
  • 46. Copyright © 2018 TIS Inc. All rights reserved. Lesson_03 45 uGUIイベントをストリームに変換し、下記の機能を作成す る。 Sliderの値を表示する DropDownListで選んだColorを 表示する タイマーログ停止 タイマーログ開始 「Assets/UniRxHandsOn/Projects/02_Lesson/03_Lesson_03」 以下にScene及びClassが格納されているので、それを利用すること
  • 47. Copyright © 2018 TIS Inc. All rights reserved. Lesson_03 ― 解答例 ― 46 各UnityEventをストリームに変換 してuGUIに対する処理を行う
  • 48. Copyright © 2018 TIS Inc. All rights reserved. Lesson_03 ― 補足 ― 47 1秒ごとにストリームに メッセージを流すストリームソース Timer停止のため、 ストリームを解放する
  • 49. Copyright © 2018 TIS Inc. All rights reserved. Lesson_04 48 UniRxを利用して、プレイヤーのコントロール機能を作成す る。 プレイヤーコントロールの仕様 ・アローキーで前後左右移動する(走る) ・スペースキーでジャンプする ・「C」キーでしゃがむ(しゃがみ歩き可能) ・LeftShiftキーで歩く 「Assets/UniRxHandsOn/Projects/02_Lesson/04_Lesson_04」 以下にScene及びClassが格納されているので、それを利用すること
  • 50. Copyright © 2018 TIS Inc. All rights reserved. Lesson_04 49 参考動画
  • 51. Copyright © 2018 TIS Inc. All rights reserved. Lesson_04 ― 前提 ― 50 本演習では、StandardAssetsのClassをUniRx化したClass にて、キャラクターの移動処理(Model)を行う。 移動量及び、状態を受け取 るIFとなっている 毎フレーム移動量及び、状態を投げる仕様のため、 Inputの状態を常に最新に更新する必要がある
  • 52. Copyright © 2018 TIS Inc. All rights reserved. Lesson_04 ― 解答例 ― 51
  • 53. Copyright © 2018 TIS Inc. All rights reserved. Lesson_04 ― 解説 ― 52 UpdateAsObservableは毎フレーム ストリームにメッセージを流す ストリームソース Select内でInputを取得することで true/false何れの場合でもストリー ムにメッセージを流せる
  • 54. Copyright © 2018 TIS Inc. All rights reserved. まとめ 53 ・ストリームに流れるメッセージの種類は下記の3種類 OnNext, OnError, OnCompleted ・ストリームにオペレータを挟むことで、メッセージを 加工できる ・IObservableはIFの拡張により、メソッドチェーンで 繋げることができる ・上記をうまく使うことで、どの様な条件で何をしたいか 明確なコードとなり、可読性が向上する
  • 55. Copyright © 2018 TIS Inc. All rights reserved. 参考資料 54 敬称略 • neue cc blog(neue cc) • UniRx入門シリーズ 目次(torisouP)