【Unity】Invokeの使い方!実行タイミングを自在に操ろう

unityにはinvokeという数秒後の処理をする関数があります。

この記事では、

  • invokeで何ができるの?
  • invokeの使い方
  • InvokeRepeating()
  • CancelInvoke()
  • IsInvoking()
  • invokeのよくある疑問

といったように、基本的な内容から少し応用的な内容までわかりやすく解説します!

目次

invokeで何ができるの?

invokeを使えば、設定した時間に関数を呼び出すことができます。例えば、2秒後にオブジェクトを消すといったようなことです。コルーチンでも似たような処理を行うことができます。

しかしコルーチンの場合はコードの量が少し多くなり面倒なので、簡単な処理を行いたい場合はinvokeで良いでしょう。

実際に使ってみよう

invokeは、

 invoke("呼び出す関数",秒数);

といったように使います。invokeを使うため自分で関数を作っておく必要があります。

それでは実際にやっていきましょう。今回は2秒後にオブジェクトを消すコードを書いていこうと思います。そのために適当にオブジェクトとスクリプトを作成し、オブジェクトにアタッチしておきましょう。コード内容は、

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    private void Start()
    {
        //2秒後にオブジェクトを消す
        Invoke("Destroy", 2);
    }

    //Invokeで使う
    void Destroy()
    {
        Destroy(gameObject);
        Debug.Log("消えた時間" + Time.time);
    }
}

実行結果は、

2秒後に消えていますね!このようにInvokeを使えば数秒後の処理を簡単に行えます。

応用的な使い方

Invokeの応用的な使い方として関連する関数を三つ紹介しましょう。

InvokeRepeating()

InvokeRepeatingはx秒に関数を呼び出して、y秒ごとに繰り返し呼び出すことができます。使い方は、

InvokeRepeating("呼び出す関数", 呼びだす秒数, なん秒ごとに呼び出すか(秒数));

といったように使います。実際に使ってみましょう。スタートから1秒たったら呼ばれ、2秒ごとに呼び出されるコードを書きます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    private void Start()
    {
        //1秒後に呼び出され、2秒ごとに呼び出される
        InvokeRepeating("Log", 1,2);
    }

    //Invokeで使う
    void Log()
    {
        Debug.Log(Time.time + ":呼び出された");
    }
}

実行結果は、

CancelInvoke()

CancelInvokeはInvokeの処理を取り消すことができます。例えばスペースボタンを押したらInvokeRepeatingの処理を取り消すことができます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        //1秒後に呼び出され、2秒ごとに呼び出される
        InvokeRepeating("Log", 1,2);
    }

    void Update()
    {
        //スペースボタンを押したらinvokeを呼び出さなくする
        if (Input.GetKey(KeyCode.Space))
        {
            CancelInvoke();
            Debug.Log("Invokeが止まる");
        }
    }

    //Invokeで使う
    void Log()
    {
        Debug.Log(Time.time + ":呼び出された");
    }
}

実行結果は、

IsInvoking()

IsInvokingはInvokeが呼び出されているかをbool型で返します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        //1秒後に呼び出され、2秒ごとに呼び出される
        InvokeRepeating("Log", 1,2);

        //Invokeが呼び出されているか
        Debug.Log("呼び出されているか:" + IsInvoking("Log"));

        //Invokeを止める
        CancelInvoke();
        Debug.Log("Invokeが止まる");

        //Invokeが呼び出されているか
        Debug.Log("呼び出されているか:" + IsInvoking("Log"));
    }

    //Invokeで使う
    void Log()
    {
        Debug.Log(Time.time + ":呼び出された");
    }
}

このコードはスタート関数の中でCancelInvoke()を呼び出し、その前後でIsInvokingの挙動はどのように変わるか確認するコードです。CancelInvoke()が呼び出される前はInvokeが呼び出されているのでtrueを返し、呼び出されたあとはfalseを返すはずです。

実際にそうなるか確認してみましょう。実行結果は、

予測した通りになっていますね。

invokeに対するよくある疑問

invokeとコルーチンの違い

感覚的な違いだと、invokeは簡単で、コルーチンは少し難易度が高いといった点で異なります。処理内容の違いでは、コルーチンは一連の流れの中で数秒後の処理を書けるがInvokeは書けないといった違いがあります。

例えばコルーチンを使えば『オブジェクトを作り、5秒後に消す』という一連の処理を一つにまとめて書くことができます。

一方でInvokeは『5秒後にオブジェクトを作る』や『5秒後にオブジェクトを消す』といったような形式でしか書けず、一連の処理は記述できません。

invokeが呼ばれないのはなぜ?

invokeが呼ばれない理由として考えられるのは書き間違いです。よくある間違いとしては引数の取り方ですね。

Invokeの一つ目の引数はString型である必要があります。ですので、invokeが呼ばれない場合は『” ”』を忘れているのかもしれません。

まとめ

いかがでしたか?この記事ではinvokeについて扱ってきました。invokeは数秒後の処理を簡単に行うことができるので、使いこなせるようになりましょう!

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次