Unity中如何销毁已实例化的预制体?非场景切换式关卡加载系统卸载问题求助
问题分析与解决方案
嘿,我一眼就揪出问题所在啦!你在loadLevelT方法里创建的LvlT是局部变量——方法执行结束后这个变量就会被销毁,等到你调用unloadLevelT时,里面的LvlT根本不是你之前实例化出来的那个关卡对象,自然起不到销毁作用。
下面是修正后的完整代码,我加了详细注释帮你理解:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LevelLoadingSys : MonoBehaviour { // 新增:用类成员变量保存当前加载的关卡对象,让所有方法都能访问到它 private GameObject _currentLoadedLevel; public void loadLevelT() { // 可选:加载新关卡前先卸载已有的,避免重复叠加 if (_currentLoadedLevel != null) { Destroy(_currentLoadedLevel); } // 实例化预制体,并把对象赋值给成员变量 _currentLoadedLevel = Instantiate(LevelTutorial); load(); // 假设这是你自己的关卡初始化方法 } // 卸载关卡方法 public void unloadLevelT() { // 先判断对象是否存在,避免空引用报错 if (_currentLoadedLevel != null) { Destroy(_currentLoadedLevel); // 销毁后置空,防止后续误操作 _currentLoadedLevel = null; } } // 关卡预制体引用 public GameObject LevelTutorial; }
额外小提示
- 如果你的游戏需要同时加载多个关卡对象,可以把
_currentLoadedLevel改成List<GameObject> _loadedLevels,加载时把实例化对象Add进列表,卸载时遍历列表销毁所有对象再清空。 - 要是觉得成员变量管理麻烦,也可以给所有关卡预制体加统一标签(比如"GameLevel"),卸载时用
GameObject.FindGameObjectsWithTag("GameLevel")找到所有关卡对象再逐个销毁,但这种方式效率不如直接保存引用高,适合简单场景。
内容的提问来源于stack exchange,提问作者user16414791
相关产品推荐
相关产品推荐

