2012年6月21日木曜日

Unity: 結局、Prefabってなんなのよ、という人のための解説

Prefabの基礎

PrefabとはAssetのひとつで、エディター上で作ったGameObjectをあとから再利用するために使います。
Assetなので、保存されたものはProject Viewに表示されます。

Prefabをシーン階層(Hierarchy)にコピーすることを、一般にインスタンス化すると言います。
シーン階層にコピーすると、プレイ中に表示させることができるようになります。

Prefabからは、何個でもインスタンス化することができます。
さながら一つの遺伝子から、複数のクローンを作るようなものです。
エディター上でPrefab(遺伝子)を編集すると、インスタンス化(クローン)したもの全てに同様の結果が反映されます。

混乱する要因

Unityを始めたばかりの頃は、Prefabを使えはするけども、なんだか分かったような分からないような、そんな状態の人も多いと思います。

原因の一つとして、スクリプトからPrefabを扱う時に、Prefab型というものが無く、エディター上で作ったPrefabを、GameObject型に代入したり、Transform型に代入したり、Rigidbody型に代入したり、その他様々なコンポーネント型に代入しているサンプルプロジェクトを見かける事にあるような気がします。

Prefabをスクリプトから使う

例として、TransformコンポーネントとRigidbodyコンポーネントを持ったPrefabは、以下のobj1〜obj3にインスペクターから代入でき、Instantiate()関数で同じようにインスタンス化できます。
public GameObject obj1;
public Transform obj2;
public Rigidbody obj3;

void Strart() {
    Instantiate(obj1,new Vector3(0,0,0),Quaternion.identity);  // Ok
    Instantiate(obj2,new Vector3(0,0,0),Quaternion.identity);  // Ok
    Instantiate(obj3,new Vector3(0,0,0),Quaternion.identity);  // Ok
}

Instantiate()関数は、引数に渡したオブジェクトを含有するオブジェクト全体をインスタンス化(クローニング)する関数です。

様々な型に代入する理由は?

Unityのリファレンスに、Prefabについて以下のように記述があるように、PrefabはGameObject(付随するコンポーネントも含む)に変わりありません。
They are a collection of predefined GameObjects & Components that are re-usable throughout your game.
では、代入する変数の型に、TransformやRigidbodyなどを指定している場合があるのは何故でしょうか? GameObjectではいけないのでしょうか?

例えばRigidbody型を指定する場合、この変数にはRigidbodyコンポーネントを持たないPrefabは代入できないようになります。
こういう時は、Rigidbodyを持たないPrefabが、その変数に代入されるとまずいと考える事ができます。必要条件としてRigidbody型を指定しているわけです。

こうすることによって、余計なバグを回避することができます。

関連記事


0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...