Developer

【初心者Unity】Instantiateでオブジェクトをクローンする方法(応用編)
2022.08.30
Lv1

【初心者Unity】Instantiateでオブジェクトをクローンする方法(応用編)

Instantiateの使い方-応用編-

Instantiateはオリジナルのゲームオブジェクトからクローンを生成するメソッドです。
本記事ではInstantiateのいろいろな使い方を紹介します。
Instantiateの基本的なお話は下記の記事を参考にしてください。

(参考)
Instantiateを具体例付きで解説

基本形(オブジェクトと位置と回転を指定)

・第1引数にオリジナルのゲームオブジェクト
・第2引数にクローンが生成される座標
・第3引数にクローンの回転量

	public GameObject original;

	void Start() {
		Instantiate(original, new Vector3(2, 0, 0), Quaternion.identity);
	}

使用頻度の高いInstantiateの基本形です。座標と回転を指定してクローンを生成します。
座標はVector3型、回転はQuaternion型です。
Quaternion.identityは「回転なし」という指定です。具体的な値を指定して回転を変えることもできます。


クローンされたオブジェクトのTransform(スクリプトで指定された座標と回転)

こちらの形式では、クローンはヒエラルキーのトップ(ルート階層)に配置されます。

オブジェクトだけ指定

・第1引数にオリジナルのゲームオブジェクト

	public GameObject original;

	void Start() {
		Instantiate(original);
	}

オリジナルのゲームオブジェクト以外、何も指定しない方法です。
この場合、クローンの位置と回転はオリジナルと同じ値となります。

オリジナルのTransform


クローンのTransform

オブジェクトと親を指定

・第1引数にオリジナルのゲームオブジェクト
・第2引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント

	public GameObject original;
	public Transform parent;

	void Start() {
		Instantiate(original, parent);
	}

第2引数に指定したオブジェクトの子要素としてクローンを生成します。
今回は「Directional Light」を親に指定しています。

オリジナルが持っていた座標や回転の情報は、クローンでは親オブジェクトからの相対値として反映されます。
そのためTransformの値は同じですが、ワールド座標系での位置は全く異なります。(親オブジェクトの座標が0,0,0の場合を除く)

オリジナルのTransform


クローンのTransform(値は同じですがワールド座標での位置は全然違います。)

なお、第2引数をnullにした場合、前項の「オブジェクトだけ指定」と同じく、ルート階層であるヒエラルキー直下にクローンされます。

オブジェクトと親を指定しつつ、ワールド座標を維持する

・第1引数にオリジナルのゲームオブジェクト
・第2引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント
・第3引数にワールド座標を維持するかどうかのbool値(true指定で維持)

	public GameObject original;
	public Transform parent;

	void Start() {
		Instantiate(original, parent, true);
	}

親に指定したオブジェクトの子要素として生成しますが、生成される座標と回転はオリジナルのワールド座標が維持されます。

オリジナルのTransform


クローンのTransform(値は全然違いますが、ワールド座標での位置は同じです。)

なお、第3引数にfalseを指定すると前項の「オブジェクトと親を指定」と同じ結果になります。

オブジェクトと位置と回転と親を指定

使用頻度の高いInstantiateの基本形です。
・第1引数にオリジナルのゲームオブジェクト
・第2引数にクローンが生成される座標
・第3引数にクローンの回転量
・第4引数に親にしたいゲームオブジェクトのトランスフォームコンポーネント

	public GameObject prefab;
	public Transform parent;

	void Start() {
		Instantiate(original, new Vector3(2, 0, 0), Quaternion.identity, parent);
	}

基本形に加えて親も指定する形式です。
引数で指定された位置と回転はワールド座標系のものですが、その位置と回転は子要素になった後も維持されます。

親オブジェクトを基準とした値のため、Transformの値はスクリプトで指定したものとは全く異なりますが、ワールド座標での位置は(2, 0, 0)、回転は(0,0,0)です。

まとめ

以上Instantiateメソッドのいろいろなパターンを紹介しました。
座標や親要素を指定する場面では使い分けが重要になりますので、パターンだけでも把握しておくと良いでしょう。

ちなみに、Unityで使用されるC#などのオブジェクト指向型プログラミング言語では、このように同じ名前のメソッドに複数の引数パターンが用意されることを「オーバーロード」といいます。Unityでは様々なメソッドがオーバーロードされています。ぜひ意識してみてください。

連載目次リンク

「初心者のための」Unityゲーム制作 目次

Unity実践編 - 目次リンク

実践Unityゲームプログラミング 連載目次