Unity 场景加载时间非常长

Posted

技术标签:

【中文标题】Unity 场景加载时间非常长【英文标题】:Unity Scene loading times are extremly long 【发布时间】:2019-08-03 20:51:55 【问题描述】:

我对 Unity 还很陌生,所以对 IDE 没有太多经验。 我正在开发一个非常基本的应用程序、一个登录和一个带有一些基本 UI 元素的仪表板。

我遇到的问题是当我尝试切换场景时。因此,从 LoginScene 到 Dashboard 场景最多可能需要 20 秒。 脚本甚至不需要运行太多逻辑。 在我看来,这太长了,有人知道如何优化我的代码,或者至少知道我做错了什么?

这是检查正确用户和改变场景的代码。

// Start is called before the first frame update
void Start()

    Screen.orientation = ScreenOrientation.Portrait;


// Update is called once per frame
void Update()

    //get values from inputfields
    emailString = email.GetComponent<InputField>().text;
    passwordString = password.GetComponent<InputField>().text;

    btnLogin = login.GetComponent<Button>();
    btnLogin.onClick.AddListener(ValidateLogin);


private void ValidateLogin()

    if (emailString.Trim() == "aa" && passwordString.Trim() == "aa")
    
        print("login succeeded!");

        SceneManager.LoadScene(1);
    
    else
    
        print("wrong credentials");
    


顺便说一句:数字 1 是对我的下一个场景,仪表板场景的引用。

【问题讨论】:

只是一个问题:为什么要在更新中添加侦听器,而不是在开始中?我怀疑这就是问题所在。 嗯,有几个问题。您应该将几乎所有内容从Update 迁移到Start。无需多次获取组件或添加侦听器。还要在ValidateLogin 中为emailString 赋值。 @Andrea 非常感谢您!不知道为什么我在更新中写了它。这是一个非常愚蠢的错误。 @AliKanat 代码现在运行流畅多了,非常感谢! 【参考方案1】:

GetComponent&lt;&gt;() 是一项资源密集型任务,您不必要地调用其中的 3 个,您还每帧添加一个事件侦听器。

你应该做的是: 阅读 Update、Awake、Start 的作用,然后删除 GetComponent&lt;&gt;() 部分并改用属性或字段,并且不要每帧都添加事件监听器。

InputField emailInputField;
InputField passwordInputField;
Button loginButton;

// Setting up the Scene
void Awake()

    emailInputField = email.GetComponent<Inputfield>();
    passwordInputField = password.GetComponent<InputField>();
    loginButton = login.GetComponent<Button>();

    loginButton.onClick.AddListener(ValidateLogin);


// Start is called before the first frame update
void Start()

    Screen.orientation = ScreenOrientation.Portrait;


// Update is called once per frame
void Update()

    //get values from inputfields
    emailString = emailInputField.text;
    passwordString = passwordInputField.text;


private void ValidateLogin()

    if (emailString.Trim() == "aa" && passwordString.Trim() == "aa")
    
        print("login succeeded!");

        SceneManager.LoadScene(1);
    
    else
    
        print("wrong credentials");
    


【讨论】:

谢谢,这对我帮助很大!我开始了解这个 Unity 事件系统是如何工作的。 很高兴它对您有所帮助,这仍然不是最聪明的方法,但适合您的学习曲线 您愿意与我分享“最聪明”的方法吗?真的很想从一开始就知道“最好”的方式,这样我的学习过程会顺利很多。 当然,它不再以可衡量的方式影响您的性能,但是为什么要每帧检查字符串?,当您单击登录按钮时就足以验证它,所以我会读进去ValidateLogin() 功能(这是在线登录表单的工作方式,它们仅在按钮推送时验证),所以基本上你的更新功能在这里是不必要的,还有另一个注意事项 Unity 默认会添加更新功能,但如果你不使用任何逻辑Update() 函数你应该删除它,因为在一个更大的项目中它会以可衡量的方式影响你的表现 而这样做的原因是引擎会调用那个空的Update()函数【参考方案2】:

转换我的评论:监听器被添加到Update(),而不是Start()。因此,它被分配到每一帧。

【讨论】:

你知道是什么让代码变慢了吗?不会有无穷无尽的听众,所以会有一个无限循环,我的代码会冻结吗?按钮如何知道它应该使用哪个监听器?

以上是关于Unity 场景加载时间非常长的主要内容,如果未能解决你的问题,请参考以下文章

GameFrameWork框架(Unity3D)使用笔记(八) 实现场景加载进度条

unity中 加载大场景怎么解决

Unity加载场景 异步 清理资源

场景在 Unity 中加载但无法加载场景 Android

Unity:无法从资产包加载场景

加载新场景后Unity 5 NullReferenceException