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

「コルーチンって便利そうだけど、結局いつ使えばいいの?」
結論から言うと、コルーチンは時間をまたぐ処理を、読みやすく書くための仕組みです。
ただし、何でもコルーチンにすると逆にバグの温床になることもあります。
この記事では、Unity初心者でも迷わないように、
-
コルーチンとは何か
-
正しい使いどころ
-
逆に使わないほうがいい場面
-
よくある落とし穴と対策
について解説していきます。これから、ゲーム開発にコルーチンを取り入れたいと思っている方の参考になればと思います。
コルーチン(Coroutine)って何?

コルーチンは「処理を途中で止めて、あとで再開できる」仕組みです。
よく使うのがyield return new WaitForSeconds(1f);みたいな書き方で、
「1秒待ってから続きをやる」みたいな流れを、1本の処理として見える形で書けるのが強みです。
まず覚えておくと楽:コルーチンが得意なこと
コルーチンは、このタイプの処理が得意です。
-
少し待ってから実行したい(遅延)
-
一定時間かけて変化させたい(フェード、移動、演出)
-
順番に処理したい(演出の手順、チュートリアルの進行)
-
毎フレームUpdateで状態管理するのが面倒なもの
逆に言うと、「フレームごとの常時監視」や「重い処理の分割」には向きません(後で詳しく)
コルーチンの正しい使いどころ
1) 〇秒待ってから処理したい(遅延実行)
たとえば「被弾して0.5秒後に無敵解除」みたいなやつ。
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でかなり便利です。ただ、便利だからこそ「何でもコルーチン」にすると破綻します。
-
遅延
-
フェード
-
演出の順番
このあたりに絞って使うと、かなり良い感じになります。

