Unityにおけるコルーチン入門
C# のコルーチンを使いこなして処理をコントロールしよう
TL;DR
- コルーチンは Unity 独自の機能で、処理を複数フレームにまたいで実行できる。
- IEnumerator と yield return を使うことで「待ち時間」や「条件待ち」を自然に記述できる。
- 時間差イベントやアニメーション制御に便利。
- ただし「スレッドではない」ため、重い処理を分散することはできない。
1. コルーチンとは?
通常のメソッドは呼び出すと最後まで一気に実行されます。
しかしゲーム開発では、例えば:
- 3秒後に次の処理をしたい
- フレームごとに少しずつ進めたい
- ある条件が満たされるまで待ちたい
といったニーズがよく出てきます。
そこで役立つのが コルーチン(Coroutine) です。
2. イラストで理解する「処理の流れ」
通常のメソッド:
Start()
├─処理A
├─処理B
└─処理C ← 一気に実行
コルーチンを使った場合:
StartCoroutine()
├─処理A
├─yield return 3秒待つ
│
├─処理B(3秒後に再開)
├─yield return 次のフレームまで待つ
│
└─処理C(次フレームで再開)
➡ 「一度止まって、後から再開できる」のがポイントです。
3. 基本コード例
using System.Collections;
using UnityEngine;
public class CoroutineSample : MonoBehaviour
{
void Start()
{
StartCoroutine(SampleCoroutine());
}
IEnumerator SampleCoroutine()
{
Debug.Log("処理開始");
yield return new WaitForSeconds(3);
Debug.Log("3秒後の処理");
yield return null;
Debug.Log("次のフレームで処理");
}
}
4. よく使う yield return
| 記述 | 意味 |
|---|---|
| yield return null; | 1フレーム待つ |
| yield return new WaitForSeconds(3); | 3秒待つ |
| yield return new WaitUntil(() => 条件式); | 条件が満たされるまで待つ |
| yield return new WaitWhile(() => 条件式); | 条件が成立している間は待つ |
5. サンプルシーンで学ぶ
シーン構成例
- Main Camera
- Canvas
- UI → Text – TextMeshPro (UI: ログ表示用)
- GameController (Script付き)
スクリプト例
using System.Collections;
using UnityEngine;
using TMPro; // ← TextMeshProを使う場合に必要
public class GameController : MonoBehaviour
{
public TextMeshProUGUI logText; // ← Text → TextMeshProUGUI に変更
void Start()
{
StartCoroutine(OnboardingSequence());
}
IEnumerator OnboardingSequence()
{
logText.text = "ゲーム開始!";
yield return new WaitForSeconds(2);
logText.text = "敵が現れた!";
yield return new WaitForSeconds(3);
logText.text = "プレイヤーのターン!";
}
}
➡ 実行すると UI テキストが時間差で切り替わり、ゲームの進行演出を簡単に作れます。
6. 停止・再開
コルーチンを途中で止めたいときは以下のようにします。
Coroutine routine;
void Start()
{
routine = StartCoroutine(MyCoroutine());
}
void StopIt()
{
StopCoroutine(routine); // 個別停止
// StopAllCoroutines(); // 全停止
}
コルーチンは次の yield return に到達するまで今のフレームの処理を続けます。StopCoroutine を呼んだとき、コルーチンの状態によって挙動が変わります。
① コルーチンが「待ち中」のとき
yield return new WaitForSeconds(3); // ← ここで待機中に StopCoroutine
この場合、待機がキャンセルされてそこで終了します。
次の行(Debug.Log("3秒後の処理"))は実行されません。
② コルーチンが「実行中」のとき(yield と yield の間を走っている)
Debug.Log("処理開始");
// ← この辺を実行中に StopCoroutine を呼んでも…
yield return new WaitForSeconds(3); // ← ここまでは走り切る
StopCoroutine の効果は次のフレーム以降に反映されます。現在のフレームで走っている部分は最後まで実行され、次の yield return の手前で止まるイメージです。
まとめ
| 状況 | 挙動 |
|---|---|
| yield で待機中 | その時点でキャンセル、以降は実行されない |
| yield と yield の間を実行中 | 現フレームの処理は完了し、次の yield で止まる |
つまり「yield return の箇所で止まる」のは半分正解で、より正確には「次の yield return のタイミングで再開しない(=そこで終了する)」という理解が正確です。
ブログ記事の図で言うと、コルーチンは「一時停止ポイント」が yield return なので、StopCoroutine はその一時停止ポイントに来たとき「再開しない」という動作をします。
7. 注意点
- スレッドではない:並列処理ではなく「中断と再開」。
- MonoBehaviour依存:StartCoroutine は MonoBehaviour から呼び出す必要あり。
- 複雑なロジックは避ける:長すぎるコルーチンは可読性を損なう。
まとめ
コルーチンは 「待ち」を直感的に書ける Unity の仕組みです。
時間制御や演出に役立ちますが、「スレッドではない」点に注意しながら、ゲーム進行や UI アニメーションに活用していきましょう。



ディスカッション
コメント一覧
まだ、コメントがありません