2012年4月25日水曜日

Unity: Prefabをスクリプトからインスタンス化する

スクリプトからGameObjectを動的に生成するには、UnityではPrefabというAssetを準備して、そのPrefabをInstantiate関数を使ってインスタンス化するのが一般的なようです。
ゲームを作るなら、この辺りの仕組みを最初に覚えてしまった方がいいでしょう。

リファレンスマニュアルにはJavascriptのサンプルコードが付いていますが、残念ながらC#版は見られませんでした。
この記事の後半に僕が作成したC#のサンプルコードを掲載しておきます。

Instatiate関数は、Javascriptでは以下のように定義されています。
static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object
original引数にPrefabを与えてやれば良いらしいのですが、サンプルプログラムを見ると、original引数に与えられるものが GameObject だったり、Transform(コンポーネント)だったり、Rigidbody(コンポーネント)だったりします。
// Javascript
// 以下すべてoriginal引数に与える事が可能
var obj : GameObject;
Instantiate (obj, Vector3(0, 0, 0), Quaternion.identity);

var trans : Transform;
Instantiate (trans, Vector3(0, 0, 0), Quaternion.identity);

var body : Rigidbody;
Instantiate (body, Vector3(0, 0, 0), Quaternion.identity);
ではPrefabの場合、どの型で引き渡せばいいのかで悩みました。
結論としては、Prefabが持っているコンポーネント次第で、どれでもOKになりえるという事です。
PrefabがRigidbodyコンポーネントを持っていれば上記3番目のInstatiate関数はOKだし、TransformはすべてのGameObjectが持っているコンポーネントなので2番目もOKです。

リファレンスには以下のように書いてあります。
If a game object, component or script instance is passed, Instantiate will clone the entire game object hierarchy, with all children cloned as well.
original引数に与えられたObjectがなんであれ、それを含有するオブジェクト全体がクローニング(インスタンス化)されるとなっています。
スクリプトでもOKと書いてあるのに若干驚きます。何か変態的なことが出来そうな匂いがしてくるじゃありませんか。(笑)

サンプル
試しにシーンを起動した時に、動的にPrefabをシーンに登場させてみます。
まずエディター上で、GameSceneという名の空のGameObjectを作成して、シーンの適当なところに配置します。
そのGameSceneオブジェクトに登録するスクリプトが以下になります。
using UnityEngine;
using System.Collections;

public class GameScene : MonoBehaviour {
  public GameObject BeePrefab;

  // Use this for initialization
  void Start () {
    for (int i=0 ; i<3 ; ++i) {
      Instantiate(BeePrefab,new Vector3(-50+i*50,0,0),Quaternion.identity);
    }
  }
  
  // Update is called once per frame
  void Update () {
  }
}
上記スクリプトを登録すると、public宣言したBeePrefab変数が、GameSceneオブジェクトのInspectorから設定できるようになるので、ここにBeeという名のPrefabをドラッグ&ドロップします。このPrefabはなんでも良いので、各自用意して下さい。僕の場合は1匹の蜂オブジェクトをPrefab化しました。

実行すると以下のようにBeePrefabから動的に3匹の蜂が生成されました。

こちらも合わせてどうぞ。
Unity: ResourcesフォルダからPrefabを読む
Unity: Resourcesフォルダが複数ある時の読み込みテスト
Unity: メモリ不足に陥ったらResourcesクラスのアンロードを試してみる

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...