はじめに
こんにちは、とらんぽです。
Unityでは、ライフサイクルの中で、毎フレームUpdateメソッドが実行されます。
ですが、「10秒間に1回づつこの処理を実行させたいな。」といった場面では先述のUpdateを使って実現するのはちょっと不便です。
そのようなときに使えるコルーチンという仕組みがUnityには用意されています。
使い方
コルーチンを使った時間差処理の基本的な書き方は以下の通りです。
時間差で実行させたい処理を関数にまとめて記述して、
private IEnumerator TestLoopFunction()
{
// 処理1をここに記述
// 10秒間待つ
yield return new WaitForSeconds(10);
// 10秒後に処理させたい処理2をここに記述
}
時間差の処理を始めたいタイミングに1度だけシステムにセットするイメージです。
void Start()
{
// コルーチンの設定
StartCoroutine("TestLoopFunction");
}
ポイント
処理を実装する関数の戻り値は「IEnumerator型」にする!
これはもう必須です。StartCoroutine()では、 IEnumerator型 のオブジェクトしか実行してくれないので、戻り値は必ずこれにしてください。
yield return new で待たせたい時間を指定
上の例ではyield return new WaitForSeconds(10);
と記述して、10秒待つように指定しましたが、ここを書き換えることによって、さまざまなパターンの待機時間を指定できます。
秒数指定で待機
yield return new WaitForSeconds(止めたい時間);
1フレーム待機
yield return null;
コルーチン終了
yield return break;
実装した関数をコルーチンとして実行する方法
IEnumerator testLoop;
// IEnumerator型の変数を用意して格納しておけば後ほど
//「StopCoroutine(testLoop)」でコルーチンンを止めることができるようになる。
testLoop = TestLoopFunction();
// コルーチンの実行
StartCoroutine(testLoop);
実装の例
準備
下図のように、EmptyObjectに、TestScriptをアタッチして、10秒間に1回「??回目の実行です」という文字が出力し、また3回目の実行でコルーチンを終了する処理を実装してみます。

スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestScript : MonoBehaviour
{
private int count; // カウンター
private IEnumerator testLoop; // 非同期処理メソッド格納用
void Start()
{
// カウンターを初期化
count = 0;
// 非同期処理を記述した関数を変数として保持
testLoop = TestLoopFunc();
// コルーチンの設定
StartCoroutine(testLoop);
}
private IEnumerator TestLoopFunc()
{
while (true)
{
// コルーチンはゲームオブジェクトが非アクティブ
// になると勝手に止まるので、無限ループでもOK
// カウントアップ
count++;
// ログ出力
Debug.Log(count + "回目の実行です。");
if (count == 3)
{
// 3回目の実行ならば
Debug.Log("処理を終了します。");
// コルーチンを停止
yield break;
}
// 10秒間に1度実行する設定
yield return new WaitForSeconds(10);
}
}
}
実行

うまく動きました。
以上です。
コメント