You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:27:38