UniTaskは、Unityで非同期処理を効率的に実現するための軽量なタスクライブラリです。
Unity標準のコルーチンやC#のasync/await構文を活用したい場合に非常に便利です。
今回は、UniTaskのインストール方法から基本的な使い方まで、具体的な手順を解説します。
UniTaskの使い方と手順
1. UniTaskとは?
UniTaskは、Unity環境でasync/awaitを活用した非同期プログラミングを可能にするライブラリです。
- 軽量:標準のタスク(Task)より高速でメモリ消費も少ない。
- Unity向けに最適化:ゲーム開発でよく使われる処理(タイマー、シーン切り替えなど)に対応したユーティリティを提供。
- コルーチンの代替:複雑な処理を簡潔なコードで記述可能。
2. UniTaskのインストール
UniTaskをプロジェクトに導入する
UniTaskは、PackageManagerを使用してインストールすることができます。
- Unityのメニューから Window→Package Manager を開きます。
- +ボタンをクリックし、Add package from git URL… を選択します。
- 以下のURLを入力してインストールします。
https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask
Gitのインストールを行っても、エラーが発生する場合はこの辺が参考になると思います。
ただ、私の場合ですが最終的にPCの再起動まで行わないとエラーが発生しました。
3. 基本的な使い方
準備が整ったところで、UniTaskを使った非同期処理の基本的な例をいくつか紹介します。
例1:基本的な非同期処理
元々await自体は、C#に実装されているものになるので、Unitaskを利用することにより機能を拡張しているイメージです。処理を待機させたい場合に有効活用出来ます。
以下のコードは、awaitを使って時間のかかる処理を非同期で実行する例です。
using Cysharp.Threading.Tasks;
using UnityEngine;
public class UniTaskExample : MonoBehaviour
{
private async void Start()
{
Debug.Log("処理を開始します...");
// 3秒待機
await UniTask.Delay(3000);
Debug.Log("処理が完了しました!");
}
}
UniTask.Delay() は、指定した時間(ミリ秒単位)だけ非同期で待機する処理です。通常のTask使う場合よりも高速で、Unity環境に適した動作をします。
また、関数内にてawaitを使用する際にはセットでasyncをメソッドに付ける必要があるので、是非覚えておいてください。
スクリプトを保存したら、シーン上に適当な空のオブジェクトを作成します。そこへこのスクリプトをアタッチしてゲームを実行してみましょう。
そして、コンソールを開くと分かると思いますが、3秒後に「処理が完了しました!」と出力されるかと思います。
非常にシンプルに非同期処理を実装出来ることが分かりますね。
例2:非同期でシーンのロード
続いて、UniTaskはUnityのSceneManager.LoadSceneAsyncをラップして、簡単な非同期シーンロードをやってみます。
シーンの遷移を行いますので、現シーンに追加で別のシーンを1つ用意します。
私の場合は現シーンを「MainScene」として別のシーンを「Scene1」で作成します。
「File」→「Build Settings…」から各シーンの登録を行っておきます。
MainSceneにてスクリプト「SceneLoader」を作成します。
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneLoader : MonoBehaviour
{
public async void LoadScene(string sceneName)
{
Debug.Log("シーンロードを開始します...");
// シーンを非同期でロード
await SceneManager.LoadSceneAsync(sceneName).ToUniTask();
Debug.Log("シーンロードが完了しました!");
}
}
ToUniTask()を使用することで、Unityの非同期操作を簡単に管理できます。また、シーンロード完了をawaitで待機することが可能です。
スクリプトを保存したら、空のオブジェクトを作成してアタッチしておきます。
今回は例として、ボタンが押されたらシーンをロードしたいので適当にButtonを作成します。
ButtonのOn Clickを下図のように設定します。引数の所には遷移したいシーン名を入力します。
ここまで出来たら、ゲームを実行してみましょう。ボタンをクリックすると「Scene1」が非同期でロードされてコンソール上にロードの開始と完了した旨のメッセージが出力されると思います。
例3:並列処理の実行
こちらは、複数の非同期タスクを同時に実行し、すべてのタスクが完了するまで待機する場合に役立ちます。
新しくスクリプト「ParallelTasks」を作成して下記のソースコードを記述します。
using Cysharp.Threading.Tasks;
using UnityEngine;
public class ParallelTasks : MonoBehaviour
{
private async void Start()
{
Debug.Log("タスクを並列実行します...");
// 複数のタスクを並列で実行
await UniTask.WhenAll(Task1(), Task2());
Debug.Log("すべてのタスクが完了しました!");
}
private async UniTask Task1()
{
await UniTask.Delay(5000); // 5秒待機
Debug.Log("Task1 完了!");
}
private async UniTask Task2()
{
await UniTask.Delay(3000); // 3秒待機
Debug.Log("Task2 完了!");
}
}
UniTask.WhenAll()は、すべてのタスクが完了するまで待機します。個々のタスクの進行状況や結果をawaitで管理できます。
これまでと同様に、空のオブジェクトにスクリプトをアタッチしてゲームを実行します。
すると、コンソールがこんな感じに出力されるんじゃないかと思います。
複数の処理が終了した後に、特定のイベントを発生させたいといった使い方が出来、とてもゲーム開発において便利に使えますので覚えておきたいところですね。
4. よく使うUniTaskの機能
UniTask.Yield
await UniTask.Yield();
次のフレームまで処理を中断します。
await UniTask.Yield();
UniTask.WaitUntil
- 条件が満たされるまで待機します。
await UniTask.WaitUntil(() => Input.GetKeyDown(KeyCode.Space));
Debug.Log("スペースキーが押されました!");
UniTask.WaitForSeconds
- 指定した秒数だけ待機します。
await UniTask.Delay(TimeSpan.FromSeconds(2));
5. UniTaskの活用シーン
- アニメーションの再生
- アニメーションの再生が完了するまで待機し、次の処理を実行できます。
- UI操作の順序制御
- ユーザーの入力を待つ操作(ボタンクリックなど)を簡単に管理。
- ネットワーク通信
- サーバーからのレスポンス待ちやデータ取得処理に利用。
- ゲーム内イベントの管理
- タイマーやシーン遷移などの制御を簡潔に記述可能。
6. 注意点
非同期処理内でエラーが発生するとデバッグが難しくなる場合があります。try-catchで例外をキャッチすると良いかと思います。
まとめ
UniTaskは、Unityでの非同期処理を簡潔かつ効率的に行うための非常に便利なツールです。async/awaitの使い方に慣れれば、コルーチンよりも直感的なコードが書けるようになります。
プロジェクトの複雑さに応じて、UniTaskを適切に活用することで、ゲーム開発の効率を大幅に向上させることができるでしょう。