形状の複製(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秒