Unity 6.3
0 онлайн 20 гостей 3 в системе
Вход

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

Scene перезагрузка при входе в режим воспроизведения включена по умолчанию. Это означает, что при входе в режим воспроизведения, Unity уничтожает все существующие сцены GameObjects и перезагружает сцену с диска. По мере того, как ваш проект становится более сложным, время между нажатием кнопки воспроизведения и полной загрузкой сцены в Редакторе увеличивается.

Когда вы отключаете перезагрузку сцены, процесс занимает меньше времени. Вместо перезагрузки сцены с диска, Unity только сбросить измененное содержимое сцены. Unity все еще вызывает то же самое функции событий (например, OnEnable, OnDisable и OnDestroy) как если бы сцена была только что загружена.

Последствия отключения перезагрузки сцены при входе в режим воспроизведения

Когда вы отключаете перезагрузку сцены, время, необходимое для запуска вашего приложения в Редакторе, больше не соответствует времени запуска в компилированной версии. Если вы хотите отладывать или профилировать точно то, что происходит во время запуска вашего проекта, вам следует включить перезагрузку сцены, чтобы более точно отобразить истинное время загрузки и процессы, происходящие в компилированной версии вашего приложения.

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

  • Unity не восстанавливает существующие объекты или не вызывает конструкторы, что означает, что несериализированные поля сохраняют значения, присвоенные им в режиме воспроизведения, при возвращении в режим редактирования. Это относится к полям всех типов скриптов, включая MonoBehaviours, ScriptableObjects и ваши собственные пользовательские типы C#. Подробную информацию о том, что является и не является сериализированным в различных контекстах, см. Правила сериализации.
    • Примечание: Поля private не серийизуются как часть обычного конвейера сборки, но серийизуются как часть горячей перезагрузки сценариев Редактора. Вот почему поля private, которые вы изменяете в режиме воспроизведения, могут сбросить свои первоначальные значения при выходе из режима воспроизведения, даже если перезагрузка сцены и домена при входе в режим воспроизведения отключена.
  • Unity преобразует нулевые поля private и internal массива и типа List в пустой массив или объект List при перезагрузке домена и они остаются ненулевыми для скриптов времени выполнения (не Редактора).
  • Скрипты, украшенные [ExecuteInEditMode] или [ExecuteAlways] не получают вызовов OnDestroy или Awake. В режиме редактирования эти скрипты могут модифицировать свои собственные поля или поля других скриптов выполнения. Чтобы уменьшить это, вы можете инициализировать любые затронутые поля в обратном вызове OnEnable с кодом внутри условия, которое проверяет значение EditorApplication.isPlaying. Пример этого и более подробный контекст о важности разделения режима воспроизведения и режима редактирования кода см. в описании [ExecuteAlways] API.

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

Дополнительные ресурсы