加载新场景后的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);
}
}
其中一个应该可以解决您的问题。如果第二个失败,第一个应该。
所以我正在做我的第一个 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);
}
}
其中一个应该可以解决您的问题。如果第二个失败,第一个应该。