🎉

Unityコルーチンでループ処理を効率化する方法:一時停止・再開を自在に操ろう

に公開

閲覧いただきありがとうございます。はじめまして、ゲーム開発所RYURYUの「りゅうや」と申します。

❏ ゲーム開発ランキング【 1位 】実績多数 (ココナラ)
❏ ココナラ総販売【 220件超 】
❏ GC甲子園2022・東京ゲームショウ2023など出展経験あり

■ 「独学でUnityを学習したい人へ」最短5日でゲームが作れる超実践書できました!
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

■ 「効率的にUnityを学習したい人へ」Unity超入門ブートキャンプ【5日間集中講座】とは?
https://ryuryu.memberpay.jp/service/item/yjo1sst

■ 「みんなとUnityを学習したい人へ」どこでもUnity教室Discordサーバー
https://discord.gg/5FwuKCacNy

Unityコルーチンでループ処理を効率化する方法:一時停止・再開を自在に操ろう

Unityでゲームを作るうえで、「あるタイミングで特定の処理を実行したい」「一定間隔で敵を出現させたい」という場面によく遭遇しませんか。

特に、Unity初心者の方 にとって、フレームごとにロジックを制御するUpdate()だけでは、複雑な演出やタイミング管理が大変だと感じることも多いでしょう。そこで強力な味方になってくれるのが、コルーチン(Coroutinex) という仕組みです。

本記事では、「Unity コルーチン」「ループ処理」 をキーワードに、コルーチンの概要やサンプルを通じて、初心者でもわかりやすいよう解説していきます。

コルーチン(Coroutine)とは何か

Unityにおけるコルーチンとは、メソッド実行の途中で「一時停止(yield)」し、一定時間後や特定条件を満たした後に再開できる特殊な処理フローのことです。IEnumeratorを返すメソッドをStartCoroutine()で呼び出すだけで、「止めたり進めたりしながら実行する」イメージを実現できます。ゲーム開発ではアニメーション演出、敵のスポーン、UIフェードなど、タイミングが重要な処理に幅広く活用できるのが特徴です。

コルーチンのメリット

  • 処理のタイミングを直感的に書ける
    「3秒待ってから実行」「敵が消滅するまで待つ」など、処理をステップバイステップで記述できる
  • Update()よりコードがスッキリ
    連続した処理をすべてUpdate()に詰め込むと可読性が下がるが、コルーチンならブロック単位で記述可能
  • 時間や条件を待機できる
    WaitForSecondsWaitUntilなどの仕組みで、簡単に「何秒待機」「特定の条件になるまで待機」といった処理を表現できる

コルーチンの代表的なyield

次のフレームまで待機。例えば1フレーム後に再開したいときに使う

yield return null;

指定秒数だけ待って再開。演出やスポーン間隔で多用される

yield return new WaitForSeconds(float seconds);

特定の条件がtrueになるまで待機。状況に応じて処理を進めたいときに使える

yield return new WaitUntil(() => SomeCondition);

特定の条件がtrueになるまで待機。状況に応じて処理を進めたいときに使える

yield return new WaitForFixedUpdate();

【サンプル1】開始3秒後にBGMを再生する

実際のゲーム制作でよくあるのが、ゲームスタート後に数秒だけ無音を保ち、演出後にBGMを流すといったケースです。コルーチンを使えば以下のように簡単に実装できます。

DelayedBGM
using UnityEngine;

public class DelayedBGM : MonoBehaviour
{
    [SerializeField] private AudioSource bgmAudio;
    [SerializeField] private float delayTime = 3f;

    private void Start()
    {
        StartCoroutine(PlayBGMWithDelay());
    }

    private IEnumerator PlayBGMWithDelay()
    {
        yield return new WaitForSeconds(delayTime);
        bgmAudio.Play();
        Debug.Log("BGMが再生されました!");
    }
}

解説

  1. IEnumerator PlayBGMWithDelay()
    • コルーチンを示すために戻り値をIEnumerator型にし、メソッド名をわかりやすく付与
  2. yield return new WaitForSeconds(delayTime);
    • delayTime秒待機する部分。ここで一旦処理が停止するが、指定秒数後に再開される
  3. bgmAudio.Play();
    • 待機が終わったタイミングでBGMを再生。この順番が視覚的にも明確で、可読性が高い

【サンプル2】一定時間ごとに敵を出現させる(ループ処理)

コルーチンがループと相性抜群なのは、有名な活用法として「敵の定期スポーン」が挙げられます。5秒ごとに敵を生み出す例を見てみましょう。

EnemySpawner
using UnityEngine;

public class EnemySpawner : MonoBehaviour
{
    [SerializeField] private GameObject enemyPrefab;
    [SerializeField] private float spawnInterval = 5f;

    private void Start()
    {
        StartCoroutine(SpawnEnemies());
    }

    private IEnumerator SpawnEnemies()
    {
        while (true)
        {
            Instantiate(enemyPrefab, transform.position, transform.rotation);
            Debug.Log("敵をスポーンしました!");
            
            yield return new WaitForSeconds(spawnInterval);
        }
    }
}

解説

  • while (true)
    • 無限ループにし、コルーチンのyieldによって待機→再開を繰り返す
  • Instantiate(enemyPrefab, transform.position, transform.rotation);
    • 敵プレハブを生成し、その場で表示
  • yield return new WaitForSeconds(spawnInterval);
    • 次の敵を出すまでspawnInterval秒だけ待機

【サンプル3】指定回数だけ敵をスポーンして停止する

「このステージでは敵を5体だけ出して終了する」といったケースも多いでしょう。以下はwhile (true)ループを使いながら、break文でループを抜ける実装例です。

EnemySpawnerLimited
using UnityEngine;
using System.Collections;

public class EnemySpawnerLimited : MonoBehaviour
{
    [SerializeField] private GameObject enemyPrefab;
    [SerializeField] private float spawnInterval = 3f;
    [SerializeField] private int spawnCount = 5;

    private void Start()
    {
        StartCoroutine(SpawnEnemies());
    }

    private IEnumerator SpawnEnemies()
    {
        int currentCount = 0;

        while (true)
        {
            Instantiate(enemyPrefab, transform.position, transform.rotation);
            currentCount++;
            Debug.Log("敵をスポーンしました! 現在のスポーン数: " + currentCount);

            // 指定数に達したらループを抜ける
            if (currentCount >= spawnCount)
            {
                Debug.Log("最大数に達したためスポーンを停止");
                break;
            }

            yield return new WaitForSeconds(spawnInterval);
        }

        Debug.Log("SpawnEnemiesコルーチンを終了しました");
    }
}

breakの役割

  • forwhileループを強制終了するためのキーワード
  • 条件分岐と合わせて使うと、自由自在にループ回数をコントロールできる

コルーチン活用時に意識したいポイント

1. コルーチンを止める方法

  • StopCoroutine("コルーチン名")
    • 文字列でコルーチン名を指定して停止
  • StopCoroutine(IEnumerator型の変数)
    • 実行中のコルーチンの参照を保持し、それをStopする
  • StopAllCoroutines()
    • 現在アクティブなすべてのコルーチンを停止

シーン遷移やイベント発生でコルーチンを止めたい場合によく使います。

2. Update()との違い

  • Update()は毎フレーム呼ばれるが、コルーチンはyieldで一時停止しつつ実行される
  • 毎フレームの操作や物理演算向けにはUpdate()FixedUpdate()が基本だが、演出やタイマー処理にはコルーチンが有利

3. パフォーマンスへの留意

  • コルーチン自体は軽量だが、乱用すると管理が複雑になる
  • 大量の敵を同時にスポーンする際にコルーチンを増やしすぎると、オーバーヘッドが蓄積する可能性あり
  • 大規模ゲームでは複数のコルーチンを統合管理する工夫や、単一コルーチン内で複数タスクを処理する手法などが検討される

4. コルーチンのネストとWaitUntil

  • yield return StartCoroutine(AnotherCoroutine());
    • コルーチン中に別コルーチンを呼び出し、その終了を待つ使い方
  • yield return new WaitUntil(() => conditionMet);
    • 任意の条件がtrueになるまで再開しないため、演出順序やイベント管理に応用できる

具体的なシーン例

カットシーンの段階的演出
  • スタートしたら画面を暗転 → 2秒待機
  • BGM再生 → テキストをフェードイン → 3秒待機
  • 画面が明るくなり、プレイヤー操作が可能になる
    コルーチンの中でyield return new WaitForSeconds(...)yield return new WaitUntil(...)を織り交ぜれば、複雑な演出もメソッド単位でスッキリ記述可能。
UIアニメーションのフェーズ管理
  • 順番にボタンをフェードイン表示 → 待機 → 次のUI要素を表示
  • whileループやforループを組み合わせて、「段階的UI表示」を制御できる
  • 毎フレーム実行に頼らないため、演出のタイミングを崩さず管理しやすい
負荷分散のためのスポーン
  • 大量の敵を一気に生成すると処理が重くなる場合、コルーチン内で一定数生成するごとにフレームをまたいで休憩する
  • yield return null;を挟みながら、フレームを分割してオブジェクトを生成すれば、パフォーマンスや画面フリーズを緩和できる

コルーチンとループの組み合わせ例

  • SpawnEnemiesコルーチンが呼び出されると、無限ループ内で敵をスポーン → 待機 → スポーン の処理を続ける
  • どこかで条件が満たされたらbreakStopCoroutine()を使って終了

まとめ:コルーチンを活かしてリズミカルなゲーム演出を実現しよう

Unity コルーチンは、「ループ処理」「待機タイミング」などを直感的に書ける便利な仕組みです。

  • 1回きりの演出: 指定秒数待ってからBGMやアニメーションを開始
  • 繰り返し処理: 敵スポーン、UIフェード、複数ステップのカットシーン

ゲーム制作において「一定時間後に何かをする」ケースは非常に多く、コルーチンのおかげでこうしたシナリオを手軽に実装できるようになります。とはいえ、必要以上に乱用すると制御が複雑化し、バグやパフォーマンス低下の原因にもなり得るので、Update()やFixedUpdate()との使い分けを意識しながら、状況に合ったアプローチを選ぶことが大切です。

ポイントおさらい:

  • yield return new WaitForSeconds(...) で秒数指定の待機
  • while (true) とコルーチンの組み合わせで無限ループ → スポーン処理
  • breakStopCoroutine() で抜けるタイミングを管理

慣れてきたら、ネストコルーチンやWaitUntilなどの応用テクニックで、さらに柔軟かつ見通しのよいコードを書けるようになります。ぜひコルーチンを活用して、テンポ良いゲームの演出や繰り返し処理を組み立ててみてください。

Unityをもっと極めたい"あなた"へ ― 今すぐスキルアップのチャンス!

✅【Unity超入門】最短5日で実践!ミニFPS制作で網羅学習【全29章】

Unity超入門書でUnityスキルを短期間でマスター!|即戦力となるスキルを習得!

❏ 詳細な解説と実例が満載なので、初心者でもスムーズにUnityの基礎が身につきます

さあ、Unity超入門書で、Unity開発の第一歩を踏み出しましょう!
Unity超入門書の詳細はこちら
https://zenn.dev/ryuryu_game/books/fd28de9d8e963a/viewer/0570af

✅ Unity超入門ブートキャンプ【5日間集中講座】とは?

【Unity超入門】に加えて、ご購入いただくことで、あなたの学習をUnity講師がサポートします。

単発9,800円
❏ 24時間体制で、いつでもテキストによる質問にお答えします!(5日間)
❏ 1回×50分のビデオチャットで、学習進捗の確認やプロジェクトのサポートをいたします!
Unity超入門ブートキャンプ【5日間集中講座】の詳細はこちら
https://ryuryu.memberpay.jp/service/item/yjo1sst

✅ どこでもUnity教室 Discordサーバー

❏ 毎日の質問で即解決|Unityに関する疑問や悩みは、専用Discordでプロの仲間とシェア!

  • 月額0円 で、テキストで気軽に質問・進捗共有が可能
  • 実績多数のコミュニティで、参加するだけで具体的な課題解決のヒントが手に入る

まずは無料で参加して、あなたのUnity学習を加速させましょう! 無料でDiscordに参加する]
https://discord.gg/5FwuKCacNy

✅ どこでもUnity教室「Unityプロジェクト完全支援プラン」

Unity徹底サポートサービス|Unity運用のお悩みをプロが完全バックアップ!

月額38,000円
❏ 専属講師が24時間体制で、いつでもテキストによる質問にお答えします!【1日1回】
❏ 専属講師が、月2回×60分のビデオチャットで、あなたのプロジェクトを徹底サポート!
❏ Unity開発の一部をお任せいただけます。常に開発代行料金が20%割引でご提供!

Unityの課題はプロにお任せください。詳細を今すぐご確認を!
サービスの詳細はこちら
https://ryuryu.memberpay.jp/plan/item/epeiywt

Discussion