この記事でわかること
- 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のキャッシュ)も意識しよう!