Unity中循环调用Destroy()为何仅删除一个克隆对象?
Unity循环销毁克隆对象仅删除一个的原因及解决办法
问题原因
Destroy()并非立即销毁对象,只是给对象标记待销毁状态,要等当前帧所有逻辑执行完毕后,Unity才会真正把对象从场景中移除。- 你的循环在同一帧里跑了5次,每次调用
GameObject.Find("coin")时,第一次标记销毁的那个对象还没被真正移除,所以每次Find到的都是同一个对象——等于重复给它打了5次销毁标记,最终自然只销毁这一个。
正确写法
方法一:先批量获取所有目标对象再销毁
推荐用标签或者类型来批量查找,比多次调用GameObject.Find效率高:
// 获取所有带"coin"标签的对象(前提是给克隆对象加了对应标签) GameObject[] allCoins = GameObject.FindGameObjectsWithTag("coin"); // 取前5个销毁,避免数组长度不足时出错 int countToDestroy = Mathf.Min(5, allCoins.Length); for(int i = 0; i < countToDestroy; i++) { Destroy(allCoins[i]); }
方法二:克隆时维护对象列表(更高效)
如果是你自己克隆的对象,最好在克隆时就把它们存到一个列表里,后续销毁直接从列表取,不用反复查找:
// 提前定义列表存克隆的硬币 List<GameObject> coinClones = new List<GameObject>(); // 克隆对象时添加到列表 GameObject newCoin = Instantiate(你的硬币预制体); coinClones.Add(newCoin); // 需要删除前5个时 int destroyCount = Mathf.Min(5, coinClones.Count); for(int i = 0; i < destroyCount; i++) { Destroy(coinClones[0]); // 每次删列表第一个 coinClones.RemoveAt(0); }
内容的提问来源于stack exchange,提问作者dkskfktldi
相关产品推荐
相关产品推荐

