Плавный экран загрузки между сценами

14

Я создал экран загрузки для отображения анимации загрузки при загрузке следующей сцены. Я загружаю следующую сцену асинхронно с:

yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);

И тоже установлено Application.backgroundLoadingPriority = ThreadPriority.Low;, но поведение все равно такое же, как при обычной загрузке уровня.

Я что-то пропустил?

Ожидаемое поведение:

  • Выйдите из уровня и исчезните.
  • Появится экран загрузки.
  • Как только загрузка будет завершена, исчезнет экран загрузки.
  • Исчезать в следующей сцене.

Что происходит:

  • Выйдите из уровня и исчезните.
  • Появляется экран загрузки, заморожен
  • Внезапно новая сцена исчезает.

Как только начинается загрузка, игра просто зависает, как при обычной загрузке сцены.

Я прочитал, что вы должны установить allowSceneActivation = false, чтобы вы могли исчезнуть с экрана загрузки, а затем установить его так, trueчтобы позволить единице завершить загрузку, но это полностью останавливает мою игру, как будто асинхронная операция никогда не заканчивает загрузку.

Лео
источник
У меня была эта проблема, и я ничего не нашел здесь. После поиска в Google я узнал, что является причиной этой проблемы. Я решил опубликовать это здесь, чтобы другие могли легко найти ответ. Пожалуйста, дайте мне знать, если бы вы добавили некоторые улучшения в мой ответ / вопрос. Благодарность!
Лев

Ответы:

18

Когда вы загружаете сцену с SceneManager.LoadSceneAsync() происходит две вещи:

  • GameObjects сцены загружаются в память.
  • Тогда вся сцена включена. Все обратные вызовы Awake () и Start () будут вызываться для объектов в сцене.

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

Действительно, установка SceneManager.LoadSceneAsync().allowSceneActivationв значение falseзаставит асинхронную операцию завершить только первый шаг процесса и будет ждать, пока не будет установлено trueначало второй части процесса.

Но если вы установили allowSceneActivationв falseи выход на обратный вызов , как это, вы будете замораживать свою игру на благо:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
yield return AO;

//Fade the loading screen out here

AO.allowSceneActivation = true;

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

Если вы хотите знать, когда первая часть операции готова, а затем перейти ко второй, вы должны положиться AsyncOperation.progress. Это значение прекратится 0.9fсразу же, пока оно ожидаетallowSceneActivation флаг.

Это должно быть что-то вроде этого:

AsyncOperation AO = SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive); 
AO.allowSceneActivation = false;
while(AO.progress < 0.9f)
{
    yield return null
}

//Fade the loading screen out here

AO.allowSceneActivation = true;

Если вы хотите, чтобы активация сцены не замораживала вашу игру, вы должны сохранить минимальные значения обратных вызовов Awake и Start и инициализировать свои сценарии в сопрограмме в течение нескольких циклов.

Лео
источник
0

У меня была точно такая же проблема в Unity 5.6, и я уже пытался добавить в отчеты о доходности. Это был сам LoadSceneAsync, который блокировал основной поток Unity и препятствовал тому, чтобы текущая сцена приятно показывала любой прогресс загрузки.

Насколько я могу судить, это может показаться ошибкой в ​​Unity. Когда моя сцена была менее сложной, мой код работал отлично, плавный переход. Как только он стал больше, Unity заблокировала поток примерно на 6 секунд, в то время как игра остается «не отвечающей», несмотря на то, что операция предположительно является «асинхронной».

Я решил проблему, посмотрев на свое освещение. В прошлом были большие ошибки с освещением и этой функцией. Поэтому я просмотрел свои объекты и обнаружил, что у меня есть прожектор на одном объекте (хотя он был отключен ...)

Я удалил прожектор и ура! Сцена загружается асинхронно правильно! Нет блокировки!

Повелитель стека
источник
До редактирования этот пост фактически не предлагал решения проблемы. Хорошо, что вы добавили исправление, но в будущем, если вы хотите сказать: «У меня тоже есть эта проблема», вам не следует использовать ответы для этой цели. Заработав небольшую репутацию, вы сможете комментировать существующие посты или щедро ставить вопросы, чтобы поощрять новые ответы.
DMGregory