はんなりと、ゆるやかに

アジャイル、スクラムが好きなITエンジニアが日々から学んだことをアウトプット

UniTaskとasync/awaitを使ってみる

以前、Unityのコルーチン(Coroutine)について調べました。
Unityのコルーチンについて調べた - はんなりと、ゆるやかに
Unity コルーチンの一時停止と終了を調べる - はんなりと、ゆるやかに

さらに調べているとasync/await、UniTaskというキーワードに出合ったので調べてみましたのでまとめます。

async/awaitは非同期処理を支える機能UniTaskはasync/awaitと一緒に使って非同期処理を便利にするライブラリです。

Unityバージョン:2021.3.6.f1

UniTaskのインストール

GitHubのReadmeに書かれているとおりですが、私は「asset package」を使ったインストールを試しました。
github.com

1.上記GitHubのページのReleasesから最新(2022/07/09時点)のUniTask.X.X.X.unitypackageをダウンロード
2.メニューバーの「Assets→Import Package→Custom Cackage」から「1」でダウンロードしたunitypackageを選択

UniTaskの使い方

Unity コルーチンの一時停止と終了を調べる - はんなりと、ゆるやかにのときのコードをUniTaskを使うように修正しました。ポイントとしては以下の点です。

  • async関数の戻り値に UniTaskが使える
  • 指定秒数後に処理するにはUniTask.Delayを使う
  • CancellationTokenSource を使うとasync/awaitの処理をキャンセルできる
    using Cysharp.Threading.Tasks;
 ~中略~
    public async void OnClick()
    {
        if (tokenSource == null)
        {
            tokenSource = new CancellationTokenSource();
            CancellationToken token = tokenSource.Token;
            await Count(token);
        }
        else
        {
            tokenSource.Cancel();
            tokenSource = null;
        }
    }

    async UniTask<string> Count(CancellationToken token)
    {
        Debug.LogError(Thread.CurrentThread.ManagedThreadId);

        for (int i = 1; i <= 10; ++i)
        {
            text.GetComponent<Text>().text = i.ToString();
            await UniTask.Delay(1000, true, cancellationToken:token);
            Debug.LogError(Thread.CurrentThread.ManagedThreadId);
        }
        return "OK";
    }

まとめ

  • コルーチンはasync/awaitとUniTaskで置き換えできそう
  • UniTaskは奥が深そうなので引き続き調べる