Developer

【初心者Unity】Invokeを使って関数を数秒後に実行する方法
2022.01.12
Lv1

【初心者Unity】Invokeを使って関数を数秒後に実行する方法

1.Invokeについて

Invoke は指定した関数を遅延実行できる仕組みです。
「ゲームを開始して3秒後に処理を実行」、「ボタンを押した1秒後に実行」のようなロジックを作ることが出来ます。

Invoke(string methodName, float time)
Invokeの使い方を見てみましょう。

using UnityEngine;

public class Invoke_Sample : MonoBehaviour {

	void Start() {
		Invoke("Test1", 3.0f); // 関数Test1を3秒後に実行
	}

	void Test1() {
		Debug.Log("Invoke Test");
	}
}

実行結果(シーン開始から3秒経過時)

Invoke(“実行したい関数名”, 〇秒後) と記述することで、指定した関数を一定時間後に実行できます。
・第1引数には、関数名を文字列で指定する。
・第2引数には、何秒後に実行したいかをfloat型の値で指定する(整数でも可)。

Test1()は独自に作成したユーザ定義関数です。名前は自由です。
注意点は、関数名を文字列で指定することです。
文字列による記述はスペルミスをしてもコンパイルエラーとならないため、Invokeが動かない時はまずこの引数に間違いがないか確認してみましょう。

 

2.InvokeRepeatingについて

Invokeと似た仕組みでInvokeRepeatingがあります。
Invokeと同様、指定した関数を一定時間後に実行でき、さらに指定した間隔で実行を繰り返します。

InvokeRepeating(string methodName, float time, float repeatRate)
InvokeRepeatingの使い方を見てみましょう。

using UnityEngine;

public class InvokeRepeating_Sample : MonoBehaviour {

	void Start() {
		InvokeRepeating("Test2", 1.0f, 3.0f);
	}

	void Test2() {
		Debug.Log("InvokeRepeating Test");
	}
}

実行結果(シーン開始から16秒経過時)

InvokeRepeating(“実行したい関数名”, 〇秒後, 〇秒間隔) と記述することで、指定した関数を一定時間後から一定間隔で実行できます。
・第1引数には、関数名を文字列で指定する。
・第2引数には、何秒後に実行したいかをfloat型の値で指定する(整数でも可)。
・第3引数には、何秒間隔で繰り返し実行したいかをfloat型の値で指定する(整数でも可)。

Test2()も独自に作成したユーザ定義関数です。名前は自由です。
やはり注意点は、関数名を文字列で指定することです。スペルミスに気をつけましょう。

 

3.CancelInvokeについて

CancelInvokeは、InvokeやInvokeRepeatingをキャンセルできます。

CancelInvoke()
CancelInvoke()の使い方を見てみましょう。

void Update() {
	// スペースキーを押したら全てのInvokeをキャンセル
	if (Input.GetKeyDown(KeyCode.Space)) {
		CancelInvoke();
	}
}

CancelInvoke()を実行すると、すべてのInvokeとInvokeRepeatingがキャンセルされます。
Invokeに関しては、指定した秒数が経過する前(遅延実行前)であればCancelInvokeでキャンセルされます。

 

CancelInvoke(string methodName)
CancelInvoke(“関数名”)の使い方を見てみましょう。

void Update() {
	// スペースキーを押したらTest2が指定されているInvokeもしくはInvokeRepeatingをキャンセル
	if (Input.GetKeyDown(KeyCode.Space)) {
		CancelInvoke("Test2");
	}
}

CancelInvoke(“関数名”)を実行すると、指定した関数名のInvokeもしくはInvokeRepeatingがキャンセルされます。

 

4.IsInvokingについて

IsInvokingは実行待機状態のInvokeやInvokeRepeatingがあるか否かを判定します。

IsInvoking()
IsInvoking()は、いずれかの実行待機状態のInvokeやInvokeRepeatingがあるか否かをbool型で返します。
・実行待機しているInvokeがある → true
・実行待機しているInvokeがない → false

ここで言う実行待機状態とは、「Invokeが実行されてから指定した関数が遅延実行されるまでの間」のことを指します。

それではIsInvoking()の使い方を見てみましょう。

using UnityEngine;

public class IsInvoking_Sample : MonoBehaviour {

	void Start() {
		bool b1 = IsInvoking();
		Debug.Log(b1);          // false

		Invoke("Test1", 5.0f);

		bool b2 = IsInvoking();
		Debug.Log(b2);          // true

	}

	void Update() {
		Debug.LogError(IsInvoking());
	}

	void Test1() {
		Debug.Log("Test1");
	}
}

実行結果

Start内のIsInvokingは、Invokeの実行前はfalse、実行後はtrueを返しています。
Update内のIsInvokingは、実行待機中にtrueを返し続けていますが、5秒経ってTest1が実行された後は再びfalseを返していることがわかります。

 

IsInvoking(string methodName)
IsInvokingも関数名を指定することで特定のInvokeのみ待機状態の判定を行えます。

void Update() {
	Debug.Log(IsInvoking("Test2"));
}

この場合は関数Test2に対してのみ、Invokeによる遅延実行待機中かどうか判定されます。

以上、関数を遅延実行できるInvokeの紹介でした。
同じような繰り返しの仕組みであるコルーチンと比べると機能が薄いですが、その分簡単に記述出来ます。
遅延実行したい関数で引数を扱いたい場合などはコルーチンを使ってみましょう。⇒ コルーチンの使い方

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次