【Unity】一定時間間隔で処理を実行させる方法(コルーチン)

Unity

はじめに

こんにちは、とらんぽです。

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);
        }
    }
}

実行

うまく動きました。

以上です。

タイトルとURLをコピーしました