在重启场景时,所引用的游戏对象正在被删除
我正在尝试在我的游戏中创建一个退出弹窗,其中包含这些选项

当我点击“重新开始”按钮时,场景会重新加载。然而在重新加载场景后,当我试图重新显示退出弹窗时,却无法做到。
这是因为重新启动后,我的退出弹窗在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。