MRが楽しい

MRやVRについて学習したことを書き残す

UnityでMonoBehaviourのInvokeを使って指定秒後に処理を呼び出す その2(繰り返し実行する)

本日はUnityの小ネタ枠です。
UnityでMonoBehaviourのInvokeを使って指定秒後に処理を呼び出す方法です。
今回は繰り返し実行するInvokeRepeatingの使い方です。

前回記事

Invokeの基本的な仕様は以下の前回記事を参照ください。
bluebirdofoz.hatenablog.com

MonoBehaviour.InvokeRepeating

MonoBehaviourのInvokeRepeatingは指定のメソッドを指定秒後に呼び出し、その後一定秒ごとに繰り返します。
docs.unity3d.com

void Start()
{
    // 2秒後から5秒間隔でDebugLogメソッドを呼び出す
    InvokeRepeating("DebugLog", 2.0f, 5.0f);
}
    
void DebugLog()
{
    Debug.Log("Hello, World!");
}

InvokeRepeatingの繰り返しを停止したい場合はMonoBehaviour.CancelInvokeを実行します。
また処理が実行中か否かはMonoBehaviour.IsInvokingでチェックできます。

サンプルスクリプト

以下の様々なInvokeの呼び出しを試すサンプルスクリプトを作成しました。
・InvokeRepeatingTest.cs

using UnityEngine;

public class InvokeRepeatingTest : MonoBehaviour
{
    void Start()
    {
        // 2秒後から5秒間隔でDebugLogメソッドを呼び出す
        InvokeRepeating("VoidDebugLog", 2.0f, 5.0f);
    }
    
    void VoidDebugLog()
    {
        // アプリの起動時からの経過時間を取得する
        float elapsedTime = Time.time;
        Debug.Log($"Called VoidDebugLog() : {elapsedTime}");
    }
    
    [ContextMenu("StopInvokeRepeating")]
    public void StopInvokeRepeating()
    {
        // 現在Invokeによる実行が保留中かチェックする
        if (!IsInvoking("VoidDebugLog"))
        {
            Debug.Log("Invokeによる実行が保留中ではありません");
            return;
        }
        
        // InvokeRepeatingを停止する
        CancelInvoke("VoidDebugLog");
        Debug.Log("InvokeRepeatingを停止しました");
    }
}

シーンを再生すると以下の通り指定時間後に処理が繰り返して実行されます。

繰り返し処理を停止するにはコンテキストメニューからStopInvokeRepeating関数を呼び出します。

繰り返し処理が実行中の場合は呼び出しが停止されます。

停止後、再度StopInvokeRepeating関数を呼び出すとMonoBehaviour.IsInvokingでfalseが返っているのが確認できます。