Unity触发事件时删除所有Blocker预制体失败问题求助
解决Unity中删除所有Blocker预制体的问题
核心问题分析
你当前的删除代码里,Destroy(gameObject)只会销毁当前脚本挂载的单个对象,循环多少次都只会删这一个,自然无法清除所有Blocker。另外,SpawnManager生成Blocker时没有记录所有实例,导致你找不到要删除的对象集合。
修正步骤
1. 在SpawnManager中添加实例管理列表
首先在SpawnManager脚本里定义一个列表,用来保存所有生成的Blocker实例,同时添加单例方便其他脚本访问:
public class SpawnManager : MonoBehaviour { public GameObject[] blockerPrefabs; public int tempclonecount = 1; // 初始设为1,避免启动时误触发删除 public int blockeramounts; // 新增:保存所有活跃Blocker的列表 private List<GameObject> activeBlockers = new List<GameObject>(); // 新增:单例实例,方便其他脚本调用 public static SpawnManager instance; private void Awake() { instance = this; } // 其他代码... }
2. 修改生成逻辑,记录实例并避免重复生成
把原来写在Update里的生成逻辑改成单独方法,只在需要生成新组时调用,同时将每个生成的Blocker加入列表:
// 替换原Update中的生成代码,改为单独的生成方法 public void SpawnNewBlockers() { int blockeramount = Random.Range(2, 7); blockeramounts = blockeramount; for (int i = 0; i < blockeramount; i++) { int blockerindex = Random.Range(0, blockerPrefabs.Length); GameObject newBlocker = Instantiate(blockerPrefabs[blockerindex], new Vector3(Random.Range(-30, 30), 0, Random.Range(-30, 30)), blockerPrefabs[blockerindex].transform.rotation); // 将新生成的Blocker加入管理列表 activeBlockers.Add(newBlocker); } }
删除原Update中的生成代码,避免每帧重复生成对象导致性能问题。
3. 修改删除逻辑,遍历列表销毁所有实例
在你的删除触发脚本中,通过SpawnManager的实例列表批量删除所有旧Blocker:
// 假设这段代码在球得分检测的脚本中 if (SpawnManager.instance.tempclonecount == 0 ) { // 遍历列表销毁每个Blocker foreach (GameObject blocker in SpawnManager.instance.activeBlockers) { Destroy(blocker); } // 清空列表,避免残留无效引用 SpawnManager.instance.activeBlockers.Clear(); // 生成新的Blocker组 SpawnManager.instance.SpawnNewBlockers(); SpawnManager.instance.tempclonecount = 1; }
额外注意事项
- 确保只有当所有球都得分后,才将
tempclonecount设为0,触发删除和生成流程。 - 用列表管理动态生成的对象是Unity的常用做法,后续要做批量操作(比如修改属性、查找对象)都能通过列表快速实现。
内容的提问来源于stack exchange,提问作者Greg Eastman
相关产品推荐
相关产品推荐

