首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载新场景后的统一5 NullReferenceException

加载新场景后的统一5 NullReferenceException
EN

Stack Overflow用户
提问于 2016-06-11 12:59:45
回答 1查看 1.5K关注 0票数 4

所以我正在做我的第一个fps游戏,现在我要从开始菜单到我的第一个场景。当这个新场景加载到清醒状态时,在我的暂停游戏脚本中,我设置了pauseMenu.SetActive( false ) (它是一个画布,暂停游戏脚本不是附加到它,而是附加到一个游戏管理器对象上),并且我设置了一个bool,它说isPaused为false(在唤醒函数之前)。

现在的感觉很好,我想我已经做到了,没有什么崩溃,它是如此容易!但是..。当我按下逃逸(暂停游戏),我得到一个NullReferenceException,因为它找不到暂停菜单了!在我开始切换场景之前,这个位操作非常好,所以,我的问题是,在中断脚本执行的场景之间切换时,有什么需要知道的吗?我的拍摄也不起作用,但我的SwitchWeapon/ My /MouseLook/ItemPickUp脚本工作。在“开始”菜单场景之间切换到实际级别场景时是否存在黑洞?(帮助:)

下面是我在PauseGame脚本上的代码

代码语言:javascript
复制
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;
             }
         }
     }
 }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-11 13:11:02

由于某种原因,pauseMenu在出现新场景后变得无效。

你有两个选择:

使pauseMenu公开,并在编辑器中将“暂停”菜单Canvas拖到编辑器中,然后从“清醒”函数中删除pauseMenu = GameObject.Find("Canvas_Pause_Menu");。您必须删除pauseMenu = GameObject.Find("Canvas_Pause_Menu");

代码语言:javascript
复制
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()函数中。

代码语言:javascript
复制
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);
     }
 }

其中一个应该能解决你的问题。如果第二次失败,第一次应该失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37764032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档