「3秒後に敵を出現させたい」「フェードアウトを少しずつ進めたい」——こうした 時間をまたぐ処理 をUpdateとタイマー変数で書こうとすると、コードはあっという間に複雑になります。
Unityにはこのための専用機能、 コルーチン (Coroutine) があります。「処理の途中で休憩して、指定したタイミングで続きから再開できる関数」で、時間経過を伴う処理や重い処理の分割が驚くほどシンプルに書けます。この記事ではIEnumeratorとyield returnを中心に、仕組みと使い方を解説します。
この記事でわかること
- コルーチンの仕組み(中断と再開)
IEnumerator・yield return・StartCoroutineの3点セット- 時間待ち・フレーム分割などの中断条件の使い分け
- コルーチンの停止方法(
StopCoroutine)
コルーチンとは?
コルーチンは、 処理を一時的に中断し、後で特定のタイミングから再開できる 特殊な関数です。通常の関数は一度呼び出されると最後まで実行されなければなりませんが、コルーチンは処理の途中でUnityに制御を一旦戻し、「次のフレームで再開して」「5秒後に再開して」といった指示を出すことができます。

これにより、Update関数を複雑にすることなく、時間ベースのイベントや処理の分割を直感的に実装できます。
コルーチンが活躍する定番の場面はこの3つです。どれも「時間をまたぐ処理」であることが共通点です。

コルーチンの基本的な使い方
コルーチンを実装するには、以下の3つの要素が必要です。
IEnumerator型の戻り値を持つ関数: これがコルーチン本体です。IEnumeratorはC#の標準的なインターフェースで、「列挙可能なもの」を意味します。yield return: コルーチンの処理を中断し、Unityに制御を戻すためのキーワードです。この後に再開条件を指定します。StartCoroutine(): 作成したコルーチンを開始するためのメソッドです。
時間を待つコルーチン
最も基本的な使い方は、一定時間待ってから処理を再開するパターンです。yield return new WaitForSeconds(float seconds)を使います。
using System.Collections;
using UnityEngine;
public class CoroutineExample : MonoBehaviour
{
void Start()
{
Debug.Log("コルーチンを開始します。");
// メソッド呼び出しの形でコルーチンを開始
StartCoroutine(WaitAndPrint());
}
// IEnumeratorを返す関数としてコルーチンを定義
IEnumerator WaitAndPrint()
{
// 3秒間処理を中断
yield return new WaitForSeconds(3.0f);
// 3秒後にここから処理が再開される
Debug.Log("3秒経過しました!");
}
}
このスクリプトを実行すると、まず「コルーチンを開始します。」と表示され、その3秒後に「3秒経過しました!」と表示されます。Start関数はコルーチンを開始した直後に終了しますが、コルーチンはバックグラウンドで待機を続け、指定した時間が経過すると処理を再開するのです。

補足:
StartCoroutine("WaitAndPrint")のように 文字列 でメソッド名を指定する書き方もありますが、タイプミスに気づけずリネームにも追従しないため、上のコード例のような メソッド呼び出しの形(StartCoroutine(WaitAndPrint())) をおすすめします。文字列指定が必要になるのは、文字列でStopCoroutineしたい場合などの限られた場面だけです。
yield returnで使える様々な中断条件
yield returnの後には、WaitForSeconds以外にも様々な中断・再開条件を指定でき ます。
| yield return の後に指定するもの | 再開タイミング |
|---|---|
null | 次のフレームのUpdateが呼ばれた後に再開。 |
new WaitForSeconds(t) | 指定した秒数が経過した後に再開。 |
new WaitForSecondsRealtime(t) | Time.timeScaleの影響を受けない実時間でt秒後に再開(ポーズ中でも進む)。 |
new WaitForEndOfFrame() | フレームの描画が完了した直後(そのフレームの終わり)に再開。 |
new WaitForFixedUpdate() | 次のFixedUpdateの後に再開。 |
new WaitUntil(() => 条件) | 指定した条件がtrueになったら再開。 |
StartCoroutine(AnotherCoroutine()) | AnotherCoroutineが完全に終了した後に再開。コルーチンを入れ子にできる。 |
重い処理を分割する際にはyield return null;がよく使われます。一度に全部実行するとその間ゲームが止まって(フリーズして)しまいますが、フレームごとに少しずつ進めれば、ゲームを動かしたまま処理を完了できます。
