如何在创建新对象之前销毁所有对象?

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时,你才应该做批处理。