Unityにおけるコルーチン入門

2026年4月16日

広告

C# のコルーチンを使いこなして処理をコントロールしよう

TL;DR

  • コルーチンは Unity 独自の機能で、処理を複数フレームにまたいで実行できる。
  • IEnumerator と yield return を使うことで「待ち時間」や「条件待ち」を自然に記述できる。
  • 時間差イベントやアニメーション制御に便利。
  • ただし「スレッドではない」ため、重い処理を分散することはできない。

1. コルーチンとは?

通常のメソッドは呼び出すと最後まで一気に実行されます。

しかしゲーム開発では、例えば:

  • 3秒後に次の処理をしたい
  • フレームごとに少しずつ進めたい
  • ある条件が満たされるまで待ちたい

といったニーズがよく出てきます。

そこで役立つのが コルーチン(Coroutine) です。


2. イラストで理解する「処理の流れ」

通常のメソッド:

Start()
 ├─処理A
 ├─処理B
 └─処理C   ← 一気に実行

コルーチンを使った場合:

StartCoroutine()
 ├─処理A
 ├─yield return 3秒待つ
 │
 ├─処理B(3秒後に再開)
 ├─yield return 次のフレームまで待つ
 │
 └─処理C(次フレームで再開)

➡ 「一度止まって、後から再開できる」のがポイントです。


3. 基本コード例

using System.Collections;
using UnityEngine;

public class CoroutineSample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(SampleCoroutine());
    }

    IEnumerator SampleCoroutine()
    {
        Debug.Log("処理開始");

        yield return new WaitForSeconds(3);
        Debug.Log("3秒後の処理");

        yield return null;
        Debug.Log("次のフレームで処理");
    }
}

4. よく使う yield return

記述意味
yield return null;1フレーム待つ
yield return new WaitForSeconds(3);3秒待つ
yield return new WaitUntil(() => 条件式);条件が満たされるまで待つ
yield return new WaitWhile(() => 条件式);条件が成立している間は待つ

5. サンプルシーンで学ぶ

シーン構成例

  • Main Camera
  • Canvas
    • UI → Text – TextMeshPro (UI: ログ表示用)
  • GameController (Script付き)

スクリプト例

using System.Collections;
using UnityEngine;
using TMPro;  // ← TextMeshProを使う場合に必要

public class GameController : MonoBehaviour
{
    public TextMeshProUGUI logText;  // ← Text → TextMeshProUGUI に変更

    void Start()
    {
        StartCoroutine(OnboardingSequence());
    }

    IEnumerator OnboardingSequence()
    {
        logText.text = "ゲーム開始!";

        yield return new WaitForSeconds(2);
        logText.text = "敵が現れた!";

        yield return new WaitForSeconds(3);
        logText.text = "プレイヤーのターン!";
    }
}

➡ 実行すると UI テキストが時間差で切り替わり、ゲームの進行演出を簡単に作れます。


6. 停止・再開

コルーチンを途中で止めたいときは以下のようにします。

Coroutine routine;

void Start()
{
    routine = StartCoroutine(MyCoroutine());
}

void StopIt()
{
    StopCoroutine(routine); // 個別停止
    // StopAllCoroutines(); // 全停止
}

コルーチンは次の yield return に到達するまで今のフレームの処理を続けます。
StopCoroutine を呼んだとき、コルーチンの状態によって挙動が変わります。


① コルーチンが「待ち中」のとき

yield return new WaitForSeconds(3);  // ← ここで待機中に StopCoroutine

この場合、待機がキャンセルされてそこで終了します。
次の行(Debug.Log("3秒後の処理"))は実行されません。


② コルーチンが「実行中」のとき(yield と yield の間を走っている)

Debug.Log("処理開始");
// ← この辺を実行中に StopCoroutine を呼んでも…
yield return new WaitForSeconds(3);  // ← ここまでは走り切る

StopCoroutine の効果は次のフレーム以降に反映されます。現在のフレームで走っている部分は最後まで実行され、次の yield return の手前で止まるイメージです。


まとめ

状況挙動
yield で待機中その時点でキャンセル、以降は実行されない
yield と yield の間を実行中現フレームの処理は完了し、次の yield で止まる

つまり「yield return の箇所で止まる」のは半分正解で、より正確には「次の yield return のタイミングで再開しない(=そこで終了する)」という理解が正確です。

ブログ記事の図で言うと、コルーチンは「一時停止ポイント」が yield return なので、StopCoroutine はその一時停止ポイントに来たとき「再開しない」という動作をします。


7. 注意点

  • スレッドではない:並列処理ではなく「中断と再開」。
  • MonoBehaviour依存:StartCoroutine は MonoBehaviour から呼び出す必要あり。
  • 複雑なロジックは避ける:長すぎるコルーチンは可読性を損なう。

まとめ

コルーチンは 「待ち」を直感的に書ける Unity の仕組みです。

時間制御や演出に役立ちますが、「スレッドではない」点に注意しながら、ゲーム進行や UI アニメーションに活用していきましょう。


訪問数 133 回, 今日の訪問数 1回

広告

Unity,コルーチン

Posted by hidepon