我可以在Unity启动画面中运行自己的加载脚本吗?


10

Unity启动屏幕启动时,是否可以在后台加载数据?如果是这样,怎么办?

我正在尝试在初始屏幕中运行代码,而不仅仅是加载资产。

我无法在Google或Unity文档中找到与此相关的任何信息。


2
当启动屏幕可见时,我认为Unity已经在加载整个应用程序。我不认为您想做的事是可行的,但是这次我想错了。
Hellium

2
这似乎有点XY问题:为什么要在该屏幕期间加载内容?
doppelgreener

1
在启动画面启动时,您在游戏第一个场景中放的任何内容都会加载,对吗?因此,将要加载的内容包括在第一个场景中是不够的(摄像机外,禁用或仅在不想立即显示该内容的情况下才引用)?还是您正在尝试从Web服务器等其他来源加载内容?
DMGregory

@DMGregory好点。我更新了问题。我正在尝试运行代码。
Evorlor '17

我们了解您正在尝试运行代码(加载脚本必须是代码)-但是什么代码以及为什么?您遇到了问题,并且已确定解决方案是在Unity启动屏幕中运行该代码。这是为什么?
doppelgreener

Answers:


9

我只是做了一些测试,发现在第一个场景中对象的构造函数实际上在初始屏幕仍然显示的时候被调用了。

以下是我使用静态秒表测量的一些时间:

Constructed  0     s
Awake        2.118 s
OnEnable     2.12  s
Start        2.744 s
First Update 2.919 s

因此,看起来我们可以通过从构造函数中触发脚本来触发脚本在启动屏幕结束前(默认设置)运行约3秒钟。您可以尝试从此处触发加载代码(可能在其自己的线程上)。

请注意,这很可能是从加载线程中调用的,因此,由于我们不在主线程上,因此在这里允许执行的操作会受到更多限制。如果加载线程不支持您要执行的特定操作,请考虑发布一个包含您的应用程序详细信息的新问题,我们可以尝试找到解决该问题的方法。


1
结束前3秒钟是什么意思?
雅各布

在我的实验中,我的脚本Update()在构造函数触发后的2.9秒获得了第一次滴答。这就是我目前可以看到的所有东西。
DMGregory

2

最好的选择是制作自己的加载屏幕,并将其设置为初始场景。然后,从该简单场景开始,使用场景管理器异步方式在后台加载下一个场景。

我找不到信息来确认这一点,但是根据我的观察,似乎在显示初始屏幕时Unity正在加载您的初始场景。

在某些平台上,如果加载足够快,游戏将在启动屏幕消失之前开始运行。

所有这些可以随时在任何平台,任何版本更新上更改。无法保证这将是一致的,因此最好使用自己的加载屏幕。


双负载屏幕是您的建议?
Evorlor '17

本质上是。这是使用Unity的方法。在加载下一个场景时,为您的游戏或一些工作室徽标动画放一个启动/加载屏幕。
斯蒂芬·霍肯赫尔

1
@Evorlor这就是我在游戏中所做的事情,并且工作得很好。尽管这不能让您利用Unity简介所花费的时间,但由于简介可能很短,因此您可以制作一个加载屏幕(但是是通用的)并将其用于您的屏幕。
约翰·汉密尔顿

-1

简短的回答是,您不能那样做。

以上两个答案在场景管理方面都是正确的。您可以使用场景管理器加载场景,由于它是异步的,因此您可以并行运行其他代码。

看看SceneManager.LoadScene文档了解更多信息。

在游戏开始后,尽可能快地运行代码的最佳方法是从第一个场景开始运行,并且占用空间很小。我们称它为Splash Scene。它所包含的唯一内容是您的启动图像和运行所需代码并加载另一个场景的控制器。

由于它的占用空间小,因此加载速度非常快,因此几乎可以立即运行您的代码。然后,您可以执行所需的操作,然后加载“ 其他场景”

您可以尝试的另一件事是删除“启动画面”,删除要在此处显示的所有图像。因为它最初不会被加载,所以它会更快一点。

因此流程如下所示:

  1. 启动画面(此处无图像,仅将其变为黑色)
  2. 飞溅场景(初始代码和下一个场景加载器占用的空间较小)
  3. 介绍场景(常规介绍场景)
  4. ....(照常其他场景)

较小的场景将更快地加载。您可以使用诸如飞溅控制器之类的东西附加到已加载的飞溅屏幕中的任何对象

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.