【Unity】「コルーチン」の正しい使いどころ

Unityで学び始めると、だいたい一度はこう思います。

「コルーチンって便利そうだけど、結局いつ使えばいいの?」

結論から言うと、コルーチンは時間をまたぐ処理を、読みやすく書くための仕組みです。
ただし、何でもコルーチンにすると逆にバグの温床になることもあります。

この記事では、Unity初心者でも迷わないように、

  • コルーチンとは何か

  • 正しい使いどころ

  • 逆に使わないほうがいい場面

  • よくある落とし穴と対策

について解説していきます。これから、ゲーム開発にコルーチンを取り入れたいと思っている方の参考になればと思います。

コルーチン(Coroutine)って何?

コルーチンの図解

コルーチンは「処理を途中で止めて、あとで再開できる」仕組みです。

よく使うのがyield return new WaitForSeconds(1f);みたいな書き方で、
1秒待ってから続きをやる」みたいな流れを、1本の処理として見える形で書けるのが強みです。

まず覚えておくと楽:コルーチンが得意なこと

コルーチンは、このタイプの処理が得意です。

  • 少し待ってから実行したい(遅延)

  • 一定時間かけて変化させたい(フェード、移動、演出)

  • 順番に処理したい(演出の手順、チュートリアルの進行)

  • 毎フレームUpdateで状態管理するのが面倒なもの

逆に言うと、「フレームごとの常時監視」や「重い処理の分割」には向きません(後で詳しく)

コルーチンの正しい使いどころ

1) 〇秒待ってから処理したい(遅延実行)

たとえば「被弾して0.5秒後に無敵解除」みたいなやつ。

IEnumerator EndInvincibleAfter(float sec)
{
    yield return new WaitForSeconds(sec);
    isInvincible = false;
}

Updateでタイマー変数を作って・・・みたいな書き方より、意図がそのまま読めるので、初心者ほど恩恵が大きいです。

2) フェードや演出など「時間をかけて変化」させたい

UIのフェードや、SEのボリュームを少しずつ下げる、など。

IEnumerator FadeOut(CanvasGroup cg, float duration)
{
    float t = 0f;
    float start = cg.alpha;

    while (t < duration)
    {
        t += Time.deltaTime;
        cg.alpha = Mathf.Lerp(start, 0f, t / duration);
        yield return null; // 次のフレームへ
    }

    cg.alpha = 0f;
}

「フェード処理が1か所にまとまる」ので、後で直すのも楽です。

3) 順番が大事な処理(イベント・チュートリアル・演出)

コルーチンが一番ハマるのがここです。

例:「テキスト表示 → 1秒待つ → SE → さらに待つ → 次のイベント」

IEnumerator ShowTutorial()
{
    ShowMessage("ようこそ!");
    yield return new WaitForSeconds(1f);

    PlaySE();
    yield return new WaitForSeconds(0.5f);

    ShowMessage("まずは移動してみよう");
}

Updateでフラグ地獄になるより、ストーリーみたいに読めるのが最高です。

4) 一時的な繰り返し(一定時間だけ監視・点滅)

「2秒間だけ点滅」みたいな期限付きの繰り返しに向いてます。

IEnumerator Blink(float duration)
{
    float t = 0f;
    while (t < duration)
    {
        sprite.enabled = !sprite.enabled;
        yield return new WaitForSeconds(0.1f);
        t += 0.1f;
    }
    sprite.enabled = true;
}

永遠に回す用途より「終わりがある」用途が得意です。

逆に、コルーチンを使わない方がいい場面

1) ずっと監視し続ける処理(常時判定)

たとえば「敵を探し続ける」「毎フレーム入力を見る」みたいなもの。

これは素直にUpdate()や、用途に応じた仕組み(Input Systemのイベント等)に任せた方が安全です。

コルーチンでやると、どこで止まってるのか分かりづらくなりがちです。

2) 重い処理を軽くする目的で使う

コルーチンは、処理を別スレッドにするわけではありません。同じメインスレッドで動きます。

  • 大量生成

  • 重い計算

  • 大きいループ

を「コルーチンにしたから軽くなる!」は基本的に起きません。(フレームをまたいで分割はできますが、設計が別問題になります)

3) 失敗しやすい:同じコルーチンを何度も開始してしまう

ボタン連打でフェードが何重にも走る・・・みたいな事故、よくあります。

対策は簡単で、走っているコルーチンを止めてから開始するのが定番です。

Coroutine fadeRoutine;

public void StartFade(CanvasGroup cg)
{
    if (fadeRoutine != null) StopCoroutine(fadeRoutine);
    fadeRoutine = StartCoroutine(FadeOut(cg, 0.5f));
}

初心者が覚えるべき「コルーチンの落とし穴」3つ

落とし穴①:Scene切り替えで止まる(オブジェクト破棄で終了)

コルーチンは、実行しているMonoBehaviour(GameObject)が消えると止まります。
演出中にSceneを変えるなら注意です。

落とし穴②:WaitForSecondsはTime.timeScaleの影響を受ける

ポーズ中(timeScale=0)に待ち時間が進まないのは仕様です。ポーズ中も進めたいなら WaitForSecondsRealtimeを使います。

落とし穴③:どこから起動したか分からなくなる

コルーチン乱用あるあるです。「演出」「フェード」「チュートリアル」みたいな責務ごとにまとめると迷子になりにくいです。

迷ったときの判断基準(これだけ覚えればOK)

最後に、初心者向けの超シンプルな判断基準を置いておきます。

コルーチンを使う

  • 「待つ」「時間をかける」「順番に進める」がある

  • 終わりがある処理(演出・処理の流れ)

コルーチンを使わない

  • 常に監視する(入力、AIの常時更新など)

  • 重い処理を軽くしたい(別問題)

まとめ:コルーチンは「時間のある処理」を読みやすくする道具

コルーチンは、Unityでかなり便利です。ただ、便利だからこそ「何でもコルーチン」にすると破綻します。

  • 遅延

  • フェード

  • 演出の順番

このあたりに絞って使うと、かなり良い感じになります。

著者プロフィール
うんくん

IT系に特化した記事がメインです。(Unity多め。)
Udemy講師もやっています。よろしくお願いします。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

うんくんをフォローする
unityunity基本操作
シェアする
うんくんをフォローする