Upgrade to Pro — share decks privately, control downloads, hide ads and more …

async_awaitとUniTask.pdf

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for YuukiTsuchida YuukiTsuchida
July 30, 2021
13

 async_awaitとUniTask.pdf

Avatar for YuukiTsuchida

YuukiTsuchida

July 30, 2021

Transcript

  1. Unityのコルーチン Unityのコルーチン public IEnumerator Coroutine(int value) { yield return new

    WaitForSeconds(1); value += 1; } public void Run() { int value = 0; StartCoroutine(Coroutine(value)); }
  2. 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){ } }
  3. 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}"); }
  4. 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; }
  5. UniTaskとTaskの違い UniTaskとTaskの違い 機能 Task UniTask オブジェク トサイズ 大きい 小さい メモリアロ

    ケーション 常にヒー プを確保 ゼロアロケーション await時の制 約 なし 同じUniTaskに対して2 回awaitできない
  6. 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); }
  7. 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; }
  8. 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; }
  9. UniTask.SwitchToThreadPool UniTask.SwitchToThreadPool awaitをした以降の処理を別のスレッドで実行させ る。 public async UniTaskVoid Run() { int

    value = 0; // ここは呼び出し元と同じスレッド await UniTask.SwitchToThreadPool(); value += 1; // ここはもう別のスレッド }
  10. 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の値を反映 }