以前、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は奥が深そうなので引き続き調べる