场景重启后QuitPopup引用丢失无法加载问题求助
问题原因
场景重启(调用SceneManager.LoadScene("GameScene"))时,原场景内的所有对象(包括旧的QuitPopupController和GameController)都会被销毁,新场景会生成全新的实例。但GameController的quitPopup是手动在Inspector面板赋值的公共字段,场景重启后这个引用不会自动指向新生成的QuitPopupController,导致引用为空,按下Esc键时无法触发弹窗逻辑。
解决方法
方案1:利用单例直接调用(最简洁)
既然QuitPopupController已经实现了单例,直接在GameController里通过单例调用方法,完全摆脱对Inspector赋值的依赖:
修改GameController.cs的Update方法:void Update() { if (Input.GetKeyDown(KeyCode.Escape)) QuitPopupController.Instance?.ExecuteQuitPopup(); }注:
?.是空安全调用运算符,防止场景初始化时Instance还未赋值导致空引用错误。方案2:自动查找组件,避免手动赋值
在GameController的初始化方法中自动查找场景中的QuitPopupController,即使场景重启也能重新获取引用:
修改GameController.cs:[Header("QuitPopup")] public QuitPopupController quitPopup; void Awake() { // 未手动赋值时,自动查找场景中的QuitPopupController if (quitPopup == null) { quitPopup = FindObjectOfType<QuitPopupController>(); } } void Update() { if (Input.GetKeyDown(KeyCode.Escape)) quitPopup?.ExecuteQuitPopup(); }方案3:优化单例实现,避免多实例问题
你的QuitPopupController在Awake和Start都给Instance赋值,容易出现逻辑混乱,建议只在Awake中初始化单例,并添加多实例判断:
修改QuitPopupController.cs的Awake方法:private void Awake() { // 确保场景中只有一个QuitPopupController实例 if (Instance != null && Instance != this) { Destroy(gameObject); } else { Instance = this; } }额外优化:移除重复的输入判断
你的ExecuteQuitPopup方法里重复判断了Input.GetKeyDown(KeyCode.Escape),但这个方法已经是在GameController检测到Esc按下时才调用的,完全可以去掉这个冗余判断:public void ExecuteQuitPopup() { if (GameController.Instance != null && GameController.Instance.IsAnimationRunning) return; if (popupPanel != null && popupPanel.activeSelf) ResumeGame(); else Show(); }
内容的提问来源于stack exchange,提问作者Chetan Mehra

