Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Coroutine / IEnumerator

Coroutine / IEnumerator

Unity で処理を時間分割して実行する『Coroutine(コルーチン)』の使い方です。『IEnumerator』を返すメソッドを定義し、『StartCoroutine()』で開始します。

構文
using System.Collections;
using UnityEngine;

// IEnumerator を返すメソッドがコルーチンの本体です。
IEnumerator コルーチン名()
{
    // yield return で処理を一時停止して次のフレームに制御を返します。
    yield return null;

    // 指定秒数待機します。
    yield return new WaitForSeconds(float seconds);

    // 次の FixedUpdate まで待機します。
    yield return new WaitForFixedUpdate();

    // 条件が true になるまで待機します。
    yield return new WaitUntil(() => 条件式);
}

// コルーチンを開始します。
Coroutine handle = StartCoroutine(コルーチン名());

// コルーチンを停止します。
StopCoroutine(handle);

// このゲームオブジェクトで実行中の全コルーチンを停止します。
StopAllCoroutines();
メソッド一覧
メソッド / クラス概要
StartCoroutine(IEnumerator)コルーチンを開始します。戻り値の Coroutine を保持しておくと後で停止できます。
StopCoroutine(Coroutine)指定したコルーチンを停止します。StartCoroutine() の戻り値を渡します。
StopAllCoroutines()このコンポーネントで実行中の全コルーチンを停止します。
yield return null次のフレームまで処理を一時停止します。
yield return new WaitForSeconds(t)t 秒間処理を一時停止します。Time.timeScale の影響を受けます。
yield return new WaitForSecondsRealtime(t)t 秒間処理を一時停止します。Time.timeScale の影響を受けません(ポーズ中も動きます)。
yield return new WaitUntil(() => 条件)条件が true になるまで毎フレーム待機します。
yield return new WaitForFixedUpdate()次の FixedUpdate まで待機します。物理演算と同期する際に使います。
サンプルコード
using System.Collections;
using UnityEngine;

public class CoroutineSample : MonoBehaviour
{
    private Coroutine 点滅コルーチン;

    void Start()
    {
        // コルーチンを開始します。
        StartCoroutine(カウントダウン(5));

        // 戻り値を保持して後から止められるようにします。
        点滅コルーチン = StartCoroutine(点滅(0.5f));

        // 3秒後に点滅を止めます。
        StartCoroutine(遅延実行(3f, () =>
        {
            StopCoroutine(点滅コルーチン);
            Debug.Log("点滅を停止しました。");
        }));
    }

    // カウントダウンするコルーチンです。
    IEnumerator カウントダウン(int 秒数)
    {
        for (int i = 秒数; i > 0; i--)
        {
            Debug.Log($"カウントダウン: {i}");
            yield return new WaitForSeconds(1f); // 1秒待ちます。
        }
        Debug.Log("スタート!");
    }

    // オブジェクトを点滅させるコルーチンです。
    IEnumerator 点滅(float 間隔)
    {
        Renderer renderer = GetComponent<Renderer>();
        while (true) // StopCoroutine() で外部から止めます。
        {
            if (renderer != null)
            {
                renderer.enabled = !renderer.enabled;
            }
            yield return new WaitForSeconds(間隔);
        }
    }

    // 指定秒数後にアクションを実行するコルーチンです。
    IEnumerator 遅延実行(float 遅延, System.Action 処理)
    {
        yield return new WaitForSeconds(遅延);
        処理?.Invoke();
    }
}
概要

コルーチンは MonoBehaviour が有効(アクティブ)な間だけ動作します。ゲームオブジェクトが無効化(SetActive(false))されるとコルーチンは自動的に停止し、再有効化しても再開されません。また、コルーチンはメインスレッドで動くため、スレッドセーフティの問題がなく Unity API を自由に呼び出せます。

長時間の非同期処理(HTTP 通信など)には C# の async / await も利用できます(Unity 2017 以降)。コルーチンと async / await は共存可能です。Unity の数学関数についてはMathfを、ベクトル演算についてはVector2 / Vector3をご確認ください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。