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