2016-06-11 122 views
3

所以我正在做我的第一個fps遊戲,現在我正要從開始菜單轉到我的第一個場景。當這個新的場景在喚醒時,在我的暫停遊戲腳本中加載時,我設置了pauseMenu.SetActive(false)(這是一個畫布,暫停遊戲腳本不附加到它,而是附加到遊戲管理器對象),並且設置了一個布爾說,是假的(在清醒功能之前)。加載新場景後的Unity 5 NullReferenceException

現在感覺很棒,我在想我已經做到了,沒有碰撞過,很簡單!但是......當我按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; 
      } 
     } 
    } 
} 

回答

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); 
    } 
} 

其中一個應該可以解決您的問題。如果第二個失敗,應該是第一個。

+0

@Manu很高興你的工作。快樂的編碼! – Programmer

+0

這兩種方法都無法正常工作,但這是因爲我的腳本在GameManager對象上持續存在於場景之間。所以我只是將腳本移動到了我的Character對象上,並且使用了第一個選項'public GameObject pauseMenu;'並且工作:)同樣,我在我的Start或Awake函數之前聲明的所有東西都像我的彈藥一樣,我將它們移動到了這些函數中它的工作原理以及:)我有點了解它現在的工作原理,再次感謝! – Manu

+0

@Manu很好。你生活和學習。如果您在創建遊戲菜單時遇到問題,請暫停和恢復內容,請在此處查看如何操作。 http://stackoverflow.com/a/372​​63453/3785314 – Programmer