ゲーム開発エンジンのUnityには、様々な関数が存在しています。
中でも今回ご紹介するのは、指定した関数を時間遅れで呼び出す「Invoke」という関数です。
この記事では、Invokeとは何か、コルーチンとの違いは何かについて解説していきます。
UnityでInvoke関数を使ってみたい、コルーチンとどちらを使えばいいのかわからないという方向けに解説しますので、ぜひ最後までご覧ください。
目次
|Unityとは
Unityは、ユニティ・テクノロジーズ社が提供するゲーム開発プラットフォームで、3D/2Dゲーム開発に対応しており、その物理エンジンが有名です。
特に、マルチプラットフォームに対応している点が特徴で、Windows、Mac、Linuxなどのデスクトップや、iOS、Androidなどのモバイルデバイス、さらにはPlayStationやXboxなどのゲームコンソールにも対応しています。
また、Unityではプログラミングなしでゲームを開発することも可能で、直感的にゲームを作成することができます。
これらの特性により、Unityはゲーム開発だけでなく、医療、建築設計、VRコンテンツ開発など、様々な分野で活用されており、ゲーム開発者にとって非常に有用なツールとなっています。
詳しくは、こちらの記事で解説しています。
|Invokeとは
Invokeとは指定した時間後に指定した関数を呼び出すというものです。
3秒後にこの関数を呼び出したいなど、このオブジェクトを時間差で非表示にしたいなど、そんな場面で役立ちます。
また、似た機能を持つコルーチンという関数もあり、そちらとの違いについても解説していきます。
|Invokeでできること
冒頭でも伝えた通り、Invokeは指定した関数を遅延実行することができる関数です。
Invokeには4種類ほどあります。
・Invoke()
・InvokeRepeat()
・CancelInvoke()
・IsInvoke()
それぞれについて、この後の見出しで詳しく解説していきます。
|Invokeの使い方
では、具体的にそれぞれのInvokeの使い方について解説していきます。
Invoke関数
Invoke(stirng”関数名”, float 遅延時間「秒単位」);という形で記述します。
ここで、第一引数には呼び出したい関数名を文字列で指定し、第二引数には何秒後に関数を呼び出したいかをfloat型の値で指定します。
以下は、Invokeを使用したサンプルコードになります。
using UnityEngine;
public class Invoke_Sample : MonoBehaviour {
void Start () {
Invoke (“Test1”, 3.0f); // 関数Test1を3秒後に実行
}
void Test1 () {
Debug.Log (“Invoke Test”);
}
}
実行結果 (シーン開始から3秒経過後、Consoleに以下のログがでます)
Invoke Test
InvokeRepeating関数
InvokeRepeatingはUnityのスクリプトで使用されるメソッドで、指定した関数を一定時間後から一定間隔で実行することができます。
以下に、InvokeRepeatingの基本的な使用方法を示します:
using UnityEngine;
public class InvokeRepeating_Sample : MonoBehaviour {
void Start () {
InvokeRepeating(“FunctionName”, delay, repeatRate);
}
void FunctionName()
{
// ここに実行したい処理を書く
}
}
InvokeRepeating(string methodName, float time, float repeatRate)の各引数は以下の通りです。
methodName:実行したい関数名を文字列で指定します。
time:何秒後に実行したいかをfloat型の値で指定します(整数でも可)。
repeatRate:何秒間隔で繰り返し実行したいかをfloat型の値で指定します(整数でも可)。
注意点として、関数名を文字列で指定するため、スペルミスに気をつける必要があります。
また、InvokeRepeatingを停止するにはCancelInvokeを使用します。
CancelInvoke関数
CancelInvokeは、Unityのスクリプトで使用されるメソッドで、InvokeやInvokeRepeatingを取り消するために使用されます。
CancelInvoke()を実行すると、スクリプト中のInvokeとInvokeRepeatingが取り消されます。
Invokeに関しては、指定した秒数が経過する前(遅延実行前)であればCancelInvokeで取り消されます。
CancelInvoke(string methodName)を実行すると、指定した関数名のInvokeもしくはInvokeRepeatingが取り消されます。
using UnityEngine;
public class CancelInvloke_Script : MonoBehaviour
{
public GameObject projectile;
void Start()
{
// 2秒後から、0.3秒ごとに”LaunchProjctile”が呼び出される。
InvokeRepeating(“LaunchProjectile”, 2, 0.3F);
}
void LaunchProjectile()
{
// projectileというGameObjectを作成し、その速度をランダムな方向に設定する。
GameObject instance = Instantiate(projectile);
Rigidbody rigidbody = instance.GetComponent<Rigidbody>();
rigidbody.velocity = Random.insideUnitSphere * 5;
}
void Update()
{
// Cancel only the LaunchProjectile invoke
if (Input.GetButton(“Fire1”))
{
CancelInvoke(“LaunchProjectile”);
}
}
}
このスクリプトでは、StartメソッドでInvokeRepeatingを使用して、2秒後から0.3秒ごとにLaunchProjectileメソッドを呼び出しています。
そして、UpdateメソッドでFire1ボタンが押されたときに、CancelInvoke(“LaunchProjectile”)を呼び出してLaunchProjectileの呼び出しを取り消しています。
このように、CancelInvokeは特定のタイミングで遅延実行を停止するために使用できます。
IsInvoking関数
IsInvokingはUnityのスクリプトで使用されるメソッドで、呼び出し待ち状態のInvokeやInvokeRepeatingがあるかないかを判定し、bool型で返します。
IsInvoking(string methodName)は、引数で関数名を指定したInvokeもしくはInvokeRepeatingが呼び出し待ち状態であるかないかをbool型で返します。
using UnityEngine;
public class IsInvoking_Script : MonoBehaviour
{
public GameObject projectile;
void Start()
{
Invoke(“LaunchProjectile”, 2.0f);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && !IsInvoking(“LaunchProjectile”))
{
Invoke(“LaunchProjectile”, 2.0f);
}
}
void LaunchProjectile()
{
GameObject instance = Instantiate(projectile);
Rigidbody rigidbody = instance.GetComponent<Rigidbody>();
rigidbody.velocity = Random.insideUnitSphere * 5;
}
}
このスクリプトでは、StartメソッドでInvokeを使用して、2秒後にLaunchProjectileメソッドを呼び出しています。
そして、UpdateメソッドでSpaceキーが押されたときに、IsInvoking(“LaunchProjectile”)がfalse(つまり、LaunchProjectileが実行待機状態でない)であれば、再度Invokeを呼び出してLaunchProjectileの呼び出しをスケジュールしています。
このように、IsInvokingは特定のタイミングで遅延実行がスケジュールされているかを確認するために使用できます。
|Invokeとコルーチンの違い
Unityでは、「Invoke」と「Coroutine」という2つの関数は、任意の秒数後に遅れて実行する処理を行うことができます。
コルーチンについてとInvokeとの違いについて解説していきます。
コルーチンとは
UnityのCoroutineは、特定の処理を一定時間遅れて実行するための強力なツールです。
これは長時間続くタスクを小さな部分に分割して、ゲームのフレームレートに深刻な影響を与えることなく、非同期に処理を行う能力があります。
特に、ゲームにおけるアニメーションのタイミング制御、遅延処理、連続するイベントのスケジューリングなどに役立ちます。
「yield return」ステートメントを使用することで、Coroutineの実行を一時停止し、特定の条件下で再開することが可能です。
例えば、yield return new WaitForSeconds(5)と記述すると、その次の処理は5秒間遅延されます。
また、複数のCoroutineを同時に呼び出すことも可能で、非常に複雑な動作の制御やタイミング制御を行うことができます。
詳しくは、こちらの記事で解説しています。
Invokeとコルーチンの違いは?
Unityにおいて、「Invoke」と「Coroutine」という2つの関数は一定の遅れて実行する処理を行う際に頻用されます。
この2つの関数は同様の目的を持ちつつも、特長と適しているシーンはそれぞれ異なります。
「Invoke」は簡単に利用できる遅延処理関数で、指定した関数を設定した時間後に呼び出すことが可能です。
しかし、一連の遅延処理や流れの中の遅延は扱えません。
そのような場合に適しているのが「Coroutine」で、複雑な制御や連続する遅延処理が表現可能です。
例を具体化すると、Coroutineを使用すると「オブジェクトの生成とその5秒後の消去」のような処理をまとめて記述することができます。
一方で、Invokeは「5秒後にオブジェクトを作成」や「5秒後にオブジェクトを削除」のような単発の時間遅延操作に最適です。
よって、Invokeは単純な遅延処理に、Coroutineは連続する複雑な遅延処理にそれぞれ使用することで、適切に機能を活用できます。
|まとめ
今回は、UnityにおけるInvoke関数についてでした。
Invoke関数は、遅延時間後に実行したい関数があるときに役立ちます。
Unityを最大限活用できるように、Invoke関数をマスターしましょう!