[Unity]Prefabをスクリプトから複製する

プレハブをスクリプトから複数複製することができると、発射する弾や、状況によって発生する敵キャラなど様々なしくみを作ることができます。今回は簡単な複製方法を紹介します。

instantiateInstance

複製する

プレハブのみならず、様々なオブジェクトを複製するには以下の「Instantiate」メソッドを利用することで実現できます。

http://docs.unity3d.com/Documentation/ScriptReference/Object.Instantiate.html

static Object Instantiate(Object original);

static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

Instantiateメソッドは、引数に複製したいオブジェクト(Object)(発生させたい位置(Vector3), 発生させたい回転(Quaternion) )を指定し利用します。戻り値は新たに作成したオブジェクトとなります。ここでObjectとはすべてのクラスの基底となっているので、つまりどのようなクラスでも複製することが出来るということです。

今回は引数が一つのIntantiateメソッドを利用します。

シーンの準備

Prefabの作成

今回は物理シミュレーションを付加した、球を利用します。以下の手順で作成させてください。

  1. Sphereオブジェクトを原点に作成
  2. Sphereをアクティブにし、メニューのComponent -> Physics ->Rigidbodyを付加
  3. HierarchyのSphereをドラッグし、ProjectウインドウのAssetディレクトリでドロップしPrefab化
  4. Hierarchyに残ったSphere(文字が青くなってるはずです)を削除

シーンの作成

オブジェクトを作成し、下図のように配置してください。

instatiateHierarchy
instantiateScene

ここで、Hieraryとシーンの配置関係は

名前 説明
emitter(GameObject) 原点に作成。複製物の発生場所
Floor(GameObject) 5つのCubeを一括管理する
Cube 床を構成する

スクリプトの作成

今回作成したスクリプトは以下の「CreateInstance.cs」のみです。

using UnityEngine;
using System.Collections;

public class CreateInstance : MonoBehaviour {
	// 複製するPrefabをobjにInspector格納しておく
	public GameObject obj;
	// Update is called once per frame
	void Update () {
		// マウスが左クリックされたら以下を実行
		if(Input.GetMouseButtonDown(0)){
			// ゲームオブジェクトを複製
			// 戻り値はObjectクラスなので、必ず複製したオブジェクトと同じクラスへキャストする
			GameObject instance = (GameObject)Instantiate(obj);
			// 複製したオブジェクトの位置をemmitterオブジェクトと同じ位置へ
			instance.transform.position = gameObject.transform.position;
			// 色をランダムで変更
			switch(Random.Range(0,3)){
				case 0: instance.renderer.material.color = Color.red; break;
				case 1: instance.renderer.material.color = Color.blue; break;
				case 2: instance.renderer.material.color = Color.green; break;
				case 3: instance.renderer.material.color = Color.magenta; break;
			}
		}
	}
}

このスクリプトはpublicとなっているobjにPrefabオブジェクトが代入されていることが前提となっています。ソースコード中にもコメントしてありますが、クリックされたら複製され、色が4種類の中から設定されます。

スクリプト設定

スクリプトの付加

emitterオブジェクトに対し、「CreateInstance」を付加します。

Inspectorを編集

InspectorのCreateInstanceの項目に「Obj」というGameObjectを入力する欄ができています。ここにProjectウインドウのSphereというPrefabをドラッグアンドドロップします。

関連

[Unity]メンバ変数とインスペクタ
instantiateInspector

以上で準備は終了です。

実行

実行ボタンを押すと、ゲームが開始され、ゲーム画面をクリックするとボールが複製されるのが確認できます。この時、Hierarchyでは下の図のようにPrefab名(Clone)とう複製されたオブジェクトが表示されます。

instantiateRunHierarchy

実行して気づくと思いますが、発射位置が全く同じだと、球はどんどん積み重なっていきます。横や奥に対して力がないためです。この場合、発射位置を少しでもずらせばすぐに崩れます。(ただし、上のブラウザからでは発射位置は変更できないので、どうやっても重なってゆきます)

おわりに

今回はPrefabだけでしたが、Instantiateメソッドは様々なオブジェクトを複製できる便利な機能です。下記にオフィシャルサイトのリンクを張っておきますので、参考にしてください。

参考

http://docs-jp.unity3d.com/Documentation/Manual/InstantiatingPrefabs.html

実行時のプレハブのインスタンス化 / Instantiating Prefabs at runtime
http://docs-jp.unity3d.com/Documentation/Manual/InstantiatingPrefabs.html

ハマケン100%開発: Unity: Prefabをスクリプトからインスタンス化する
http://hamken100.blogspot.jp/2012/04/unity-prefab.html

ActionScript入門Wiki – Unity – インスタンスの生成
http://www40.atwiki.jp/spellbound/pages/1330.html