Reputation: 65
so I'm doing my first fps game and now I'm at the point of going from the start menu to my first scene. When that new scene loads, on the awake, in my pause game script, I set the pauseMenu.SetActive(false) (it's a Canvas and the pause game script is not attached to it but to a game manager object) and I set a bool that says isPaused to false (before the awake function).
Now the feeling is great, I'm thinking I've made it, nothing crashed, it is so easy! But... when I press on Escape (to pause the game), I get a NullReferenceException cause it can't find the pause menu anymore! Before I started working on switching scenes, that bit was working more than fine, SO, my question is, is there something to know when switching between scenes that breaks the scripts execution? My shooting doesn't work neither but my SwitchWeapon/Movement/MouseLook/ItemPickUp scripts work. Is there a black hole when switching between a Start Menu scene to an actual level scene? HELP :)
Here is my code on the PauseGame Script
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;
}
}
}
}
Upvotes: 4
Views: 1828
Reputation: 125275
pauseMenu
is becoming null after new scene for some reason.
You have two options:
Make pauseMenu
public and drag the pause menu Canvas
to it in the Editor then remove pauseMenu = GameObject.Find("Canvas_Pause_Menu");
from the Awake function. You must remove 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 put the code in your Awake()
function into the Start()
function.
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);
}
}
One of these should solve your problem. The first one should if the second one fails.
Upvotes: 0