Вход в режим воспроизведения с отключенной перезагрузкой сцены
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.
Более подробную информацию о событиях, пропускаемых при отключенной перезагрузке сцены, см. в Подробности отключения домена и перезагрузки сцены.