はこねのはこ

はこねさんの備忘録

Unity Invokeの使い方メモ

はじめに

普段Unity開発してた時に、なんとなく使ってたInvoke
現在セットされているかや、キャンセルの仕方等がわかっていなかったので、 やり方を確認しました。
その時のメモです。

Invoke使い方

セットする

Invoke("CallFunction",5)

Invoke(関数名,時間)で実行します。
時間の単位は秒です。
5とすると5秒になります。
0.5fとすると0.5秒になります。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I)) 
        {
            Debug.Log("Invokeセットしました。");
            Invoke("CallFunction",5);
        }
    }

    void CallFunction()
    {
        Debug.Log("時間が経過しました。");
    }

f:id:hakonebox:20181013210918p:plain
5秒後に実行されました。

セットされているか確認する

IsInvoking("CallFunction")

isInvoking(関数名)を使用します。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I)) 
        {
            Debug.Log("Invokeセットしました。");
            Invoke("CallFunction",10);
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            Debug.Log(IsInvoking("CallFunction"));
        }

    }

    void CallFunction()
    {
        Debug.Log("時間が経過しました。");
    }

f:id:hakonebox:20181013210546p:plain
セットされている場合には戻り値はTrueになります。
CallFunction関数が実行後は戻り値はFalseになります。

キャンセルする

特定の関数のみキャンセルする

CancelInvoke("CallFunction")

cancelInvoke(関数名)を使用します。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I)) 
        {
            Debug.Log("Invokeセットしました。");
            Invoke("CallFunction",5);
            Invoke("CallFunctionCheck",5);
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            Debug.Log("キャンセルしました。");
            CancelInvoke("CallFunction");
        }
    }

    void CallFunction()
    {
        Debug.Log("時間が経過しました。");
    }
    void CallFunctionCheck()
    {
        Debug.Log("(確認用)時間が経過しました。");
    }

f:id:hakonebox:20181013211554p:plain
キャンセルしたCallFunction関数は実行されず、 CallFunctionCheck関数のみが実行されました。

全てキャンセルする

CancelInvoke()

cancelInvoke()引数なしで実行します。

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.I)) 
        {
            Debug.Log("Invokeセットしました。");
            Invoke("CallFunction",5);
            Invoke("CallFunctionCheck",5);
        }
        if (Input.GetKeyDown(KeyCode.C))
        {
            Debug.Log("キャンセルしました。");
            CancelInvoke();
        }
        if (Input.GetKeyDown(KeyCode.T))
        {
            Debug.Log("経過時間確認用");
        }
    }

    void CallFunction()
    {
        Debug.Log("時間が経過しました。");
    }
    void CallFunctionCheck()
    {
        Debug.Log("(確認用)時間が経過しました。");
    }

f:id:hakonebox:20181013212226p:plain

CallFunction関数もCallFunctionCheck関数も実行されませんでした。

おわりに

Invokeは使いやすくて私は好きです。