加载新场景后Unity 5 NullReferenceException
Posted
技术标签:
【中文标题】加载新场景后Unity 5 NullReferenceException【英文标题】:Unity 5 NullReferenceException after loading new scene 【发布时间】:2016-10-12 08:29:31 【问题描述】:所以我正在做我的第一个 fps 游戏,现在我正要从开始菜单转到我的第一个场景。当新场景加载时,清醒时,在我的暂停游戏脚本中,我设置了 pauseMenu.SetActive(false) (它是一个画布,暂停游戏脚本没有附加到它,而是附加到一个游戏管理器对象),我设置了一个表示 isPaused 为 false 的布尔值(在唤醒函数之前)。
现在感觉很棒,我想我做到了,没有崩溃,太容易了!但是......当我按下 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】: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);
其中一个应该可以解决您的问题。如果第二个失败,第一个应该。
【讨论】:
这两种方法都不起作用,但那是因为我的脚本在场景之间持续存在的 GameManager 对象上。所以我只是将脚本移到我的 Character 对象上,并使用了您的第一个选项public GameObject pauseMenu;
并且有效:) 此外,我在 Start 或 Awake 函数之前声明的所有内容,例如我的弹药,我将它们移动到这些函数中并且它有效以及 :) 我有点了解它现在是如何工作的,再次非常感谢!
@Manu 不错。你生活和学习。如果您在创建游戏菜单、暂停和恢复内容时遇到问题,请在此处查看如何操作。 ***.com/a/37263453/3785314
甜蜜!谢谢你:)以上是关于加载新场景后Unity 5 NullReferenceException的主要内容,如果未能解决你的问题,请参考以下文章
Firebase SDK 身份验证包在身份验证后自动加载场景的问题 Unity