【Unity】Coroutineの正しい使い方とハマりがちな罠まとめ《前編》

当ブログではアフィリエイト広告を含みます
Unity

Unityで「〇秒後に〇〇したい」ときに真っ先に使われるのが Coroutine(コルーチン)
時間差のある処理や、連続した演出を組み立てるうえで欠かせない存在です。

この記事では、そんなCoroutineの基本から“よくある罠”までを前後編にわけて解説していきます!

この前編では、「Coroutineって何?」、「どう使えばいいの?」、「初心者がやりがちな罠その1(止まらない問題)」の解説まで行います!

Coroutine(コルーチン)ってなに?ざっくり解説

Unityの Coroutine は、複数の処理を時間を空けて順番に実行するための仕組みです。

たとえば「3秒後に爆発させる」「1体ずつ敵を出す」「一定時間だけ無敵にする」といった処理が、めちゃくちゃ自然に書けるようになります。

ざっくり例

IEnumerator BoomAfterSeconds()
{
    Debug.Log("爆発準備中…5秒お待ちください");
    yield return new WaitForSeconds(5);
    Debug.Log("ドカーン💥 爆発しました!");
}

これを実行するには:

StartCoroutine(BoomAfterSeconds());
  • IEnumerator を返すメソッドに yield return を書くことで「一時停止」ができる
  • StartCoroutine() で実行すると、一時停止しながら順に処理を進められる
  • WaitForSeconds(秒数) を使えば、指定秒数待ってから次の処理へ!

Coroutineの実例集

① UIを1.5秒後に表示したい

IEnumerator ShowPanelLater(GameObject panel)
{
    yield return new WaitForSeconds(1.5f);  //1.5秒待つ
    panel.SetActive(true);  //panelを表示する
}

② 敵を1体ずつ呼び出したい

IEnumerator SpawnEnemies(GameObject prefab, int count)
{
    for (int i = 0; i < count; i++)
    {
        Instantiate(prefab);  //prefabを呼ぶ
        Debug.Log($"敵{i + 1}を召喚しました");
        yield return new WaitForSeconds(0.5f);  //for文を0.5秒止める
    }
}

③ 一定時間だけ無敵状態に

IEnumerator Invincible(float duration)
{
    Debug.Log("今からスーパー無敵タイム!🛡️");
    MutekiFlag = true;  //無敵フラグをオン
    yield return new WaitForSeconds(duration);  //durationの値だけ待つ
    MutekiFlag = false;  //無敵フラグをオフ
    Debug.Log("無敵終了…ご安全に🍀");
}

【罠1】StopCoroutineが効かない!?~文字列指定の落とし穴~

Coroutineは StartCoroutine() で開始して、StopCoroutine() で止めます。
しかしこの StopCoroutine() で止める方法には落とし穴があります。

❌ よくある非推奨なやり方

StartCoroutine("BoomAfterSeconds"); // ← 文字列で呼び出し
StopCoroutine("BoomAfterSeconds");  // ← 効かないことがある!

この書き方では、同じCoroutineが複数動いていた場合に特定の1つだけを止めることができません。
かといって、引数なしで StopAllCoroutines() を呼ぶと全部止まってしまうという地雷付き。

✅ 安全なやり方はこちら

private Coroutine boomCoroutine;

void Start()
{
    boomCoroutine = StartCoroutine(BoomAfterSeconds());
}

void StopBoom()
{
    if (boomCoroutine != null)
    {
        StopCoroutine(boomCoroutine);
        Debug.Log("💣 爆発、回避しました!");
    }
}

コルーチン処理は、Coroutine 型の変数に保持しておくことができます。
このように 変数や配列に保持しておけば、特定のCoroutineだけを安全に停止可能です。

次回予告:まだまだあるぞ!コルーチンの本当の罠とは!?

ここまでで、Coroutineの基本的な使い方と最初にハマりがちな 「止め方のミス」 についてご紹介しました。でも、まだまだあります。

後編では、「WaitForSeconds の知られざる仕様」、「同時に複数のCoroutineが動くときの注意点」、「IEnumerator を直接呼んでしまう落とし穴」、「UIやUnityEventで使ったときの動かない問題」について解説していこうと思います。

Unity/C# をもっと体系的に学ぶには?
【現役メンターに質問しながら短期集中】
👉️ Unityコースで学んでみる [PR]

タイトルとURLをコピーしました