LemonteaのUnity部屋

UnityとかC#のおはなしです~

初めてのスクリプト(4) Instantiateで複製・大量生産

こんにちは。レモンティーです。

今回は、オブジェクトの複製です。

これによって、無限わきの敵キャラを実装したり、
自動でステージを生成したりできるようになります。


今回つかうのは、Instantiateです。

以下、複製したいgameObjectをXというgameObject型の変数に取得してあるとします。

このとき、Instantiateは次のようにつかいます。

Instantiate(X);

これで、Xがコピーされます。


これを↓のように使うと

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateCube : MonoBehaviour {
    public GameObject Cube;
    float time = 5;
	void Update () {
        time -= Time.deltaTime;
        if(time <= 0)
        {
            Instantiate(Cube);
            time =5;
        }
	}
}

こんな感じになります。

youtu.be


たしかにコピーされてますね。


しかしこれだと、元のプレハブのtransformと同じ場所にコピーされてしまいます。
コピーする座標も指定してみましょう。

Instantiate(X, Vector3 position, Quaternion rotation);

なお、()の中に書いてある Vector3 position とかは、
任意の変数をいれるところです。 型名 変数名 となっています。
Vector3 positionなら、Vector3型の変数を入れる…ということです。
positionは変数名なので好きな名前でかまいません。

本題にもどります。
座標を指定する場合は、回転も指定しなければいけません。
もし元と同じ回転でいい場合はQuaternion.identityとします。

なので、実際に使うとこんな感じです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateCube : MonoBehaviour {
    public GameObject Cube;
    float time = 3;
	void Update () {
        time -= Time.deltaTime;
        if(time <= 0)
        {
            Vector3 CreatePoint = new Vector3(0, 0, 0); 
            Instantiate(Cube,CreatePoint,Quaternion.identity);
            time =3;
        }
	}
}

ランダムな整数はRandom.Range(int Min,int Max+1)で得られますから、
複製する場所をランダムにしたいときは↓のようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CreateCube : MonoBehaviour {
    public GameObject Cube;
    float time = 3;
	void Update () {
        time -= Time.deltaTime;
        if(time <= 0)
        {
            Vector3 CreatePoint = new Vector3(Random.Range(0,5), Random.Range(0,5), 4); 
            Instantiate(Cube,CreatePoint,Quaternion.identity);
            time =3;
        }
	}
}

また、他のオブジェクトの子としてInstantiateすることもできます。
その場合は、親にするオブジェクトのtransformを引数にわたします。

 Instantiate(X, Transform parent);
Instantiate(X, Vector3 position, Quaternion rotation, Transform parent);

こんな感じです。
今回はこれでおわりです


Next

sawalemounity.hatenablog.com

関連
今回のスクリプトの使用
sawalemounity.hatenablog.com