!!!形状の複製(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をドラッグして割り当てを行います。 {{ref_image unity_prefab_01.png}} !Prefabをシーンに配置 Assets内の「New Prefab」をシーンのHierarchyにドラッグします。 すると、青色のテキストでオリジナルのGameObjectと複製されたPrefabが配置されます。 {{ref_image unity_prefab_02.png}} Prefab自身は形状のジオメトリ情報自身は持たず、形状データは参照されています。 個々のPrefabは、Position/Rotation/Scale情報を持つことができます。 !!スクリプトでのPrefabへのアクセス シーンに追加したPrefabへのアクセスは以下のように行うことができます。 PrefabはGameObjectになるため、「[[シーン内のGameObject/Componentを取得|unity_script_get_gameobject]]」の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をドラッグで割り当てます。 {{ref_image unity_prefab_03.png}} 以上で実行すると、シーン上に (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が破棄されます。 ---- {{lastmodified}}