トップ 一覧 検索 ヘルプ 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をドラッグして割り当てを行います。
{{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] = MonoBehaviour.Instantiate(m_Prefab, v, Quaternion.identity) as GameObject;
             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}}