top of page

Unityのコルーチンで使う yield return の書き方 徹底まとめ

  • 5 時間前
  • 読了時間: 6分

この記事はファイブボックス公式 note の記事を編集したものです。併せて以下の記事もご参照ください。


Unityで時間差の処理を作りたいときによく使うのが コルーチン です。

通常の関数は、上から下まで一気に処理が実行されます。しかしコルーチンを使うと、

「少し待ってから次の処理をする」「条件を満たすまで待つ」「別のコルーチンが終わるまで待つ」

といった処理を作ることができます。

そのときに重要になるのが、yield return です。


コルーチンの基本形


コルーチンは、戻り値の型を IEnumerator にして作ります。


using System.Collections;
using UnityEngine;

public class SampleCoroutine : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        Debug.Log("開始");

        yield return new WaitForSeconds(2f);

        Debug.Log("2秒後に実行");
    }
}

この例では、Debug.Log("開始"); が実行されたあと、2秒待ってからDebug.Log("2秒後に実行"); が実行されます。


yield return の後に使える主な書き方


1. yield return null

yield return null;

これは 1フレーム待つ という意味です。

例えば、毎フレーム少しずつ処理したいときに使います。

IEnumerator MoveObject()
{
    while (true)
    {
        transform.position += Vector3.right * Time.deltaTime;

        yield return null;
    }
}

この場合、1フレームごとにオブジェクトが少しずつ右に移動します。


よく使う場面

  • 毎フレーム処理したいとき

  • 少しずつ移動させたいとき

  • アニメーション的な処理を自作したいとき

  • 1フレームだけ待ってから次の処理をしたいとき


2. yield return new WaitForSeconds(秒数)

yield return new WaitForSeconds(2f);

これは 指定した秒数だけ待つ という意味です。

IEnumerator Attack()
{
    Debug.Log("攻撃開始");

    yield return new WaitForSeconds(1f);

    Debug.Log("攻撃終了");
}

この場合、攻撃開始から1秒後に攻撃終了の処理が実行されます。


よく使う場面

  • 数秒後に処理したい

  • 敵の出現間隔を作りたい

  • カウントダウンを作りたい

  • 攻撃後の待ち時間を作りたい

  • メッセージを一定時間表示したい


3. yield return new WaitForSecondsRealtime(秒数)

yield return new WaitForSecondsRealtime(2f);

これは ゲーム内の時間停止の影響を受けずに待つ 書き方です。

通常の WaitForSeconds は、Time.timeScale の影響を受けます。

例えば、

Time.timeScale = 0;

としてゲームを一時停止している場合、WaitForSeconds も止まります。

しかし、WaitForSecondsRealtime は現実時間で待つため、Time.timeScale が 0 でも時間が進みます。

IEnumerator PauseMessage()
{
    Time.timeScale = 0;

    Debug.Log("一時停止中");

    yield return new WaitForSecondsRealtime(2f);

    Debug.Log("2秒後に表示");

    Time.timeScale = 1;
}

よく使う場面

  • ポーズ中でも処理を進めたい

  • UI演出を現実時間で動かしたい

  • ゲーム停止中にメッセージを表示したい


4. yield return new WaitUntil(条件)

yield return new WaitUntil(() => 条件);

これは 条件が true になるまで待つ 書き方です。

IEnumerator WaitPlayerReady()
{
    Debug.Log("プレイヤーの準備待ち");

    yield return new WaitUntil(() => isReady == true);

    Debug.Log("ゲーム開始");
}

isReady が true になるまで、次の処理には進みません。

入力待ちにも使える

IEnumerator WaitSpaceKey()
{
    Debug.Log("スペースキーを押してください");

    yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));

    Debug.Log("スペースキーが押されました");
}

よく使う場面

  • プレイヤーの入力を待つ

  • 何かのフラグが true になるまで待つ

  • アニメーション終了を待つ

  • 敵が全滅するまで待つ

  • ロード完了を待つ


5. yield return new WaitWhile(条件)

yield return new WaitWhile(() => 条件);

これは 条件が true の間、待ち続ける 書き方です。

WaitUntil と似ていますが、考え方が少し逆です。

IEnumerator WaitWhileMoving()
{
    Debug.Log("移動が終わるまで待機");

    yield return new WaitWhile(() => isMoving == true);

    Debug.Log("移動終了");
}

この場合、isMoving が true の間は待機します。isMoving が false になると次の処理に進みます。

よく使う場面

  • 移動中は待つ

  • 攻撃中は待つ

  • 処理中フラグが false になるまで待つ

  • ローディング中は待つ


6. yield return StartCoroutine(別のコルーチン())

yield return StartCoroutine(OtherCoroutine());

これは 別のコルーチンが終わるまで待つ 書き方です。

IEnumerator MainCoroutine()
{
    Debug.Log("メイン処理開始");

    yield return StartCoroutine(SubCoroutine());

    Debug.Log("サブ処理が終わったので次へ進む");
}

IEnumerator SubCoroutine()
{
    Debug.Log("サブ処理開始");

    yield return new WaitForSeconds(2f);

    Debug.Log("サブ処理終了");
}

この場合、SubCoroutine() が完全に終わってから、MainCoroutine() の続きが実行されます。

よく使う場面

  • 演出を順番に実行したい

  • 会話イベントを順番に進めたい

  • フェードアウト後にシーン移動したい

  • 攻撃処理が終わってから次の処理をしたい


7. yield break

yield break;

これは コルーチンを途中で終了する 書き方です。

IEnumerator Sample()
{
    Debug.Log("開始");

    if (isCancel)
    {
        yield break;
    }

    yield return new WaitForSeconds(1f);

    Debug.Log("終了");
}

isCancel が true の場合、そこでコルーチンが終了します。その後の処理は実行されません。

よく使う場面

  • 条件によって処理を中断したい

  • キャンセル処理を作りたい

  • エラー時にコルーチンを終了したい


まとめ よく使う yield return 一覧


  • 1フレーム待つ yield return null;

  • 指定秒数待つ yield return new WaitForSeconds(秒数);

  • 現実時間で指定秒数待つ yield return new WaitForSecondsRealtime(秒数);

  • 条件が true になるまで待つ yield return new WaitUntil(() => 条件); 

  • 条件が true の間待つ  yield return new WaitWhile(() => 条件); 

  • 別のコルーチンが終わるまで待つ yield return StartCoroutine(コルーチン());

  • コルーチンを途中で終了する yield break; 


WaitForSeconds と WaitForSecondsRealtime の違い

初心者が混乱しやすいのが、この2つの違いです。


WaitForSeconds

yield return new WaitForSeconds(2f);

これはゲーム内時間で2秒待ちます。

そのため、次のように時間を止めている場合、

Time.timeScale = 0;

WaitForSeconds も止まります。


WaitForSecondsRealtime

yield return new WaitForSecondsRealtime(2f);

これは現実時間で2秒待ちます。

Time.timeScale = 0; でゲームが止まっていても、2秒後に次の処理へ進みます。


使い分けの目安


  • 使いたい場面おすすめ通常のゲーム中の待機⇒ WaitForSeconds

  • ポーズ中でも進めたい処理⇒ WaitForSecondsRealtime

  • UIの一時表示状況により使い分けゲーム時間に合わせたい演出⇒ WaitForSeconds

  • 現実時間で進めたい演出⇒ WaitForSecondsRealtime


コルーチンを止める方法

開始したコルーチンは、途中で止めることもできます。


1. StopCoroutine を使う

Coroutine currentCoroutine;

void Start()
{
    currentCoroutine = StartCoroutine(MyCoroutine());
}

void Stop()
{
    StopCoroutine(currentCoroutine);
}

IEnumerator MyCoroutine()
{
    while (true)
    {
        Debug.Log("実行中");

        yield return new WaitForSeconds(1f);
    }
}

このように、開始したコルーチンを変数に入れておくと、あとから停止できます。


2. StopAllCoroutines を使う

StopAllCoroutines();

これは、そのスクリプト内で動いているすべてのコルーチンを停止します。

便利ですが、意図しないコルーチンまで止まる可能性があるため、使うときは注意が必要です。


コルーチンを使うときの注意点


1. IEnumerator を忘れない

コルーチンは、普通の void 関数ではなく IEnumerator で作ります。

IEnumerator MyCoroutine()
{
    yield return new WaitForSeconds(1f);
}

2. StartCoroutine で呼び出す

コルーチンは、普通の関数のように呼び出すだけでは正しく動きません。

StartCoroutine(MyCoroutine());

のように呼び出します。


3. while (true) を使うときは yield return を入れる

次のようなコードは危険です。

IEnumerator BadCoroutine()
{
    while (true)
    {
        Debug.Log("無限ループ");
    }
}

このように yield return がないと、Unityが固まる原因になります。固まった時はタスクマネジャーを起動してUnityEditorを停止しましょう。

正しくは、次のようにします。

IEnumerator GoodCoroutine()
{
    while (true)
    {
        Debug.Log("1フレームごとに実行");

        yield return null;
    }
}

無限ループを使う場合は、必ず中に yield return を入れるようにしましょう。


まとめ

Unityのコルーチンでは、yield return を使うことで処理の途中に「待ち時間」や「待機条件」を入れることができます。

特によく使うのは、次の3つです。


1,1フレーム待つ

yield return null;

2,指定秒数待つ

yield return new WaitForSeconds(1f);

3,別のコルーチンが終わるまで待つ

yield return StartCoroutine(OtherCoroutine());

コルーチンを使えるようになると、Unityでの時間管理や演出処理がとても作りやすくなります。

例えば、

  • 敵を一定間隔で出す

  • メッセージを数秒表示する

  • 攻撃後に少し待つ

  • フェード演出後にシーンを切り替える

  • 入力されるまで待つ

  • アニメーションが終わるまで待つ

といった処理を、わかりやすく書けるようになります。

Unityでゲームを作るうえで、コルーチンと yield return はとても便利な機能なので、ぜひ使い方を覚えておきましょう。


コメント


bottom of page