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