Invoke は一定のディレイ(遅延)後に
関数呼び出しをスケジュールする関数です
この関数を利用することでタイミングが
重要なシステムを便利に構築することができます
いま表示されているのは空っぽのゲームオブジェクトが配置された Unity のシーンです
このゲームオブジェクトには InvokeScript がアタッチされています
この InvokeScript には
public なゲームオブジェクト target があります
またこの他にも SpawnObject というメソッドもあります
SpawnObject メソッドは単純に target オブジェクトを
位置 (0, 2, 0) でインスタンス化しています
そして Start メソッドで Invoke 関数を呼び出しています
Invoke 関数は 2 つのパラメーターを取ります
呼び出したいメソッド名の文字列と
ディレイとして指定したい秒数です
つまりこの行では 2 秒後に SpawnObject メソッドが
呼び出されるように指定されているわけです
なお Invoke を使って呼び出せるのは
パラメーターを取らず戻り値の型がない(void)
メソッドのみです
さて Unity に戻りシーンを実行してみましょう
実行してみると 2 秒後にオーブが
インスタンス化されて地面に落ちるのが確認できます
確かにこれは一度メソッドを呼び出すには便利そうですが
同じメソッドを何度も呼び出すときはどうしたらいいでしょう?
そういった場合は 単純に
InvokeRepeating 関数を使います
このシーンでは同じ 空っぽの
ゲームオブジェクトがあります
ただし今回アタッチされているスクリプトは
InvokeRepeatingScript です
InvokeRepeatingScript の中は
基本的に InvokeScript とほぼ同じ構造で
作られているのが見えるでしょうか
引き続き target という名前の public なゲームオブジェクトがあり
SpawnObject メソッドもあります
そしてこのスクリプトの SpawnObject メソッドも
target オブジェクトをインスタンス化していますが
今回は X と Z の座標がランダムになっています
さてこのスクリプトの Start メソッドは
InvokeRepeating 関数を呼び出しています
この関数は 3 つの引数を取ります
最初は呼び出したい
メソッド名の文字列
次に メソッドを呼び出すまで待機する秒数
最後にメソッドを繰り返し呼び出す際の
間隔となる秒数です
つまりこの行では 2 秒後に SpawnObject メソッドが
呼び出され その後は
1 秒ごとに繰り返し 呼び出されます
では実際に見てみましょう
このシーンは Unity 上でそのまま実行できます
実行するとまず 2 秒後にオーブがインスタンス化され
その後は 1 秒ごとに
新たなオーブが作成されていきます
オーブは無限に生成されていくので
やがてシーンがオーブで埋め尽くされます
というわけで InvokeRepeating で呼び出した
メソッドをどのように止めるかを
理解しておくことは重要です
このスクリプトによる Invoke コールの
全インスタンスを止めるには
CancelInvoke メソッドを使います
なお特定の Invoke だけを止めたい場合は
止めたいメソッドの名前を含む文字列を
パースすることもできます