オブジェクトを一定間隔で生成するようにコルーチンで指示を出す
どうもなおゆです。前回はInstantiateの使い方でした。
今回は備忘も兼ねて、コルーチンの使い方についてまとめます。
前回、プレハブを同じ座標に生成したら、オブジェクトが反発し合って弾け飛びました。
そこで今回は、コルーチンを使いプレハブの生成時間をズラすことで、オブジェクト同士の反発を防ぎたいと思います。
Coroutine(コルーチン)とは
Unityのスクリプトリファレンスから引用すると
コルーチンとは、実行を停止して Unity へ制御を戻し、その次のフレームで停止したところから続行することができる関数です。
うーん、何やら分かったような分からないような?スクリプトリファレンスは日本語が難しいのでよくあることです。
簡単に言うと「待て」ができる機能です。フレームを跨いで処理を行えるので「1秒後にハンバーガーを生成!」などの指示を出せる機能ですね。実際にコードを書いていきましょう。
まずはIEnumerator型のメソッドを宣言しよう
まずは処理する内容についてメソッドを作成してください。メソッド名の前にIEnumerator(アイエニュメレーター)を付けコルーチンで呼び出せるようにします。
コードの書き方(例)
private IEnumerator メソッド名()
{
// ここにやりたい内容のコードを書く
// 指定した秒数だけ停止
yield return new WaitForSeconds(秒f);
}
yield return(イールドリターン)のところで指定した秒数だけ停止します。
今回は3種類のプレハブを1秒間隔で生成したいのでこんな感じでコードを書きました。ちなみにコルーチンが始まると、呼び出されたこのメソッドは繰り返し呼び出されますので、やりたい事が終わったら yield break で停止してあげます。
public class SpawnScript : MonoBehaviour
{
// 食べ物を一定間隔で生み出す
private IEnumerator Spawn()
{
// 3回繰り返す
for (int i = 0; i < 3; i++)
{
// 食べ物を生成
Instantiate(foods[i], transform.position, transform.rotation);
// 1秒待つ
yield return new WaitForSeconds(1f);
// もし3回生成済だったらコルーチン終了
if (i == 3)
{
yield break;
}
}
}
}
StartCoroutine(スタートコルーチン)で作ったメソッドを呼び出し
先ほど作成したメソッドをStartCoroutineというもので呼び出し処理を行います。今回はStart部分で呼び出してみましょう。
public class SpawnScript : MonoBehaviour
{
public GameObject[] foods = new GameObject[3];
void Start()
{
// コルーチン開始
StartCoroutine("Spawn");
}
// 食べ物を一定間隔で生み出す
private IEnumerator Spawn()
{
// 3回繰り返す
for (int i = 0; i < 3; i++)
{
// 食べ物を生成
Instantiate(foods[i], transform.position, transform.rotation);
// 1秒待つ
yield return new WaitForSeconds(1f);
// もし3回生成済だったらコルーチン終了
if (i == 3)
{
yield break;
}
}
}
}
それでは実行してみましょう・・・レッツスポーン!
成功ですね。今回は思ったとおりに生成できました。
コルーチンは応用すると色々なことができますので、色々チャレンジしていきたいと思います。
次回は
次回は配列の要素をシャッフルする方法についてです。
配列の要素はハンバーガー、バナナ、寿司の順番になっていますが、その順番をランダムに並び替えできるようにメソッドを作ってみたいと思います。
コメント