加载新场景后的Unity 5 NullReferenceException

Unity 5 NullReferenceException after loading new scene

所以我正在做我的第一个 fps 游戏,现在我正准备从开始菜单转到我的第一个场景。当那个新场景加载时,在我的暂停游戏脚本中,我设置 pauseMenu.SetActive(false)(它是 Canvas 并且暂停游戏脚本没有附加到它,而是附加到游戏管理器object) 然后我设置一个 bool 表示 isPaused 为 false(在 awake 函数之前)。

现在的感觉真好,我想我做到了,没有崩溃,太容易了!但是...当我按下 Escape(暂停游戏)时,我得到一个 NullReferenceException,因为它再也找不到暂停菜单了!在我开始切换场景之前,那一点工作得很好,所以,我的问题是,在中断脚本执行的场景之间切换时是否需要知道一些事情?我的射击也不起作用,但我的 SwitchWeapon/Movement/MouseLook/ItemPickUp 脚本起作用了。 从开始菜单场景切换到实际关卡场景是否有黑洞?帮助:)

这是我在 PauseGame 脚本上的代码

GameObject pauseMenu;
 bool isPaused = false;

 void Awake()
 {
     if (Application.loadedLevelName != "Start_Menu")
     {
         Cursor.lockState = CursorLockMode.Locked;
         Cursor.visible = false;
         pauseMenu = GameObject.Find("Canvas_Pause_Menu");
         pauseMenu.SetActive(false);
         Debug.Log(isPaused + " " + pauseMenu);
     }
 }

 void Update()
 {
     // Here I use Application.loadedLevelName because I haven't found
     // a SceneManager function in the Unity docs to check here)
     if (Application.loadedLevelName != "Start_Menu")
     {
         if (Input.GetKeyDown(KeyCode.Escape))
         {
             if (!isPaused)
             {
                 pauseMenu.SetActive(true);
                 Time.timeScale = 0f;
                 Cursor.visible = true;
                 isPaused = !isPaused;
             }
             else if (isPaused)
             {
                 pauseMenu.SetActive(false);
                 Time.timeScale = 1f;
                 Cursor.lockState = CursorLockMode.Locked;
                 Cursor.visible = false;
                 isPaused = !isPaused;
             }
         }
     }
 }

pauseMenu 由于某种原因在新场景后变为空。

您有两个选择:

制作 pauseMenu public 并将暂停菜单 Canvas 拖到编辑器中,然后从唤醒功能中删除 pauseMenu = GameObject.Find("Canvas_Pause_Menu");。您必须删除 pauseMenu = GameObject.Find("Canvas_Pause_Menu");.

public GameObject pauseMenu;
bool isPaused = false;

 void Awake()
 {
     if (Application.loadedLevelName != "Start_Menu")
     {
         Cursor.lockState = CursorLockMode.Locked;
         Cursor.visible = false;
         pauseMenu.SetActive(false);
         Debug.Log(isPaused + " " + pauseMenu);
     }
 }

或者将 Awake() 函数中的代码放入 Start() 函数中。

GameObject pauseMenu;
bool isPaused = false;

 void Start()
 {
     if (Application.loadedLevelName != "Start_Menu")
     {
         Cursor.lockState = CursorLockMode.Locked;
         Cursor.visible = false;
         pauseMenu = GameObject.Find("Canvas_Pause_Menu");
         pauseMenu.SetActive(false);
         Debug.Log(isPaused + " " + pauseMenu);
     }
 }

其中一个应该可以解决您的问题。如果第二个失败,第一个应该。