Чи можу я запустити власний сценарій завантаження під час сплеску екрану Unity?


10

Чи можу я завантажувати дані у фоновому режимі, коли екран сплеску Unity увімкнено? Якщо так, то як?

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

Мені не вдалося знайти жодної інформації про це в Google або Документації Unity .


2
Я думаю, що Unity вже завантажує всю вашу програму, коли видно сплеск екрану. Я не думаю, що те, що ти хочеш зробити, можливо, але я хотів би цього разу помилитися.
Геліум

2
Це відчувається як проблема XY: чому ви хочете завантажувати матеріали під час цього екрану?
doppelgreener

1
Все, що ви поставите на першій сцені вашої гри, завантажується під час запуску екрана, чи не так? Отже, чи не буде достатньо включити вміст, який ви хочете завантажити у цій першій сцені (або поза камерою, відключеною, або просто посиланням, якщо ви не хочете, щоб цей вміст відображався відразу)? Або ви намагаєтеся завантажити вміст з іншого джерела, наприклад веб-сервера?
DMGregory

@DMGregory Чудова точка. Я оновив питання. Я намагаюся запустити код.
Еворлор

Ми розуміємо, що ви намагаєтеся запустити код (для завантаження сценаріїв обов'язково код) - але який код і чому? У вас виникла проблема, і ви вирішили вирішити, що запустити цей код під час сплеску екрану 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 завантажує вашу початкову сцену, поки відображається екран сплеску.

На деяких платформах гра починає запускатися до того, як зникне екран сплеску, якщо завантаження досить швидко.

Все це може змінитися в будь-який час, на будь-якій платформі, будь-якому оновленнях версій. Немає гарантій, що це буде відповідати, тому вам краще використовувати власний екран завантаження.


Екрани подвійного навантаження - це те, що ви пропонуєте?
Еворлор

По суті так. Це спосіб зробити це з Unity. Поставте заставку / екран завантаження для вашої гри або анімації логотипу студії, поки вона завантажує наступну сцену.
Стефан Хокенхолл

1
@Evorlor - це те, що я роблю зі своєю грою, і працює чудово. Хоча це не дозволяє використовувати час, який займає інтродукція Unity, оскільки це введення може бути досить коротким, ви можете просто зробити екран завантаження (хоч і загальний) і використовувати його для свого.
Джон Гамільтон

-1

Коротка відповідь - ні , цього не можна робити.

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

Перегляньте документацію на SceneManager.LoadScene для отримання більш детальної інформації.

Найближчим ви можете дістати свій код якомога швидше після запуску гри - це запустити його з першої сцени з крихітним слідом. Назвемо це сценою сплеску . Єдине, що воно містило б - це ваше зображення сплеску та контролер, на якому працює потрібний код та завантажується інша сцена.

Оскільки він має невеликий слід, він завантажиться дуже швидко і, таким чином, зробить ваш код майже миттєвим. Потім ви можете робити те, що вам потрібно зробити, а потім завантажити іншу сцену .

Інша річ, яку ви можете спробувати - це видалити "заставку", видалити будь-які зображення, які ви хочете там відобразити. Це буде трохи швидше, оскільки він не завантажується спочатку.

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

  1. Екран заставки (зображення тут немає, просто зробіть його чорним)
  2. Сплеск сцени (невеликий слід із початковим кодом та наступним завантажувачем сцени)
  3. Інтро-сцена (звичайна вступна сцена)
  4. .... (інші сцени, як завжди)

Менша сцена швидше завантажується. Ви можете використовувати щось на зразок контролера бризок, приєднаного до будь-якого об’єкта на завантаженому екрані заставки .

using UnityEngine;
using UnityEngine.SceneManagement;

public class SplashController: MonoBehaviour
{
    void Start()
    {

        // RunSomeSyncMethod();

        SceneManager.LoadScene("OtherSceneName", LoadSceneMode.Additive);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.