Unity でメソッドを遅延実行する方法

Unityでメソッドを実行した後、一定の時間を置いて別のメソッドを実行する方法は様々です。この技術資料では、Unityで遅延実行を行う代表的な方法を網羅して紹介します。それぞれの方法には特徴があるため、プロジェクトの要件やコードの複雑さに応じて適切な手法を選択してください。

1. コルーチン(Coroutine)を使用する方法

Unityのコルーチンを使うことで、簡単に一定の時間を待機した後に処理を実行することができます。

using UnityEngine;
using System.Collections;

public class CoroutineDelayExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(ExecuteMethods());
    }

    IEnumerator ExecuteMethods()
    {
        Method1();
        yield return new WaitForSeconds(3.0f); // 3秒の待機
        Method2();
    }

    void Method1()
    {
        Debug.Log("メソッド1が実行されました");
    }

    void Method2()
    {
        Debug.Log("遅延後にメソッド2が実行されました");
    }
}

特徴

  • WaitForSeconds()を使用することで、指定した秒数だけ待機できます。
  • コルーチンはシーンのオブジェクトが無効化されたり破棄されたりすると停止します。

2. Invoke メソッドを使用する方法

Invokeメソッドを使うことで、指定した遅延時間の後にメソッドを呼び出すことが可能です。

using UnityEngine;

public class InvokeDelayExample : MonoBehaviour
{
    void Start()
    {
        Method1();
        Invoke("Method2", 3.0f); // 3秒後にMethod2を呼び出す
    }

    void Method1()
    {
        Debug.Log("メソッド1が実行されました");
    }

    void Method2()
    {
        Debug.Log("遅延後にメソッド2が実行されました");
    }
}

特徴

  • 簡単に遅延呼び出しを実現できるが、細かい制御には不向きです。

3. DOTween を使用する方法

DOTweenはタイムベースのアニメーションや遅延処理を簡単に記述できるライブラリです。

using UnityEngine;
using DG.Tweening; // DOTweenの名前空間をインポート

public class DOTweenDelayExample : MonoBehaviour
{
    void Start()
    {
        Method1();
        DOVirtual.DelayedCall(3.0f, Method2); // 3秒の遅延後にMethod2を実行
    }

    void Method1()
    {
        Debug.Log("メソッド1が実行されました");
    }

    void Method2()
    {
        Debug.Log("DOTweenを使用して遅延後にメソッド2が実行されました");
    }
}

特徴

  • DOVirtual.DelayedCallを使ってシンプルに遅延処理を実現できます。
  • DOTweenはアニメーション制御にも便利なツールで、プロジェクト全体で利用することが可能です。

4. UniTask を使用する方法

UniTask は Unity 向けの非同期処理ライブラリで、async/awaitと同様の使い方が可能です。

using UnityEngine;
using Cysharp.Threading.Tasks; // UniTask の名前空間をインポート

public class UniTaskDelayExample : MonoBehaviour
{
    void Start()
    {
        ExecuteMethods().Forget(); // 非同期処理の実行
    }

    private async UniTaskVoid ExecuteMethods()
    {
        Method1();
        await UniTask.Delay(3000); // 3秒の遅延
        Method2();
    }

    void Method1()
    {
        Debug.Log("メソッド1が実行されました");
    }

    void Method2()
    {
        Debug.Log("UniTaskを使用して遅延後にメソッド2が実行されました");
    }
}

特徴

  • async/awaitスタイルで簡単に非同期処理を記述できます。
  • 他のタスクやフレーム待機も簡単に扱えます。

5. Async/Await を使用する方法

C#のasync/awaitを使うことで、非同期処理をシンプルに実装することができます。

using UnityEngine;
using System.Threading.Tasks; // Taskを使用するために必要

public class AsyncAwaitDelayExample : MonoBehaviour
{
    void Start()
    {
        ExecuteMethods(); // 非同期メソッドの呼び出し
    }

    private async void ExecuteMethods()
    {
        Method1();
        await Task.Delay(3000); // 3秒の遅延(ミリ秒単位)
        Method2();
    }

    void Method1()
    {
        Debug.Log("メソッド1が実行されました");
    }

    void Method2()
    {
        Debug.Log("async/awaitを使用して遅延後にメソッド2が実行されました");
    }
}

特徴

  • Task.Delayを使うことで、スレッドをブロックせずに待機可能です。
  • async/awaitを使うことで、コードが非常に見やすくなります。

まとめ

以下に各方法の特徴を一覧表にまとめます。

方法特徴
コルーチン柔軟で簡単に使えるが、シーンの状態に依存する
Invokeシンプルな遅延処理に適しているが、制御の柔軟性は低い
DOTweenアニメーションや複雑なシーケンスを扱う場合に便利
UniTaskasync/awaitスタイルで非同期処理を直感的に記述でき、他のタスクやフレーム待機も簡単に扱える
Async/Await非同期処理の制御が簡単で、特に複雑な処理をシンプルにする場合に有効

プロジェクトの要件に合わせて、最適な方法を選んで実装してください。

C#,Unity

Posted by hidepon