MRが楽しい

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

UnityでMonoBehaviourのInvokeを使って指定秒後に処理を呼び出す

本日はUnityの小ネタ枠です。
UnityでMonoBehaviourのInvokeを使って指定秒後に処理を呼び出す方法です。

MonoBehaviour.Invoke

MonoBehaviourのInvokeは指定のメソッドを指定秒後に呼び出します。
docs.unity3d.com

void Start()
{
    // 2秒後にDebugLogメソッドを呼び出す
    Invoke("DebugLog", 2.0f);
}
    
void DebugLog()
{
    Debug.Log("Hello, World!");
}

Invokeで呼び出すメソッドは引数を指定することはできません。
MonoBehaviour.StartCoroutineと異なり、戻りがIEnumeratorではない通常のメソッドでも呼び出し対象に指定できます。

サンプルスクリプト

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

using UnityEngine;

public class InvokeTest : MonoBehaviour
{
    void Start()
    {
        // 秒数指定が0の場合は直後(Update前)に実行される
        Invoke("VoidDebugLog", 0.0f);
        
        // 2秒後にメソッドを実行する
        Invoke("VoidDebugLog", 2.0f);
        
        // 負数の場合は指定なしまたは0秒と同様に即座に実行される
        Invoke("VoidDebugLog", -1.0f);
        
        // 戻り値があるメソッドもInvokeで呼び出せる
        Invoke("BoolDebugLog", 3.0f);
        
        // 引数があるメソッドはInvokeで呼び出せない
        Invoke("ArgumentDebugLog", 4.0f);
    }
    
    void VoidDebugLog()
    {
        Debug.Log("Called VoidDebugLog()");
    }
    
    bool BoolDebugLog()
    {
        Debug.Log("Called BoolDebugLog()");
        return true;
    }
    
    void ArgumentDebugLog(string message)
    {
        Debug.Log("Called ArgumentDebugLog() : " + message);
    }
}

以下の通り指定時間後に処理が実行されました。

引数があるメソッドは以下のエラーが発生して実行できません。

Trying to Invoke method: InvokeTest.ArgumentDebugLog couldn't be called.