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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.