配列で管理しているオブジェクトをInstantiate関数で作成する。
前回はハンバーガー・バナナ・寿司のプレハブを配列に入れたので、今回ははそれをInstantiate関数(インスタンシエイト)を使って生成していきます。
Instantiate関数とは
Unityにおけるオブジェクト(ハンバーガーなど)は、ヒエラルキー画面から作成する事もありますが、実際はスクリプトに記載したコードによってオブジェクトを生成する場合の方が多いです。
その際に使用するのがInstantiate関数です。今回でいうと「ハンバーガーをこの座標に生成したい」「バナナはこっち」というのをInstantiate関数で指示しています。
コードの書き方(例)
例1)Instantiate(プレハブ, オブジェクトを生成する位置, オブジェクトの角度);
例2)Instantiate(prefab); //生成元の位置、角度のまま
例3)Instantiate (prefab, new Vector3(x, y, z), Quaternion.identity); // 無回転
例4)Instantiate(foods[0], transform.position, transform.rotation); // 今回はこれ
この関数をループに組み込むとクローンを大量に生成できますので、ハンバーガーを100個でも1000個でも生成できちゃいます。ハンバーガーはそんなにいらないけど、金の延べ棒とか作れたら最高ですね!
ちなみに、第4引数に「parent」を入れると、スクリプトをアタッチしたオブジェクトを親として、子オブジェクトを生成できたりもします。
コードの書き方(例)
var parent = this.transform; // 親オブジェクトのトランスフォーム
Instantiate (prefab, transform.position, transform.rotation, parent);
コードを追記して生成してみる
前回作ったSpawnScriptのコードにInstantiate関数を組み込んでいきます。
Spawnメソッドを作り、Startメソッドで呼び出せるようにしていきます。
public class SpawnScript : MonoBehaviour
{
public GameObject[] foods = new GameObject[3];
void Start()
{
Spawn(); // スポーン!
}
void Spawn() // 食べ物を生成
{
for (int i = 0; i < 3; i++) // 3回繰り返す
{
Instantiate(foods[i], transform.position, transform.rotation); // 食べ物を生成
}
}
}
レッツ、スポーン!
・・・・。
お分かりいただけただろうか?
食べ物ズが同時に生成され、弾け飛んでいるように見えますね。
これは、思ってたんと違う…
弾け飛ぶのを修正したい
原因は、ハンバーガー、バナナ、寿司に各自コライダーが付いていますので、それらが同時に同じ座標に生成された事でお互いに反発したものと思われます。
弾け飛ばない方法を考えます。
現在作成しているゲームでは、同じ座標から飛び出してくるように見せたいので、生成する時間をズラすと上手くいきそうです。
そこで、1秒ごとにInstantiate関数を呼び出すようにしたいので、コルーチンを使いたいと思います。
が!ちょっと長くなりそうなので次回にしたいと思います。
次回は
コルーチンを使って1秒ごとにプレハブを生成します。
コメント