加载小场景时 Unity 编辑器/独立构建崩溃
Unity editor / standalone build crash when loading a small scene
我使用 unity assetstore 中的 UFPS 资产设置了一个小场景。当我直接加载场景时,它的加载时间不到 1 秒,但是当我从我的菜单加载它时,编辑器崩溃了。我也有一个异步方法的“加载器”场景,其中一个也在工作,所以我认为按钮出了问题(我也尝试从菜单加载异步场景,并且每次都尝试从菜单崩溃加载游戏场景)与构建版本相同,我找不到任何解决方案。这是按钮的脚本 (c#) :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class ButtonEvents : MonoBehaviour
{
[SerializeField]
public int selected;
public Button ok;
void Start()
{
Button okbtn = ok.GetComponent<Button>();
okbtn.onClick.AddListener(StartGame);
}
public void Quit()
{
Application.Quit();
}
public void markabreakdown()
{
selected = 1;
}
void Update()
{
Button okbtn = ok.GetComponent<Button>();
okbtn.onClick.AddListener(StartGame);
Debug.Log(selected);
}
public void StartGame()
{
SceneManager.LoadScene(selected);
}
}
为什么在 Update
中使用 AddListener
-> 每一帧都添加一个回调?!当您单击该按钮时,您将尝试调用 StartGame
方法数百次,具体取决于您在该场景中花费的时间......然后很可能它会在某个时刻第二次尝试调用该方法场景已更改 -> 此按钮和此 class 已被销毁 -> 空引用异常。
删除整个 Update
方法!
您已经在 Start
中添加了回调
进一步注意 ok
已经 是 一个 Button
所以调用 ok.GetComponent<Button>()
是完全多余的。简单地做
void Start()
{
ok.onClick.AddListener(StartGame);
}
我使用 unity assetstore 中的 UFPS 资产设置了一个小场景。当我直接加载场景时,它的加载时间不到 1 秒,但是当我从我的菜单加载它时,编辑器崩溃了。我也有一个异步方法的“加载器”场景,其中一个也在工作,所以我认为按钮出了问题(我也尝试从菜单加载异步场景,并且每次都尝试从菜单崩溃加载游戏场景)与构建版本相同,我找不到任何解决方案。这是按钮的脚本 (c#) :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class ButtonEvents : MonoBehaviour
{
[SerializeField]
public int selected;
public Button ok;
void Start()
{
Button okbtn = ok.GetComponent<Button>();
okbtn.onClick.AddListener(StartGame);
}
public void Quit()
{
Application.Quit();
}
public void markabreakdown()
{
selected = 1;
}
void Update()
{
Button okbtn = ok.GetComponent<Button>();
okbtn.onClick.AddListener(StartGame);
Debug.Log(selected);
}
public void StartGame()
{
SceneManager.LoadScene(selected);
}
}
为什么在 Update
中使用 AddListener
-> 每一帧都添加一个回调?!当您单击该按钮时,您将尝试调用 StartGame
方法数百次,具体取决于您在该场景中花费的时间......然后很可能它会在某个时刻第二次尝试调用该方法场景已更改 -> 此按钮和此 class 已被销毁 -> 空引用异常。
删除整个 Update
方法!
您已经在 Start
进一步注意 ok
已经 是 一个 Button
所以调用 ok.GetComponent<Button>()
是完全多余的。简单地做
void Start()
{
ok.onClick.AddListener(StartGame);
}