2016-06-11 9 views
3

私は最初のfpsゲームをやっているので、スタートメニューから最初のシーンに移動しています。私のポーズゲームスクリプトで、その新しいシーンが起動すると、pauseMenu.SetActive(false)が設定されます(キャンバスであり、ポーズゲームスクリプトはゲームマネージャオブジェクトに接続されていません)。 boolはisPausedを(awake関数の前に)falseにします。Unity 5新しいシーンをロードした後でNullReferenceExceptionが発生する

今、気分は素晴らしいです、私はそれを作ったと思っています、何も墜落しない、それはとても簡単です!しかし...(ゲームを一時停止するために)エスケープを押すと、もう一時停止メニューが見つからないため、NullReferenceExceptionが発生します。シーンを切り替える作業を始める前に、そのビットはうまく動作していたので、私の質問は、スクリプトの実行を中断するシーンを切り替えるときに何か知っていますか?私の撮影は動作しませんが、SwitchWeapon/Movement/MouseLook/ItemPickUpスクリプトが機能します。 スタートメニューのシーンと実際のレベルのシーンを切り替えるときにブラックホールがありますか? HELP :)

ここでは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を公開した後、目を覚まし関数からpauseMenu = GameObject.Find("Canvas_Pause_Menu");を削除エディタでの一時停止メニューCanvasをドラッグ:

2つのオプションがあります。 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); 
    } 
} 

OR Start()機能にあなたのAwake()関数内のコードを置きます。

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

これらのいずれかが問題を解決するはずです。 2番目のものが失敗した場合、最初のものが必要です。

+0

@Manu嬉しいですね。ハッピーコーディング! – Programmer

+0

どちらのメソッドも機能しませんでしたが、その理由はシーン間で持続するGameManagerオブジェクトにスクリプトがあるからです。だから私はキャラクターオブジェクトの代わりにキャラクターオブジェクトを移動し、あなたの最初のotption 'public GameObject pauseMenu;'を使いました。それも:)私のスタートやアウェイク機能の前に私の弾薬のように宣言したものは、それも同様に動作します:)私はちょっとそれが今働く方法をちょっと理解しています、ありがとう、もう一度! – Manu

+0

@Manu Nice。あなたは生きて学びます。ゲームメニューを作成したり、一時停止したり、再開したりするのに問題がある場合は、ここでその方法を確認してください。 http://stackoverflow.com/a/372​​63453/3785314 – Programmer

関連する問題