在重启场景时,所引用的游戏对象正在被删除

编程语言 2026-07-09

我正在尝试在我的游戏中创建一个退出弹窗,其中包含这些选项

我的退出弹窗图片

当我点击“重新开始”按钮时,场景会重新加载。然而在重新加载场景后,当我试图重新显示退出弹窗时,却无法做到。

这是因为重新启动后,我的退出弹窗在Unity脚本中的引用被清除了。

这是我的代码 - GameController.cs

public class GameController : MonoBehaviour
{
    [Header("QuitPopup")]
    public QuitPopupController quitPopup;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
            quitPopup.ExecuteQuitPopup();
    }
}

QuitPopupController.cs

public class QuitPopupController : MonoBehaviour
{
    public GameObject popupPanel;
    public static QuitPopupController Instance { get; private set; }

    void Start()
    {
        Instance = this;
    }

    void Update()
    {
    }

    private void Awake()
    {
        Instance = this;
    }

    public void ExecuteQuitPopup()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            if (GameController.Instance != null && GameController.Instance.IsAnimationRunning) 
                return;

            if (popupPanel != null && popupPanel.activeSelf)
                ResumeGame();
            else
                Show();
        }
    }

    public void Show()
    {
        if (popupPanel != null)
        {
            popupPanel.SetActive(true);
            Time.timeScale = 0f;
        }
    }

    public void ResumeGame()
    {
        if (popupPanel != null)
        {
            popupPanel.SetActive(false);
            Time.timeScale = 1f;
        }
    }

    public void RestartGame()
    {
        Time.timeScale = 1f;
        SceneManager.LoadScene("GameScene");
    }

    public void QuitToMainMenu()
    {
        Time.timeScale = 1f;
        SceneManager.LoadScene("MainMenu");
    }
}

我还不太明白为什么会这样。任何建议都会非常有帮助。

提前致谢。

解决方案

正如BugFinder在评论中所说,这是一种正常行为。要实现你想要的效果,有多种方法可选,每种方法都有优点或缺点。

第一种常见做法是在Inspector中进行设置。 如果你确定只有一个实例的 QuitPopupController,第二种常见做法是使用 GetComponent

第三种hacky方法(*注:在你的情形中“hacky”仅指当前这种情况)虽然在这里不适用,但在其他情形下很有用,就是使用 DontDestroyOnLoad;之所以这里不合适,是因为它会让你的对象在任意场景中持续存在(即使你不需要它),所以把它更多地作为“以后再说”的笔记。(我用它的场景是在管理对象或其他持久对象,如库存/商店等。)

顺便说一句,你在 ExecuteQuitPopup() 中有 if (Input.GetKeyDown(KeyCode.Escape)),如果你不期望它在其他情况下被调用,那就显得有点多余。(显然我不会把它算作一个Bug,只是有点多此一举。)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章