【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は数秒後の処理を簡単に行うことができるので、使いこなせるようになりましょう!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次