トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_prefab

形状の複製(Prefab)

同一の形状をシーンに大量に配置する場合は「Prefab」が便利です。
Prefabは、GameObjectで指定された形状をPrefubというAssetとしてプロジェクトに割り当て、再びシーンに配置する際に形状の複製として配置されます。

なお、Prefabはあくまで参照であるため、元になる形状を削除すると中身も消えてしまいます。

 手順

GameObjectを配置

シーンにGameObjectとして形状を配置。
ここでは、テスト的にメインメニューの「GameObject」-「Create Other」-「Cube」を選択して立方体を配置します。

プロジェクトにPrefabを配置

ProjectウィンドウのAssetsのツリー部を右クリックし、ポップアップメニューより「create」-「Prefab」を選択。
Assetとして「New Prefab」というものが配置されます。

PrefabにGameObject(Cube)を割り当て

作成したPrefabのアイコンに対して、GameObjectのCubeをドラッグして割り当てを行います。


Prefabをシーンに配置

Assets内の「New Prefab」をシーンのHierarchyにドラッグします。
すると、青色のテキストでオリジナルのGameObjectと複製されたPrefabが配置されます。

Prefab自身は形状のジオメトリ情報自身は持たず、形状データは参照されています。
個々のPrefabは、Position/Rotation/Scale情報を持つことができます。

 スクリプトでのPrefabへのアクセス


シーンに追加したPrefabへのアクセスは以下のように行うことができます。
PrefabはGameObjectになるため、「シーン内のGameObject/Componentを取得」のGameObjectのアクセスと同じ手順で行います。

GameObject g = GameObject.Find("New Prefab");  // 指定のGameObjectを検索
if (g != null) {
  Vector3 pos = g.transform.localPosition;  // 位置を取得
  pos.x += 0.1f;
  g.transform.localPosition = pos;    // 位置を変更
}

GameObjectとしての位置/回転/スケールを取得/変更できます。

 スクリプトでPrefabを生成

スクリプト内でPrefabを生成することで、多数の同一形状をメモリを節約して配置できます。
以下、手順。なお、あらかじめAssets内にPrefabが作成済みとします。

カラのGameObjectにスクリプトを記載

emptyなカラのGameObjectに対して、スクリプトを割り当てます。
このスクリプト内で以下のように記述。

using UnityEngine;
using System.Collections;

public class TestScript : MonoBehaviour {
    public GameObject[] m_prefabs = new GameObject[5]; 
    public GameObject m_Prefab;    // Prefabの参照用
    // Use this for initialization
    void Start () {
        for (int i = 0; i < m_prefabs.Length; i++) {
            // 指定の位置にPrefabを複製配置
            Vector3 v = new Vector3(i * 2.0f, 0, 0);
            m_prefabs[i] = GameObject.Instantiate(m_Prefab, v, Quaternion.identity) as GameObject;
        }
    }
    
    // Update is called once per frame
    void Update () {
    }
}

ここの「public GameObject m_Prefab;」の記述が必要です。
ここでいったんMonoのエディタからUnityに戻ります。

Prefabの参照を割り当て

Unity上のInspectorウィンドウ内に「Prefab」という項目が追加されています。これは、スクリプトでpublicとして記載したGameObjectが列挙されます(アンダーバーより前のテキストは省かれる模様)。
ここに、Assetsの対象となるPrefabをドラッグで割り当てます。



以上で実行すると、シーン上に
(0, 0, 0)の位置に mPrefab(Clone)、
(2, 0, 0)の位置に mPrefab(Clone)、
(4, 0, 0)の位置に mPrefab(Clone)、
(6, 0, 0)の位置に mPrefab(Clone)、
(8, 0, 0)の位置に mPrefab(Clone)、
が配置されます。
実行すると、Hierarchyウィンドウ内に複製されたPrefabが列挙されているのが分かります。

m_prefabs[i] = Instantiate(m_Prefab, v, Quaternion.identity) as GameObject;

でInstantiate関数はObject型を返すのですが、「as GameObject」とすることでGameObject型にキャストしたものが格納されます。
後は、GameObjectとしてのtransformの移動/回転/スケールで各Prefabの位置を変更することができます。

 Prefabの非表示

public GameObject[] m_prefabs = new GameObject[5]; 

として、prefabの要素が格納済みの場合、

m_prefabs[0].SetActive(false);

とすることで、そのprefabが非表示になります。表示するにはtrueを指定。

 Prefabの破棄

prefab(というかGameObject)が不要になった場合は、

GameObject.Destroy(g);

とすることで、gで指定されたGameObjectが破棄されます。


最終更新時間:2014年02月19日 10時15分47秒