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で使ったときの動かない問題」について解説していこうと思います。

