Могу ли я запустить свой собственный скрипт загрузки во время заставки Unity?

10

Могу ли я загружать данные в фоновом режиме, пока открыт заставка Unity? Если так, то как?

Я пытаюсь запустить код во время заставки, а не просто загружать ресурсы.

Я не смог найти какую-либо информацию об этом в Google или в документации Unity .

Evorlor
источник
2
Я думаю, что Unity уже загружает все ваше приложение, когда отображается заставка. Я не думаю, что вы хотите сделать это возможно, но я бы хотел ошибиться на этот раз.
Гелий
2
Это похоже на проблему XY: почему вы хотите загружать вещи во время этого экрана?
doppelgreener
1
Все, что вы вставляете в первую сцену вашей игры, загружается, пока этот заставка активирована, верно? Итак, не будет ли достаточно включить контент, который вы хотите загрузить в эту первую сцену (вне камеры, отключен или просто указан, если вы не хотите, чтобы этот контент был виден сразу)? Или вы пытаетесь загрузить контент из другого источника, например с веб-сервера?
ДМГригорий
@DMGregory Отличный момент. Я обновил вопрос. Я пытаюсь запустить код.
Evorlor
Мы понимаем, что вы пытаетесь запустить код (загрузка скриптов - это обязательно код) - но какой код и почему? У вас есть проблема, и вы решили, что решение - запустить этот код во время заставки Unity; это почему?
doppelgreener

Ответы:

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
По сути да. Это способ сделать это с Unity. Поместите заставку / экран загрузки для вашей игры или анимацию логотипа студии, пока загружается следующая сцена.
Стефан Хоккенхалл
1
@ Evorlor - это то, что я делаю со своей игрой, и она отлично работает. Хотя это не позволяет вам использовать время, которое занимает введение Unity, поскольку это введение может быть довольно коротким, вы можете просто сделать загрузочный экран (пусть и общий) и использовать его для себя.
Джон Гамильтон
-1

Короткий ответ - нет , вы не можете этого сделать.

Оба приведенных выше ответа верны с точки зрения управления сценой. Вы можете использовать Scene Manager для загрузки сцены и, поскольку она асинхронная, вы можете запускать другой код параллельно.

Посмотрите документацию SceneManager.LoadScene для более подробной информации.

Самый быстрый способ запустить ваш код после запуска игры - запустить его из первой сцены с крошечным следом. Давайте назовем это Splash Scene . Единственное, что он будет содержать, это ваш заставочный образ и контроллер, выполняющий необходимый код и загружающий другую сцену.

Поскольку он занимает мало места, он загружается очень быстро и, таким образом, ваш код запускается практически мгновенно. Затем вы можете делать то, что вам нужно, и потом загружать Other Scene .

Другая вещь, которую вы можете попробовать, это удалить "заставку", удалить любые изображения, которые вы хотели бы показать там. Это будет немного быстрее, так как изначально он не будет загружен.

Так что поток будет примерно таким:

  1. Экран-заставка (здесь нет изображения, просто сделайте его черным)
  2. Всплеск сцены (небольшая площадь с вашим исходным кодом и загрузчиком следующей сцены)
  3. Вступительная сцена (обычная вступительная сцена)
  4. .... (другие сцены как обычно)

Чем меньше сцена, тем быстрее она будет загружаться. Вы можете использовать что-то вроде контроллера всплеска, прикрепленного к любому объекту на загруженном экране заставки .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
IndieForger
источник