加载新场景后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的主要内容,如果未能解决你的问题,请参考以下文章

Unity把新场景代码添加到构建并在加载场景时叠加场景

unity 5.3 以后加载场景

Cocos Creator 加载和切换场景(官方文档摘录)

Firebase SDK 身份验证包在身份验证后自动加载场景的问题 Unity

Unity5.X打包场景为AssetBundle后,加载场景后烘培灯光贴图不显示

unity为啥不能加载脚本