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 はとても便利な機能なので、ぜひ使い方を覚えておきましょう。






コメント