Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

Prefabのインスタンスを生成する

Project内に次のPrefab (BallPrefab)があるとする。
f:id:yasuda0404:20130302160328p:plain

このPrefabをシーン内に生成するには、Instantiate()を使う。
たとえば次のScriptを作り、シーン内のGameObjectにアタッチ。

using UnityEngine;
using System.Collections;

public class MainScript : MonoBehaviour {
	public GameObject ball;
	
	// Use this for initialization
	void Start () {
		for (int i=0 ; i<3 ; ++i) {
      		      Instantiate(ball,new Vector3(Random.Range(-0.5f,0.5f)*10,i*10+10,Random.Range(-0.5f,0.5f)*10),Quaternion.identity);
    	        }
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

Instantiateの引数は、複製したいオブジェクト(Object)、位置(Vector3D)、回転(Quaternion)。
public変数として定義した'ball'に、Project内のPrefabをひもづける。
f:id:yasuda0404:20130302160647p:plain

Instantiate()の戻り値は'Object'のため、戻り値は使用するにはキャストが必要。
RigidBodyにキャスト:

	void Init () {
		Rigidbody[] obj = new Rigidbody[3];
		for (int i=0 ; i<3 ; ++i) {
      		obj[i] = Instantiate(ball,new Vector3(Random.Range(-0.5f,0.5f)*10,i*10+10,Random.Range(-0.5f,0.5f)*10),Quaternion.identity) as Rigidbody;
    	}

GameObjectにキャスト:

	void Init () {
		GameObject[] obj = new GameObject[3];
		for (int i=0 ; i<3 ; ++i) {
      		obj[i] = Instantiate(ball,new Vector3(Random.Range(-0.5f,0.5f)*10,i*10+10,Random.Range(-0.5f,0.5f)*10),Quaternion.identity) as GameObject;
    	}


このシーンを実行すると、Project内のBallPrefabがランダムな位置に生成される。
f:id:yasuda0404:20130302160835p:plain

                                                                      • -

[追記:2015/3/9]

上の手順では、インスタンス化したGameObjectはシーンの最上位階層におかれる。インスタンス化したGameObjectを特定のGameObjectの下(子供)におきたい場合は、

obj[i] = Instantiate(ball,new Vector3(Random.Range(-0.5f,0.5f)*10,i*10+10,Random.Range(-0.5f,0.5f)*10),Quaternion.identity) as GameObject;
obj[i].transform.parent = targetGameObject.transform;
    	}

と、transform.parentをつなぎなおせばいよい。