Unity入門

【Unity】Coroutine(コルーチン)の使い方完全ガイド|待機・停止・フェード処理まで解説!

この記事でわかること

  • Coroutine(コルーチン)の基本的な使い方
  • フェード処理・スポーンなど、時間経過を使った処理の方法
  • yield returnの使い方と種類
  • Coroutineの途中停止方法(yield break)
  • メモリ効率を高める最適化の方法

Coroutine(コルーチン)とは?

ピッグダディ

Unityで「時間を待ってから処理を実行したい」ってこと、よくあるよね。そんなときに便利なのがCoroutine(コルーチン)だよ。

ピッグボーイ

あー、敵を3秒後に出したいとか、
Updateでやるには大変なんですよね…!

ピッグガール

BGMのフェードイン・フェードアウトとかにも使えるの?

ピッグダディ

もちろん!今回はCoroutineの基本的な使い方から、停止方法、フェード処理、最適化のコツまで、ぜーんぶわかりやすく解説していくよ!

Coroutine(コルーチン)の使い方

Coroutine(コルーチン)の概要

Coroutineは、Unityで「一定時間待ってから処理したい」「重い処理を分割したい」などの場面で使える仕組みで、IEnumerator型の関数として実装します。

特徴:

  • 時間経過に応じた演出に最適
  • Update()を使わずに非同期的に処理を実行できる
  • 処理の一時停止(yield)と再開が可能

※ 同期・非同期Unityライフサイクルについては下記のサイトを参考にしてください。

Coroutine(コルーチン)のスクリプト書き方(yield、wait)

Coroutineの基本的な使い方(yield) 一定時間待って処理する基本構文

using UnityEngine;
using System.Collections;

//3秒後に処理を実行する
public class CoroutineExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(ExampleCoroutine());
    }

    IEnumerator ExampleCoroutine()
    {
        Debug.Log("処理開始");
        yield return new WaitForSeconds(3); // 3秒待つ
        Debug.Log("3秒後に処理実行");
    }
}

Coroutine(コルーチン)の実践例

実践例①:フェードイン・フェードアウト(yield return null)

Coroutine(コルーチン)を使うと、スムーズなフェードイン・アウトを実現できます。
➡ yield return null;を使うと、毎フレーム処理が実行される!
➡ canvasGroup.alphaを少しずつ減らすことで、緩やかなフェードアウトができる!

using UnityEngine;
using System.Collections;

//フェードアウト(徐々に透明にする)
public class FadeEffect : MonoBehaviour
{
    public CanvasGroup canvasGroup;

    public void StartFadeOut()
    {
        StartCoroutine(FadeOut());
    }

    IEnumerator FadeOut()
    {
        while (canvasGroup.alpha > 0)
        {
            canvasGroup.alpha -= Time.deltaTime / 2; // 2秒かけてフェードアウト
            yield return null;
        }
    }
}

実践例②:一定間隔で敵をスポーン

➡ while (true)で、永続的に処理を続けられる!
➡ WaitForSeconds(5)で、5秒ごとに敵をスポーン!

using UnityEngine;
using System.Collections;

//5秒ごとに敵を生成
public class EnemySpawner : MonoBehaviour
{
    public GameObject enemyPrefab;
    public Transform spawnPoint;

    void Start()
    {
        StartCoroutine(SpawnEnemies());
    }

    IEnumerator SpawnEnemies()
    {
        while (true)
        {
            Instantiate(enemyPrefab, spawnPoint.position, Quaternion.identity);
            yield return new WaitForSeconds(5);
        }
    }
}

Coroutine(コルーチン)の停止・終了

Coroutineの途中停止方法(yield break)

➡ yield break;を使うと、強制的にコルーチンを終了できる!

//条件を満たしたら即終了
IEnumerator FadeOut()
{
    while (true)
    {
        if (canvasGroup.alpha <= 0)
        {
            yield break; // コルーチンを即終了
        }
        canvasGroup.alpha -= Time.deltaTime / 2;
        yield return null;
    }
}

Coroutine(コルーチン)のパフォーマンス最適化

最適化①:WaitForSecondsRealtimeでGC対策

WaitForSeconds()は毎回新しいオブジェクトを生成するため、メモリ負荷を軽減するためにWaitForSecondsRealtime()使うと良い

private WaitForSecondsRealtime waitTime = new WaitForSecondsRealtime(1.0f);

IEnumerator ExampleCoroutine()
{
    yield return waitTime; // GCの負担を減らす
    Debug.Log("1秒後の処理");
}

最適化②:IEnumeratorのキャッシュ

IEnumeratorをキャッシュすると、余計なメモリ確保を防ぐ!

private IEnumerator fadeOutCoroutine;

void Start()
{
    fadeOutCoroutine = FadeOut();
}
void StartFade()
{
    StartCoroutine(fadeOutCoroutine);
}

まとめ

  • Coroutineは時間制御・非同期処理に最適な仕組み
  • yield returnで処理を一時停止/再開できる
  • yield breakで途中停止も可能
  • 最適化のポイント(WaitForSecondsのキャッシュ)も意識しよう!