Unityではコルーチンを使うと一定時間毎に何らかの処理を行わせる事が出来ました。
似たような処理をInvokeを使うともっと手軽に実現出来ます。
Invokeは指定時間後に指定した関数を実行する事が出来る関数です。
Invokeの機能を確認するInvokeTestスクリプトの作成
サンプルを作って確認してみましょう。
InvokeTestスクリプトを作成し、Main Cameraに取り付けます。
Invokeで指定して実行するメソッドを作成します。
InstantiateGameObjectメソッドを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | using UnityEngine; using System.Collections; public class InvokeTest : MonoBehaviour { // インスタンス化するゲームオブジェクト [SerializeField] private GameObject prefab; public void InstantiateGameObject() { // ランダムな位置とランダムな角度でインスタンス化(Random.rotationの代わりにRandom.rotationUniformでも出来る) var instance = Instantiate<GameObject>(prefab, Random.insideUnitSphere * 5f, Random.rotation); Destroy(instance, 10f); } } |
InstantiateGameObjectメソッドはインスペクタで設定したゲームオブジェクトをインスタンス化するメソッドです。
Random.insideUnitSphereは半径1の球体の内部のランダムな点を返します。
その為Vector3のX、Y、Zの値を-1から1の間で得られる事が出来ます。
Random.rotationはQuaternion値をランダムで得られます。
Random.rotationの代わりにRandom.rotationUniformを使っても同じです。
インスタンス化した後、Destroy関数を使用して10秒たったら消しています。
InvokeでInstantiateGameObjectを指定する
実行するメソッドが出来たのでInvokeを使って実行してみましょう。
1 2 3 4 5 | void Start() { Invoke ("InstantiateGameObject", 5f); } |
Startメソッド内でInvokeの第1引数にメソッド名を指定し、第2引数に何秒後に実行するかを指定します。
今回の場合はこのスクリプトを設定したゲームオブジェクトが登場してから5秒後にInstantiateGameObjectメソッドを実行します。
一定時間毎に実行するInvokeRepeatingを使う
さきほど紹介したInvokeで指定時間後にメソッドを実行する事が出来ましたが繰り返し処理を行う事は出来ませんでした。
しかし、指定時間後に関数を実行した後、定期的にその処理を続けたい事もあります。
そんな時はInvokeRepeatingメソッドを使用します。
1 2 3 4 5 | void Start() { InvokeRepeating ("InstantiateGameObject", 5f, 2f); } |
↑の例では5秒後にInstantiateGameObjectメソッドを実行した後、2秒間隔でInstantiateGameObjectメソッドを実行するようになります。
これで定期的に処理をする事が出来るようになりましたが、開始したら停止する術も必要です。
CancelInvoke関数を使うと実行しているInvokeを停止する事が出来ます。
1 2 3 4 5 6 7 8 9 10 11 | void Update () { if(Input.GetButtonDown("Fire1")) { Debug.Log("手動でインスタンス化"); InstantiateGameObject(); } else if(Input.GetButtonDown("Fire2")) { Debug.Log("インスタンス化をやめる"); CancelInvoke(); } } |
↑の例ではマウスの左ボタンを押したら普通にInstantiateGameObjectメソッドを呼び出し、マウスの右ボタンを押したらInvokeを停止します。
InvokeやInvokeRepeating、CancelInvokeは定義されているクラス名を省略してそのままメソッド名で使用出来ていますが、
これはそれらがMonoBehaviourクラスで定義されていているからです(JavaScriptの場合はデフォルトでMonoBehaviourを継承して作成されます)。
Invokeのサンプルを実行して確認する
Invokeのサンプルが作成出来たので、Main Cameraに作成したスクリプトを取りつけインスペクタでインスタンス化するゲームオブジェクトを設定し実行します。
↑のように最初InvokeとInvokeRepeatingが実行され5秒後にInstantiateGameObjectが実行されるのでゲームオブジェクトが2つ表示されます。
その後2秒間隔でInvokeRepeatingで指定したInstantiateGameObjectが実行されていきます。
マウスの右ボタンを押してCancelInvokeをするとInvokeRepeatingの実行が停止されます。
コルーチンとInvokeの使い分け
Invokeを使えばコルーチンを使うよりもわかりやすく簡単に定期的な処理を実行する事が出来ます。
ですがInvokeでは一時停止したあと再開させたりといった処理が出来ません。
メソッド名指定の所で引数を指定出来なかったり、戻り値もないので使いどころとしては指定時間後に何らかの処理をしたい時や単純な繰り返し処理をさせたい時に使うといいかもしれません。
コルーチンの場合は一時停止や再開といった柔軟な繰り返し処理が出来ます。