Unity技术问题:如何在不同函数中销毁实例化对象
问题解决:销毁生成对象后立即生成新对象
你的代码存在三个核心问题:
Destroy(this.gameObject)销毁的是挂载该脚本的游戏对象,而非你生成的食物实例- 未保存生成的食物引用,导致无法在其他函数中定位到要销毁的目标
- 销毁后未触发新的生成逻辑
以下是修正后的完整代码:
public GameObject[] food; public Vector3Int spawnPosition; // 新增变量存储当前生成的食物实例 private GameObject currentFood; public void Start() { SpawnFood(); } // 生成食物 public void SpawnFood() { int random = Random.Range(0, food.Length); // 将实例化的食物引用存入全局变量 currentFood = Instantiate(food[random], spawnPosition, Quaternion.identity); } private void Update() { if(Input.GetKeyDown(KeyCode.C)) { // 先检查食物实例是否存在,避免空引用错误 if(currentFood != null) { Destroy(currentFood); // 销毁后立即生成新食物 SpawnFood(); } } }
关键修改说明
- 添加
private GameObject currentFood;全局变量,保存每次生成的食物实例,让其他函数能直接访问到要销毁的对象 - 在
SpawnFood中把实例化结果赋值给currentFood,建立引用关联 - 销毁前先判断
currentFood不为空,避免空引用报错,销毁完成后直接调用SpawnFood()生成新实例
如果需要等待旧对象完全销毁后再生成新对象(避免帧内重叠),可以改用带回调的销毁方式:
Destroy(currentFood, () => { SpawnFood(); });
内容的提问来源于stack exchange,提问作者Anend
相关产品推荐
相关产品推荐

