facebook twitter hatena line email

「Unity/3d/Prefab」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(Prefabを編集)
行1: 行1:
 +
==Prefabからインスタンスを設置する==
 +
例としてcubeを設置
 +
# Hieraruchyに3Dオブジェクト/cubeを選択し追加
 +
# Project(Assetsの下に)にPrefabsディレクトリを作成する。(Prefabs名はわかりやすい名前で何でも良い)
 +
# cubeをPrefabsディレクトリへドラッグする
 +
以下コードで設置できる
 +
[SerializeField] GameObject prefab;
 +
for (int i = 0; i < 100; i++) {
 +
            float x = Random.Range(-5.0f, 5.0f);
 +
            float y = i  * 2 - 4f;
 +
            float z = Random.Range(-5.0f, 5.0f);
 +
            GameObject obj = Instantiate(prefab, Vector3.zero, Quaternion.identity);
 +
            obj.name = "sphere" + i;
 +
}
 +
 +
上記csを貼り付けた、オブジェクトのinspectorを開いて、prefabに、Prefabsに入れたcubeを設置する。
  
==Prefabで複製を作成する==
+
==PrefabをInstantiateで複製する==
 
例としてcubeを複製
 
例としてcubeを複製
 
# Hieraruchyに3Dオブジェクト/cubeを選択し追加
 
# Hieraruchyに3Dオブジェクト/cubeを選択し追加
# Project(Assetsの下に)にResourcesディレクトリを作成する
+
# Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない)
 
# cubeをResourcesディレクトリへドラッグする
 
# cubeをResourcesディレクトリへドラッグする
 
以下コードで複製できる
 
以下コードで複製できる
行18: 行34:
 
Resourcesディレクトリはオブジェクトを読込時に使われるディレクトリ名でunityのルールらしい。
 
Resourcesディレクトリはオブジェクトを読込時に使われるディレクトリ名でunityのルールらしい。
  
==Prefabで複製したものを削除==
+
==PrefabをInstantiateで複製したものを削除==
 
  List<GameObject> list_obj = new List<GameObject>();
 
  List<GameObject> list_obj = new List<GameObject>();
 
  for (int i = 0; i < 100; i++) {
 
  for (int i = 0; i < 100; i++) {

2022年3月24日 (木) 03:19時点における版

Prefabからインスタンスを設置する

例としてcubeを設置

  1. Hieraruchyに3Dオブジェクト/cubeを選択し追加
  2. Project(Assetsの下に)にPrefabsディレクトリを作成する。(Prefabs名はわかりやすい名前で何でも良い)
  3. cubeをPrefabsディレクトリへドラッグする

以下コードで設置できる

[SerializeField] GameObject prefab;
for (int i = 0; i < 100; i++) {
           float x = Random.Range(-5.0f, 5.0f);
           float y = i  * 2 - 4f;
           float z = Random.Range(-5.0f, 5.0f);
           GameObject obj = Instantiate(prefab, Vector3.zero, Quaternion.identity);
           obj.name = "sphere" + i;
}

上記csを貼り付けた、オブジェクトのinspectorを開いて、prefabに、Prefabsに入れたcubeを設置する。

PrefabをInstantiateで複製する

例としてcubeを複製

  1. Hieraruchyに3Dオブジェクト/cubeを選択し追加
  2. Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない)
  3. cubeをResourcesディレクトリへドラッグする

以下コードで複製できる

for (int i = 0; i < 100; i++) {
           float x = Random.Range(-5.0f, 5.0f);
           float y = i  * 2 - 4f;
           float z = Random.Range(-5.0f, 5.0f);
           GameObject prefab = (GameObject)Resources.Load("Sphere");
           Vector3 position = new Vector3(x, y, z);
           GameObject obj = Instantiate(prefab, position, Quaternion.identity);
           obj.name = "sphere" + i;
}

Resourcesディレクトリはオブジェクトを読込時に使われるディレクトリ名でunityのルールらしい。

PrefabをInstantiateで複製したものを削除

List<GameObject> list_obj = new List<GameObject>();
for (int i = 0; i < 100; i++) {
           float x = Random.Range(-5.0f, 5.0f);
           float y = i  * 2 - 4f;
           float z = Random.Range(-5.0f, 5.0f);
           GameObject prefab = (GameObject)Resources.Load("Sphere");
           Vector3 position = new Vector3(x, y, z);
           GameObject obj = Instantiate(prefab, position, Quaternion.identity);
}
list_obj.Add(obj);
// 削除チェック
for (int i = 0; i < list_obj.Count; i++)
{
           GameObject obj = list_obj[i];
           if (obj == null) {
               continue;
           }
           if (obj.transform.position.y < -10) {
               Destroy(list_obj[i]);
               Debug.Log("削除 i=" + i);
           }
}

アタッチオブジェクトのcanvasの位置

SetParentを使う

GameObject rObject;
GameObject prefab = (GameObject)Resources.Load("RObject");
Vector3 position = new Vector3(
            rouletteBackImage.transform.localPosition.x,
            rouletteBackImage.transform.localPosition.y,
            rouletteBackImage.transform.localPosition.z - 0.2f);
GameObject rObject = Instantiate(prefab, position, Quaternion.identity);
rObject.name = "RObject" + angle;
rObject.transform.SetParent(GameObject.Find("/Canvas").transform);
// rObject.transform.localScale = new Vector3(152.68f, 152.68f, 152.68f); // 場合によっては追加
rObject.transform.localPosition = new Vector3(0f, 0f, - 30f);

SetParentとlocalScaleなどの順番によって表示が異なるので気をつける。基本的にはSetParentを先に追加がわかりやすいと思う。


もしくはInstantiateの第4パラメータを使う。

 GameObject obj = Instantiate(prefab, position, Quaternion.identity, rouletteBackImage.transform);

Prefabを編集

  • プレハブ側ファイルを編集すると、設置しているScene内のプレハブが自動更新される。
  • Scene内のプレハブを編集すると、Scene内のObjectが編集されるが、プレハブ側ファイルは変更されない。
  • Scene内に同じオブジェクトがある場合は、プレハブ化して、おくと良い。gitで管理してる場合も楽かも。
  • Scene内のプレハブは編集すると、わけがわらなくなる可能性があるので、できるだけしないほうがよい。