【Unity】コルーチンと Task.Delay() を使用した簡単なサンプルコード

コルーチンと Task.Delay() を使用した簡単なサンプルコードになります

サンプルコード

コルーチンの例

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(SpawnObjects());
    }

    IEnumerator SpawnObjects()
    {
        while (true)
        {
            // オブジェクトを生成
            Instantiate(objectPrefab, transform.position, Quaternion.identity);
            // 1秒待機
            yield return new WaitForSeconds(1);
        }
    }
}

Task.Delay()の例

using System.Threading.Tasks;

public class Example : MonoBehaviour
{
    async void Start()
    {
        while (true)
        {
            // オブジェクトを生成
            Instantiate(objectPrefab, transform.position, Quaternion.identity);
            // 1秒待機
            await Task.Delay(1000);
        }
    }
}

これらの例では、1秒ごとにオブジェクトを生成するために、コルーチンと Task.Delay() を使用しています。コルーチンでは、yield return new WaitForSeconds(1) を使用して、1秒待機しています。一方、Task.Delay()では、await Task.Delay(1000)を使用して、1秒待機しています。

使い分け

コルーチンと Task.Delay() は、いずれも時間的な制御を実現するために使用されることがありますが、適切な使用方法については、以下のようなポイントに注意する必要があります。

  1. ゲームオブジェクトのアクションを実行する場合は、コルーチンを使用することが推奨されます。コルーチンはUnityの独自の機能であり、Unityのフレームワークに合わせて設計されています。また、物理演算などの時間的な制御も含まれます。
  2. C#の標準機能を使用してタスクを実行する場合は、Task.Delay()を使用することが推奨されます。Task.Delay()は、単純な時間的な遅延処理を実現するために使用されます。
  3. コルーチンは、複数の yield return文を使って、処理を一時停止することができます。一方、Task.Delay()は、awaitキーワードを使用して、タスクの継続を待機することができます。コルーチンは、複雑な制御構造を必要とする場合に有用ですが、単純な遅延処理には適していません。
  4. コルーチンは、通常、IEnumeratorインターフェイスを使用して定義されます。一方、Task.Delay()は、async/await構文を使用して定義されます。コルーチンは、Unityのフレームワークに合わせて設計されたものであり、Unityのゲームオブジェクトに対する制御を容易にします。

総合すると、コルーチンと Task.Delay() の使い分けは、主に以下の要因によって決まります。

  1. ゲームオブジェクトのアクションを実行する場合は、コルーチンを使用することが推奨されます。
  2. 単純な時間的な遅延処理を実現する場合は、Task.Delay()を使用することが推奨されます。
  3. 複雑な制御構造を必要とする場合は、コルーチンを使用することが推奨されます。
  4. Unityのフレームワークに合わせて設計されたものであるコルーチンは、ゲーム開発において非常に重要です。一方、Task.Delay()は、一般的なC#プログラミングにも使用されるため、汎用性が高くなっています。

止める必要がある場合

break;で止める

while文のブロック中にbreakを実行するif文を挿入することでも実現できます

コードで止める

コルーチンを停止する方法

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
    private IEnumerator coroutine;

    void Start()
    {
        coroutine = SpawnObjects();
        StartCoroutine(coroutine);
    }

    IEnumerator SpawnObjects()
    {
        while (true)
        {
            // オブジェクトを生成
            Instantiate(objectPrefab, transform.position, Quaternion.identity);
            // 1秒待機
            yield return new WaitForSeconds(1);
        }
    }

    void StopCoroutine()
    {
        StopCoroutine(coroutine);
    }
}

コルーチンを停止するには、StopCoroutine() メソッドを使用します。StopCoroutine() メソッドにコルーチンのオブジェクトを渡すことで、コルーチンを停止できます。

Task.Delay()を停止する方法

using System.Threading;
using System.Threading.Tasks;

public class Example : MonoBehaviour
{
    private CancellationTokenSource cts;

    async void Start()
    {
        cts = new CancellationTokenSource();

        while (!cts.IsCancellationRequested)
        {
            // オブジェクトを生成
            Instantiate(objectPrefab, transform.position, Quaternion.identity);
            // 1秒待機
            await Task.Delay(1000, cts.Token);
        }
    }

    void StopTask()
    {
        cts.Cancel();
    }
}

Task.Delay()を停止するには、CancellationTokenSourceを使用します。CancellationTokenSourceは、Cancel() メソッドを呼び出すことで、Task.Delay()を停止できます。Task.Delay()には、CancellationTokenSource.Tokenを渡すことで、キャンセル要求をトークンに伝えることができます。

以上のサンプルコードは、それぞれの機能を停止するための基本的な方法を示しています。実際には、ゲームやアプリケーションに合わせて、停止方法をカスタマイズする必要があります。