「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を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を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を設置
- 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をInstantiateで複製する
例としてcubeを複製
- Hieraruchyに3Dオブジェクト/cubeを選択し追加
- Project(Assetsの下に)にResourcesディレクトリを作成する(名前は、Resources名でないとならない)
- 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内のプレハブは編集すると、わけがわらなくなる可能性があるので、できるだけしないほうがよい。
