加载新场景后Unity 5 NullReferenceException

时间:2016-06-11 12:59:45

标签: c# unity3d nullreferenceexception gameobject

所以我正在进行我的第一个fps游戏,现在我正处于开始菜单到第一个场景的时候。当这个新场景加载时,在我的暂停游戏脚本中,我设置了pauseMenu.SetActive(false)(它是一个Canvas,暂停游戏脚本没有附加到它但是附加到游戏管理器对象)我设置了一个bool说isPaused为假(在清醒功能之前)。

现在感觉很棒,我想我已经做到了,没有任何事情发生过,它很容易!但是......当我按下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;
             }
         }
     }
 }

1 个答案:

答案 0 :(得分:0)

由于某种原因,

pauseMenu在新场景之后变为空。

您有两种选择:

公开pauseMenu并在编辑器中将暂停菜单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);
     }
 }

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

相关问题