如何在创建新对象之前销毁所有对象?
How can i destroy all the objects before creating new ones?
我想做的是,只有当我更改要在检查器中创建的对象数量时,才首先销毁所有现有对象(如果有的话),然后创建新数量的对象。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class InstantiateObjects : MonoBehaviour
{
public GameObject prefab;
public Terrain terrain;
public float yOffset = 0.5f;
public int objectsToInstantiate;
public bool parent = true;
private float terrainWidth;
private float terrainLength;
private float xTerrainPos;
private float zTerrainPos;
private int numberOfObjectsToCreate;
private GameObject objInstance;
public void Start()
{
//Get terrain size
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
//Get terrain position
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
numberOfObjectsToCreate = objectsToInstantiate;
generateObjectOnTerrain();
}
private void Update()
{
if (numberOfObjectsToCreate != objectsToInstantiate)
{
for (int i = 0; i < objectsToInstantiate; i++)
{
Destroy(objInstance);
}
generateObjectOnTerrain();
}
}
public void generateObjectOnTerrain()
{
for (int i = 0; i < objectsToInstantiate; i++)
{
//Generate random x,z,y position on the terrain
float randX = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
float randZ = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
float yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));
//Apply Offset if needed
yVal = yVal + yOffset;
//Generate the Prefab on the generated position
objInstance = Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity);
objInstance.name = "Teleportation Booth";
if (parent)
objInstance.transform.parent = this.transform;
}
}
}
这是 Inspector 中的变量,用于设置要创建的对象数:
public int objectsToInstantiate;
如果在检查器中更改了要创建的新对象数量,此变量应该有助于检查是否有任何更改:
private int numberOfObjectsToCreate;
还有更新函数中的代码,但它什么也没做。当我在检查器中输入新值时,它没有任何改变。
将 Destroy(objInstance);
更改为 DestroyImmediately(objInstance);
应该可以。
但是,在 update
中删除和添加新对象并不是一个好主意。你可以尝试维护一个对象池来add/remove一个特定的对象,只有当很多对象在一个动作中removing/adding时,你才应该做批处理。
我想做的是,只有当我更改要在检查器中创建的对象数量时,才首先销毁所有现有对象(如果有的话),然后创建新数量的对象。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class InstantiateObjects : MonoBehaviour
{
public GameObject prefab;
public Terrain terrain;
public float yOffset = 0.5f;
public int objectsToInstantiate;
public bool parent = true;
private float terrainWidth;
private float terrainLength;
private float xTerrainPos;
private float zTerrainPos;
private int numberOfObjectsToCreate;
private GameObject objInstance;
public void Start()
{
//Get terrain size
terrainWidth = terrain.terrainData.size.x;
terrainLength = terrain.terrainData.size.z;
//Get terrain position
xTerrainPos = terrain.transform.position.x;
zTerrainPos = terrain.transform.position.z;
numberOfObjectsToCreate = objectsToInstantiate;
generateObjectOnTerrain();
}
private void Update()
{
if (numberOfObjectsToCreate != objectsToInstantiate)
{
for (int i = 0; i < objectsToInstantiate; i++)
{
Destroy(objInstance);
}
generateObjectOnTerrain();
}
}
public void generateObjectOnTerrain()
{
for (int i = 0; i < objectsToInstantiate; i++)
{
//Generate random x,z,y position on the terrain
float randX = UnityEngine.Random.Range(xTerrainPos, xTerrainPos + terrainWidth);
float randZ = UnityEngine.Random.Range(zTerrainPos, zTerrainPos + terrainLength);
float yVal = Terrain.activeTerrain.SampleHeight(new Vector3(randX, 0, randZ));
//Apply Offset if needed
yVal = yVal + yOffset;
//Generate the Prefab on the generated position
objInstance = Instantiate(prefab, new Vector3(randX, yVal, randZ), Quaternion.identity);
objInstance.name = "Teleportation Booth";
if (parent)
objInstance.transform.parent = this.transform;
}
}
}
这是 Inspector 中的变量,用于设置要创建的对象数:
public int objectsToInstantiate;
如果在检查器中更改了要创建的新对象数量,此变量应该有助于检查是否有任何更改:
private int numberOfObjectsToCreate;
还有更新函数中的代码,但它什么也没做。当我在检查器中输入新值时,它没有任何改变。
将 Destroy(objInstance);
更改为 DestroyImmediately(objInstance);
应该可以。
但是,在 update
中删除和添加新对象并不是一个好主意。你可以尝试维护一个对象池来add/remove一个特定的对象,只有当很多对象在一个动作中removing/adding时,你才应该做批处理。