- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!形状の複製(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}}