SlideShare a Scribd company logo
脱UniRx&Croutineから始めるUniTask
11/9
※ ほぼUnity/C#の話しかしません
話す内容
● 非同期処理
● コルーチン
● UniRx
● UniTask
● async/await
非同期処理
非同期処理
の前に
同期処理(sync)
処理が終わって結果が返ってくるまで待つ。
非同期処理(async)
処理が終わるのを待たずに次の処理を実行する
Unityの非同期処理
● MonoBehaviour.Invoke
● コルーチン
● Task
● DOTween
● UniRx
● UniTask
Unityの非同期処理
● MonoBehaviour.Invoke
● コルーチン
● Task
● DOTween
● UniRx
● UniTask
UniTask
● UniRxの作者であるneueccさんが公開しているOSS
● 実務での採用実績もたくさん
● 素では使いにくい Task をUnity向けに1から実装したもの(Task-like)
● Unity独自の非同期処理を async / await で待てる
● めっちゃ軽い(ゼロアロケーション)
脱UniRx&Croutineから始めるUniTask
Q. async/await を使うと Unity の API 使えないんじゃないの?
A. 使えます
async / await
● 名前の通り非同期処理を待つための機構
● 非同期処理 ≠ マルチスレッド
○ 相性は良いが非同期とマルチスレッドは違う話
○ Unity 固有の非同期処理はシングルスレッドで実現されている
● 非同期処理の連結を手続き的に書ける
○ Unityコルーチンのyield return に近い
○ 同期処理とあまり変わらない構文
で非同期処理を書くことができる
● UniTaskを使えばUnityでもガンガン使えて超便利
○ UniTaskはPlayerLoopを使って動いている
脱Coroutine
コルーチン UniTask
async/awaitの書き方はコルーチンに似てる
● 非同期メソッドには async 修飾子を付ける
● 非同期メソッドを待つときは await を付ける
● asyncをつけたメソッドの中でしかawaitは使えない
コルーチンにはできないこともasync/awaitならできる
● StartCoroutineが無くても動く
● ジェネリックで型を指定して値をreturnで返せる
コルーチンにはできないこともasync/awaitならできる
● try-catchでエラーハンドリングできる
○ try構文の中ではyieldは使えないがawaitはできる
○ エラーの種類で処理変えたり
コルーチンにはできないこともasync/awaitならできる
● 並行処理も待てる
○ コルーチンには複数の非同期処理を並行で待つ機能はない
○ UniTaskでは WhenAll や WhenAny を使う
脱UniRx
UniRx
● neueccさんが公開している言わずと知れたUnityのRxライブラリ
● オブザーバーパターンをベースに作られている
● C#のeventの上位互換みたいなやつ
Observable.Timer系の出番はもうない
DelayとかDelayFrameとか超便利
明らかにObservableで書いたときよりスッキリしてる
結果が1つものはUniTask化すると良い
async/await は 結果が必ず1つになるので Firstオペレータ を使う前提のストリームや
AsyncSubject は UniTask に変えたほうが扱いやすい
【例】
● オブジェクトの初期化
● ゲーム開始・終了の通知
● 死亡通知
● etc...
UniRx, UniTask, コルーチンの使い分け
● 基本は async/await での実装を考える
○ async/awaitでは表現できそうになかったらRx
● 軽い指標として
○ 結果が1つのものは async/await
○ 結果が不定(0, 1, ∞)のものは Rx(イベントとか)
● WaitForEndOfFrame を使うときはコルーチン
○ PlayerLoopの外で動くのでUniTaskでどうこうできない
○ UniTask.WaitForEndOfFrame というメソッドがあるけどちゃんと
動かないので注意
キャンセル
● 非同期処理はキャンセルがめっちゃ大事
○ UniRx…IDisposable.Dispose
○ コルーチン…StopCoroutine,GameObjectのDestroy
● UniTaskのキャンセルはCancellationTokenを使う
○ System.Threadingに定義されている(C#標準)
○ Task,ValueTaskと同じ
● CancellationTokenがキャンセル命令を検知して例外をスローする
○ OperationCanceledException
● キャンセル命令はCancellationTokenSourceのCancelメソッドで行う
キャンセル
● MonoBehaviourの場合はGetCancellationTokenOnDestroy()が便利
○ OnDestroyのタイミングでキャンセルするCancellationTokenを取得できる
キャンセル
● キャンセル… OperationCanceledException
● 失敗…OperationCanceledException以外の例外
キャンセルは上流まで伝播させる必要がある
失敗とキャンセル
今回話せなかったけど大事なこと
● 色々なもの to UniTask
● ファクトリ,インスタンスメソッド
● UniTaskCompletionSource
● UniTaskVoid
● UniTaskTracker
● UniTaskAsyncEnumerable
● etc…
まとめ
● 非同期処理は結果を待たずに次の処理を実行すること
● 非同期処理 ≠ マルチスレッド
● UniTask を使えば Unity でも async/await が快適に使える
● Rxでは煩わしかった深いネストや非同期処理の直列実行をasync/awaitで楽に書
くことができる
● キャンセル大事!サボらない
● 便利機能たくさん
おすすめの本
UniRx/UniTask完全理解 より高度なUnity C#プログラミング
著作: 打田恭平

More Related Content

PPTX
未来のプログラミング技術をUnityで -UniRx-
PDF
UniTask入門
PPTX
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
PDF
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
PDF
Unityではじめるオープンワールド制作 エンジニア編
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
PPTX
【CEDEC2018】Scriptable Render Pipelineを使ってみよう
未来のプログラミング技術をUnityで -UniRx-
UniTask入門
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
GTMF 2017:Unityプロファイリングマニアクス ユニティ・テクノロジーズ・ジャパン合同会社
Unityではじめるオープンワールド制作 エンジニア編
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【CEDEC2018】Scriptable Render Pipelineを使ってみよう

What's hot (20)

PPTX
UnityでUI開発を高速化した件
PDF
Unityアニメーションシステムの 今と未来の話
PDF
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
PDF
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
PDF
インタフェース完全に理解した
PDF
Unityでオニオンアーキテクチャ
PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async)
PDF
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
【Unity道場】新しいPrefabワークフロー入門
PDF
Unityでパフォーマンスの良いUIを作る為のTips
PPTX
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
PDF
Unity開発で使える設計の話+Zenjectの紹介
PDF
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
PDF
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER
PPTX
プログラマが欲しい仕様書とは
PDF
ドメイン駆動設計をゲーム開発に活かす
PDF
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
UnityでUI開発を高速化した件
Unityアニメーションシステムの 今と未来の話
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
インタフェース完全に理解した
Unityでオニオンアーキテクチャ
Deep Dive async/await in Unity with UniTask(UniRx.Async)
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unity道場】新しいPrefabワークフロー入門
Unityでパフォーマンスの良いUIを作る為のTips
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity開発で使える設計の話+Zenjectの紹介
誰もAddressableについて語らないなら、自分が語るしかない…ッッッッ
UE4×Switchで60FPSの(ネットワーク)対戦アクションをなんとかして作る! | UNREAL FEST EXTREME 2020 WINTER
プログラマが欲しい仕様書とは
ドメイン駆動設計をゲーム開発に活かす
UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
Ad

Similar to 脱UniRx&Croutineから始めるUniTask (20)

PDF
Weeyble async 181009_tukky
PPTX
UnityでもTaskが使いたい!~MinimumAsyncBridgeの紹介~
PDF
UniRx - Reactive Extensions for Unity
PDF
Observableで非同期処理
PDF
Async design with Unity3D
PDF
いまさら恥ずかしくてAsyncをawaitした
PDF
UniRx完全に理解した
PDF
パターンでわかる! .NET Coreの非同期処理
PPTX
async/await のしくみ
PDF
俺はUniRxで行く
PDF
async/awaitダークサイド is 何
PPTX
UniRx勉強会 reactive extensions inside(公開用)
PDF
非同期の時代がやってくる!
PPTX
Unity の Coroutine は何が便利なのか
PDF
Async Enhancement
PDF
これからの「async/await」の話をしよう
PDF
async/await deep dive
PPTX
モダン JavaScript における非同期処理 - Promise, async/await -
PDF
Androidの非同期
PDF
async/await不要論
Weeyble async 181009_tukky
UnityでもTaskが使いたい!~MinimumAsyncBridgeの紹介~
UniRx - Reactive Extensions for Unity
Observableで非同期処理
Async design with Unity3D
いまさら恥ずかしくてAsyncをawaitした
UniRx完全に理解した
パターンでわかる! .NET Coreの非同期処理
async/await のしくみ
俺はUniRxで行く
async/awaitダークサイド is 何
UniRx勉強会 reactive extensions inside(公開用)
非同期の時代がやってくる!
Unity の Coroutine は何が便利なのか
Async Enhancement
これからの「async/await」の話をしよう
async/await deep dive
モダン JavaScript における非同期処理 - Promise, async/await -
Androidの非同期
async/await不要論
Ad

脱UniRx&Croutineから始めるUniTask