Unity开发:如何删除克隆GameObject而非原始对象
Unity 房间生成与旧房间删除问题修复
问题场景
开发游戏时需求为:打开门生成新房间,生成3个新房间后,删除往前数第3个旧房间。现有代码中RoomsOpened计数逻辑正常,但执行删除时会销毁原始GameObject而非目标克隆体。
原代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class RoomDeGenarator : MonoBehaviour { private float RoomsOpened = 0; public void DoorCount(){ RoomsOpened ++; if(RoomsOpened > 3.0f){ Destroy(gameObject); } } }
问题根源
你把计数和删除逻辑写在了每个房间的脚本里,每个克隆体都会维护独立的RoomsOpened变量,而且脚本销毁的是自身所在的GameObject——如果原始预制体也挂了这个脚本,甚至可能误删原始资源;更关键的是,这套逻辑根本没跟踪「往前数第3个旧房间」的对象引用,完全没定位到要删的目标克隆体。
修复方案
用全局队列统一跟踪生成的房间克隆体,把计数、删除逻辑从单个房间脚本剥离到全局管理器中:
- 创建全局房间管理器(挂在场景中的
GameManager对象上),用Queue<GameObject>存储生成的房间,队列「先进先出」的特性刚好匹配「删除最早生成的旧房间」的需求。 - 每次生成新房间克隆体时将其加入队列;若队列长度超过3,取出队列头部的旧房间并销毁。
- 房间脚本只保留「开门触发生成新房间」的逻辑,无需处理计数和删除。
示例代码
全局房间管理器脚本
using System.Collections.Generic; using UnityEngine; public class RoomManager : MonoBehaviour { // 拖拽你的原始房间预制体到这里 public GameObject roomPrefab; // 存储生成的房间队列,先进先出 private Queue<GameObject> roomQueue = new Queue<GameObject>(); // 最多保留3个房间 private int maxRoomCount = 3; // 外部调用此方法生成新房间(比如房间的门点击事件调用) public void SpawnNewRoom() { // 生成新房间克隆体(可根据需求调整生成位置) GameObject newRoom = Instantiate(roomPrefab, transform.position + Vector3.forward * 10, Quaternion.identity); // 将新房间加入队列 roomQueue.Enqueue(newRoom); // 如果队列长度超过最大值,删除最早生成的房间 if(roomQueue.Count > maxRoomCount) { GameObject oldestRoom = roomQueue.Dequeue(); Destroy(oldestRoom); } } }
修改后的房间脚本(仅处理开门触发)
using UnityEngine; public class RoomDoor : MonoBehaviour { // 拖拽场景中的GameManager对象到这里 public RoomManager roomManager; // 开门时触发的方法(比如按钮点击、碰撞检测触发) public void OnDoorOpen() { // 调用管理器生成新房间 roomManager.SpawnNewRoom(); } }
注意事项
- 确保
RoomManager挂在场景中不会被销毁的对象上(比如GameManager),避免队列丢失。 - 调整
SpawnNewRoom中的生成位置逻辑,匹配你的游戏房间布局需求(比如根据门的方向生成)。
内容的提问来源于stack exchange,提问作者smt
相关产品推荐
相关产品推荐

