Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
async_awaitとUniTask.pdf
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
YuukiTsuchida
July 30, 2021
13
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
async_awaitとUniTask.pdf
YuukiTsuchida
July 30, 2021
Featured
See All Featured
Unsuck your backbone
ammeep
672
58k
How to make the Groovebox
asonas
2
2.5k
Code Review Best Practice
trishagee
74
20k
The Curse of the Amulet
leimatthew05
3
16k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
530
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
730
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
540
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Embracing the Ebb and Flow
colly
88
5.2k
The agentic SEO stack - context over prompts
schlessera
0
970
Transcript
async/await async/await とUniTask とUniTask
async/awaitとは async/awaitとは
これを使うことで非同期の処理も同期処理と同じ ように書ける async/awaitはセットで使う 関数にasyncを付けることで関数が非同期で動く ことを表し async関数内でawaitを書くと待機ができる
非同期の処理も同期処理 非同期の処理も同期処理 と同じように書けると と同じように書けると は? は?
Unityのコルーチン Unityのコルーチン public IEnumerator Coroutine(int value) { yield return new
WaitForSeconds(1); value += 1; } public void Run() { int value = 0; StartCoroutine(Coroutine(value)); }
awaitを使った場合 awaitを使った場合 public async Task Run() { int value =
0; await Task.Delay(1000); value += 1; }
async/awaitではtry/catchも書け async/awaitではtry/catchも書け る る public async void Run() { try
{ int value = 0; await Task.Delay(1000); throw new InvalidOperationException("error"); value += 1; } catch(Exception){ } }
async/awaitで書けば戻り値も返 async/awaitで書けば戻り値も返 せる せる public async Task<int> Run() { try
{ int value = 0; await Task.Delay(1000); value += 1; return value; } catch(Exception){ } return -1; } public async void RunTaskStart() { Debug.Log("Run"); int value = await Run(); Debug.Log($"Run: {value}"); }
つまりどういうこと? つまりどういうこと?
非同期処理がシンプルに 非同期処理がシンプルに 書ける! 書ける!
async/awaitの注意点 async/awaitの注意点 asyncを書けば非同期になるわけではない あくまでasyncはキーワードでasync関数が必ず非 同期で動くわけではない 非同期になるかはawait次第 async voidは避け、必ずTask型を返すようにする async void
の場合待機はできないし例外を受 け取ることもできないので良いことがない
戻り値がvoidでasync/await書い 戻り値がvoidでasync/await書い たらどうなるの? たらどうなるの? 一応動きはする 呼び出し元で待機が行えなくなる 場合によってはクラッシュするかも
UniTaskとは UniTaskとは
Unity向けに作られたTask C#の標準クラスのTaskを差し替えることができる
TaskとUniTaskの違い TaskとUniTaskの違い Task型 UniTask型 public async Task Run() { int
value = 0; await Task.Delay(1000); value += 1; } public async UniTask Run() { int value = 0; await UniTask.Delay(1000); value += 1; }
UniTaskとTaskの違い UniTaskとTaskの違い 機能 Task UniTask オブジェク トサイズ 大きい 小さい メモリアロ
ケーション 常にヒー プを確保 ゼロアロケーション await時の制 約 なし 同じUniTaskに対して2 回awaitできない
UniTaskの便利な所 UniTaskの便利な所 TaskにないUnity向けの拡張がある 例えばコルーチンでやる1フレーム待つとか 途中から別スレッドで処理をする 途中からメインスレッドで処理をする コルーチンもawaitで待機できる 処理を開始後放置させて良い場合のために UniTaskVoid型がある
UniTaskの利用する時の注意点 UniTaskの利用する時の注意点 UniTask型の戻り値を返す関数を呼び出しをして awaitをしない場合Forget関数を呼び出す 呼ばなくても問題なく動く 警告が出るので抑制のため UniTask型変数に対して2回awaitはできない 2回したい場合はPreserveを呼び出した戻り 値を利用する
UniTaskの利用する時の注意点 UniTaskの利用する時の注意点 必ずCancellationTokenを引数で渡してやろう コルーチンと違いGameObjectが破棄されて も中断されない 処理のキャンセルしないで放置するとメモリ リークする可能性がある CancellationTokenを渡していつでも終了で きるようにしておこう
CancellationTokenってなに? CancellationTokenってなに? C#の処理をキャンセルするための仕組み 外側から実行中の処理を中断できる UniTaskは内部でCancellationTokenをチェックし て処理をキャンセルしている IsCancellationRequested ThrowIfCancellationRequested これらを使うことで手動でキャンセルの判定 はできる
CancellationTokenは必ず使お CancellationTokenは必ず使お う! う!
CancellationTokenの作り方 CancellationTokenの作り方 CancellationTokenSourceから作る CancellationTokenSourceを作りTokenを呼び 出すと取得できる 処理の中断をしたい場合は CancellationTokenSourceのCancelメソッド を呼び出す
CancellationTokenの作り方 CancellationTokenの作り方 GameObjectに紐付いたCancellationTokenを使う GameObject, Componentの拡張メソッドに GetCancellationTokenOnDestroyがある これを呼び出せばCancellationTokenを取得 できる CancellationTokenSourceを利用するのと違 い外側から処理のキャンセルはできない
GameObject, Componentの破棄されるタイ ミングでキャンセルされる
よく使いそうな機能の紹 よく使いそうな機能の紹 介 介
UniTask.Run UniTask.Run 指定したデリゲートを別スレッドで実行する UniTask.Run(()=> { // 別スレッドでやりたい処理 }).Forget();
UniTask.Create UniTask.Create UniTaskの生成をする public void Start() { DestroyAsync(UniTask.Create(async () =>
{ for (int i = 0; i < 120; i++) { transform.position += Vector 3.forward * Time.del await UniTask.Yield(); } })).Forget(); } private async UniTaskVoid DestroyAsync(UniTask asyncAction) { await asyncAction; Destroy(gameObject); }
UniTask.Delay UniTask.Delay 指定の時間待機する。 単位はミリ秒またはTimeSpanで指定できる。 public async UniTaskVoid Run() { int
value = 0; await UniTask.Delay(1000); value += 1; }
UniTask.Yeld UniTask.Yeld コルーチンのyield return null の代わりに利用する ことができる。 第一引数に指定したイベントが次に行われる時まで待 機をする。 デフォルト引数はMonoBehaviourのUpdateイベント
public async UniTaskVoid Run() { int value = 0; // これで次のUpdate関数が呼ばれるまで待機 await UniTask.Yeld(); // これで次のFixedUpdate関数が呼ばれるまで待機 await UniTask.Yeld(PlayerLoopTiming.FixedUpdate); value += 1; }
あくまで次のイベントの実行なので同一フレームで完 了する事がありえる。
UniTask.NextFrame UniTask.NextFrame UniTask.Yeldと同じ様に第一引数に指定したイベント が次に行われる時まで待機をする。 ただ、こちらは必ず次のフレームになることが保証さ れている。 public async UniTaskVoid Run()
{ int value = 0; // これで次のフレームのUpdate関数が呼ばれるまで待機 await UniTask.NextFrame(); // これで次のフレームのFixedUpdate関数が呼ばれるまで待機 await UniTask.NextFrame(PlayerLoopTiming.FixedUpdate); value += 1; }
UniTask.SwitchToThreadPool UniTask.SwitchToThreadPool awaitをした以降の処理を別のスレッドで実行させ る。 public async UniTaskVoid Run() { int
value = 0; // ここは呼び出し元と同じスレッド await UniTask.SwitchToThreadPool(); value += 1; // ここはもう別のスレッド }
UniTask.SwitchToMainThread UniTask.SwitchToMainThread awaitをした以降の処理をメインスレッドで実行させ る。 例えば重い処理を別スレッドで行った後にその結果を Unityに反映させたい場合なんかによく使う。 public async UniTaskVoid Run()
{ await UniTask.SwitchToThreadPool(); int value = 0; for(int i = 0; i < 100000; ++i) { value += i; } await UniTask.SwitchToMainThread(); // ここで例えばUnityのUIにvalueの値を反映 }
UniTask.WaitUntil UniTask.WaitUntil 指定した条件がtrueになるまで待機する。 int value = 0; public async UniTaskVoid
Run() { await UniTask.WaitUntil(()=> value == 5); value += 1; }
他にもいっぱい! 他にもいっぱい!
ようこそ非同期の世界へ! ようこそ非同期の世界へ!