Я создал экран загрузки для отображения анимации загрузки при загрузке следующей сцены. Я загружаю следующую сцену асинхронно с:
yield return SceneManager.LoadSceneAsync(scene,LoadSceneMode.Additive);
И тоже установлено Application.backgroundLoadingPriority = ThreadPriority.Low;
, но поведение все равно такое же, как при обычной загрузке уровня.
Я что-то пропустил?
Ожидаемое поведение:
- Выйдите из уровня и исчезните.
- Появится экран загрузки.
- Как только загрузка будет завершена, исчезнет экран загрузки.
- Исчезать в следующей сцене.
Что происходит:
- Выйдите из уровня и исчезните.
- Появляется экран загрузки, заморожен
- Внезапно новая сцена исчезает.
Как только начинается загрузка, игра просто зависает, как при обычной загрузке сцены.
Я прочитал, что вы должны установить allowSceneActivation = false
, чтобы вы могли исчезнуть с экрана загрузки, а затем установить его так, true
чтобы позволить единице завершить загрузку, но это полностью останавливает мою игру, как будто асинхронная операция никогда не заканчивает загрузку.
Ответы:
Когда вы загружаете сцену с
SceneManager.LoadSceneAsync()
происходит две вещи:Второй шаг, включение сцены, - это то, что на самом деле замораживает единство, потому что единство запускает все эти обратные вызовы инициализации в ваших сценариях за один цикл.
Действительно, установка
SceneManager.LoadSceneAsync().allowSceneActivation
в значениеfalse
заставит асинхронную операцию завершить только первый шаг процесса и будет ждать, пока не будет установленоtrue
начало второй части процесса.Но если вы установили
allowSceneActivation
вfalse
и выход на обратный вызов , как это, вы будете замораживать свою игру на благо:Почему? Поскольку вы указываете асинхронной операции не переходить ко второму шагу загрузки сцены, значит, операция никогда не будет завершена.
Если вы хотите знать, когда первая часть операции готова, а затем перейти ко второй, вы должны положиться
AsyncOperation.progress
. Это значение прекратится0.9f
сразу же, пока оно ожидаетallowSceneActivation
флаг.Это должно быть что-то вроде этого:
Если вы хотите, чтобы активация сцены не замораживала вашу игру, вы должны сохранить минимальные значения обратных вызовов Awake и Start и инициализировать свои сценарии в сопрограмме в течение нескольких циклов.
источник
У меня была точно такая же проблема в Unity 5.6, и я уже пытался добавить в отчеты о доходности. Это был сам LoadSceneAsync, который блокировал основной поток Unity и препятствовал тому, чтобы текущая сцена приятно показывала любой прогресс загрузки.
Насколько я могу судить, это может показаться ошибкой в Unity. Когда моя сцена была менее сложной, мой код работал отлично, плавный переход. Как только он стал больше, Unity заблокировала поток примерно на 6 секунд, в то время как игра остается «не отвечающей», несмотря на то, что операция предположительно является «асинхронной».
Я решил проблему, посмотрев на свое освещение. В прошлом были большие ошибки с освещением и этой функцией. Поэтому я просмотрел свои объекты и обнаружил, что у меня есть прожектор на одном объекте (хотя он был отключен ...)
Я удалил прожектор и ура! Сцена загружается асинхронно правильно! Нет блокировки!
источник