ゲームを作るなら、この辺りの仕組みを最初に覚えてしまった方がいいでしょう。
リファレンスマニュアルにはJavascriptのサンプルコードが付いていますが、残念ながらC#版は見られませんでした。
この記事の後半に僕が作成したC#のサンプルコードを掲載しておきます。
Instatiate関数は、Javascriptでは以下のように定義されています。
static function Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Objectoriginal引数に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 件のコメント:
コメントを投稿