こんにちわ、Unityエンジニアのオオバです。

みなさまasync/awaitを使っていますでしょうか?
Unityで非同期処理を書くなら UniTask一択 です。

オオバ
オオバ
Taskは使いづらくて・・・

正直もうコルーチンの記述には戻りたくないです。
それだけコルーチンと比べて UniTaskは書きやすい んですよね。

使ってみとわかるんですが、UniTaskは
コルーチンとはまったく違います。

UniTaskを始めてみる、または
コルーチンをUniTaskに置き換えるにしても、
特性や違いを理解なしに使うと思わぬトラブルが発生 します。

【初心者向け】UniTaskとコルーチンの違いを理解しよう_0

本記事では コルーチンとUniTask(async/await)の違い について、
初心者向けに解説していきます。

ぜひともUniTaskをマスターして
非同期処理を気持ちよく書いてもらいたいです。

まだUniTaskを使ってない方はこちらの導入記事をどうぞ。

コルーチンとUniTaskの大きな違い3点

コルーチンに比べてUniTaskがどう違うか
大きく3点にまとめました。

  1. UniTaskは 戻り値の取得 が可能
  2. UniTaskはMonoBehaviourがなくても実行可能
  3. UniTaskはGameObjectのON/OFFで止まらない

コルーチンの面倒くさいところを解消しつつも
コルーチンの方が便利だったという部分もあります。

そのあたり踏まえてUniTaskとコルーチンを比較していきます。

この記事の内容

1.UniTaskは戻り値の取得が可能

【初心者向け】UniTaskとコルーチンの違いを理解しよう_1

UniTaskの大きな特徴として、
タスク完了後に戻り値を取得できます。

例えば以下のようなUniTaskのコードです。

💻ソースコード : bool型を返すUniTaskサンプル
async void Start()  
{
    var result = await TestUniTask();  
    Debug.Log(result);  // true  
}

// bool型を返すUniTask  
async UniTask<bool> TestUniTask()  
{
    await UniTask.Delay(1000);  
    return true;  
}

これを従来のコルーチンで記述するとこうなります。

💻ソースコード : bool型をコールバックで返すコルーチンサンプル
IEnumerator void Start()  
{
    var result = false;  
    yield return TestCoroutine(x => result = x);  
    Debug.Log(result);  // true  
}

// bool型をコールバックで返すコルーチン  
IEnumerator TestCoroutine(Action<bool> callback)  
{
    yield return new WaitForSeconds(1f);  
    callback?.Invokd(true)  
}

サンプルコードは1つのタスク、コルーチンしか使っていないため、
あまり違いを感じないかもしれません。

しかし複数定義されたらどうでしょう。
コルーチンはコールバックだらけで無駄に行数が増えます。

そう考えるとUniTaskの方が
圧倒的にソースコードの見通しが良い のです。

2.UniTaskはMonoBehaviourがなくても実行可能

【初心者向け】UniTaskとコルーチンの違いを理解しよう_2

UniTaskはMonoBehaviour
存在しない空間でも実行可能です。

例えばこちらのコード。

💻ソースコード : MonoBehaviourの無い世界でUniTaskが実行されるサンプル
class TaskClass  
{
    public void ExecuteTask()  
    {
        TestTask().Forget();  
    }

    async UniTask TestTask()  
    {
        await UniTask.Delay(1000);  
        Debug.Log("UniTask完了");  
    }
}

UniTaskはMonoBehaviourが存在しなくても
UniTask、つまり非同期処理を実装できます。

コルーチンで実装するとこうなります。

💻ソースコード : いつものコルーチンサンプル
class CoroutineClass  
{
    // コルーチンを開始させるMonoBehaviourが必要  
    public void ExecuteCoroutine(MonoBehaviour mono)  
    {
        mono.StartCoroutine(TestCoroutine())  
    }

    IEnumerator TestCoroutine()  
    {
        yield return new WaitForSeconds(1f);  
        Debug.Log("コルーチン完了");  
    }
}

といった方法で、
コルーチンを実行するためには
必ずMonoBehviourが必要
です。

この制約はパフォーマンス視点でも無駄が多いです。

UniTaskを使うと、
コルーチンを実装したいがための
無駄なMonoBehaviourを撲滅。

またパフォーマンスアップも期待できます。

3.UniTaskはGameObjectのON/OFFで止まらない

【初心者向け】UniTaskとコルーチンの違いを理解しよう_3

今までUniTaskの良いことばかりを紹介してきましたが、
逆にコルーチンの方が楽だったこともあります。

UniTaskはGameObjectのON/OFFに左右されません。
具体的には以下のコードです。

💻ソースコード : GameObjectのON/OFFでUniTaskが止まらないサンプル
async void Start()  
{
    Wait5SecUniTask().Forget();  
    await UniTask.Delay(1000);  
    // 1秒後にGameObjectをOFFにしても  
    // 5秒後には"UniTask完了"はログ出力される  
    gameObject.SetActive(false);  
}

// 5秒かけて終了するUniTask  
async UniTask Wait5SecUniTask()  
{
    await UniTask.Delay(5000);  
    Debug.Log("UniTask完了");  
}

UniTaskはGameObjectとは別空間で実行されるため
途中でGameObjectが比アクティブ、
Destroyされても動き続けます。

この特徴は必ず理解しておきましょう。

念の為にコルーチンに置き換えた例も紹介します。

💻ソースコード : GameObjectのON/OFFで止まるコルーチン
IEnumerator void Start()  
{
    StartCoroutine(TestCoroutine());  
    yield return new WaitForSeconds(1f);  
    gameObject.SetActive(false);  
}

// 5秒かけて終了するコルーチン  
IEnumerator Wait5SecCoroutine()  
{
    yield return new WaitForSeconds(5f);  
    Debug.Log("コルーチン完了");  
}

コルーチンの場合は
GameObjectが非アクティブになった瞬間に
停止するためログは出力されません。

オオバ
オオバ
この仕様に慣れているとUniTaskの置き換えに苦労するかも知れない

UniTaskの停止方法についてはこちらの記事をどうぞ。

まとめ : UniTaskとコルーチンの違いを理解しよう

【初心者向け】UniTaskとコルーチンの違いを理解しよう_4

記事の内容を簡単にまとめます。

  1. 戻り値の取得が可能なためUniTaskはコードがスッキリする
  2. UniTaskはMonoBehaviourから独立した存在
  3. GameObjectのOFFやDestroyでUniTaskは止まらないので慣れが必要

こんな感じです。

UniTaskとコルーチンどっちが良いか?

オオバ的にはコルーチンは
さっさと卒業すべきという考えです。
つまりUniTaskに全面的に乗り換えるべき

市場を眺めてもUniTaskはUnity界ではモダンです。

さまざまなプロダクトで採用されています。
先日リリースされたスマホゲー
「ダイの大冒険」でも使われていました。

ただしコルーチンとの違い、
特性をしっかり理解しておかないと
トラブルに巻き込まれます。

「UniTaskにしたらヌルポエラーが大量にでる」 みたいな。
大きな違いである GameObjectのライフサイクルから独立している点
最初は戸惑うかも知れません。

ただ、正直慣れます。

ぶっちゃけ書いているとすぐに慣れますし、
書き味の良さを感じられると思います。

いきなり仕事で使うにはリスクがあるかも知れないので、
まずは個人プロダクトから導入してみてはいかがでしょうか。

本記事では触れられていない便利機能が
UniTaskには山程あります。

それらを触りつつ、
コルーチンとの違いを体で感じつつ
技術力を上げていくとよいのかなと思う次第です。


フォローすると UIデザイナー力の上がるTwitter やってます!
今日から使えるテクニックを発信中。
ぜひフォローしてみてください!
👉フォローはこちら!

最後まで読んでいただきありがとうございました!
すばらしいUniTaskライフをお過ごしください。

期間限定 最大95%オフセール
効率UPメガバンドル開催中!最大95%オフ!!!
期間 : 11月1日午後15時59分まで
オススメ記事
検証環境