Сцены в Unity: создание, загрузка из меню и сохранение состояния между уровнями
Сцена хранит расположение объектов и их настройки. В игре это может быть уровень, меню или общий набор систем. Одно приложение способно переключать сцены или держать несколько загруженными одновременно.
Сделаем переход из Menu в Level через кнопку, затем разберём обычную и additive-загрузку, постоянные объекты и частые ошибки. Пример рассчитан на Unity 6.
ТОП-5 курсов обучения Unity:
Создание и сохранение
Создайте сцену, сохраните её в Assets/Scenes как Menu.unity. Сделайте вторую сцену Level.unity с несколькими видимыми объектами. У каждой должна быть понятная камера; при проверке перехода изображения должны отличаться.
Сохранение сцены записывает редакторные данные, но не является системой сохранения прогресса игрока. Изменения во время Play обычно служат текущей сессии. Для постоянного прогресса нужно отдельно записывать нужные игровые данные.
Убедитесь, что вы редактируете сцену, а не prefab в изолированном режиме. Похожие объекты в двух местах могут иметь разные источники настроек.
Добавьте обе сцены в сборку
Откройте File → Build Profiles и проверьте Scene List активного профиля. Добавьте Menu и Level, включите обе, поставьте Menu первой. Если профиль переопределяет общий список, изменяйте используемый им вариант.
Обычная загрузка SceneManager должна иметь доступ к указанной сцене. Наличие файла в Project не является её автоматическим включением. Порядок и включение описаны в документации списка сцен.
Числовой build index зависит от порядка списка. Для ясности примера будем использовать имя Level. При повторяющихся именах используйте полный путь сцены в поддерживаемой форме.
Компонент асинхронной загрузки
Создайте SceneLoadButton.cs и прикрепите к пустому объекту Loader в Menu. Назначьте Scene Name: Level.
Добавьте Canvas и Button. В On Click кнопки перетащите Loader и выберите SceneLoadButton → Load(). Проверьте EventSystem и соответствующий input module; настройка UI описана в статье об интерфейсе.
В Play нажмите кнопку. Level должен заменить Menu. Повторные нажатия во время операции блокируются флагом loading. После успешной Single-загрузки объект Loader уничтожается вместе с исходной сценой, поэтому завершать его обычное состояние для следующего нажатия не требуется.
Что даёт LoadSceneAsync
Асинхронная операция позволяет ожидать загрузку без обычного синхронного вызова, который сразу выполняет переход. При этом импортированные ресурсы и активация всё равно могут создавать заметные затраты: слово async не гарантирует полностью незаметный переход.
Можно показывать экран загрузки и следить за operation.progress. Если вы откладываете активацию через allowSceneActivation, учитывайте особенность прогресса: до разрешения активации операция может остановиться на 0.9. Не используйте это значение как готовый линейный процент без понимания этапов.
Параметры загрузки описаны в API LoadSceneAsync. Для самого первого перехода оставьте автоматическую активацию, как в примере.
Single и Additive
Single заменяет обычные загруженные сцены. Additive добавляет новую, оставляя предыдущие. Это удобно для общего интерфейса, persistent-сцены или частей большого уровня, но требует управления жизненным циклом.
При additive-схеме явно определите, какая сцена активна, куда должны попадать новые объекты и когда выгружать старую. Следите за камерами, Audio Listener и повторными менеджерами. Две сцены с одинаковыми общими системами могут создать дубликаты.
Не превращайте каждый переход в additive только ради отсутствия перезапуска. Для небольшой последовательной игры Single часто проще; общий прогресс можно хранить отдельно.
Как передавать состояние
Используйте отдельную модель сессии, постоянный объект или явно загружаемые данные. DontDestroyOnLoad сохраняет объект в памяти, но не записывает его на диск. Пример есть в статье о менеджере игры.
Не держите в постоянной системе случайные ссылки на UI и врагов выгружаемой сцены. Эти объекты исчезают. Новая сцена должна получить актуальное состояние и подключить свои представления.
ScriptableObject с настройками также не следует бездумно использовать как автоматическое постоянное сохранение. Разделяйте исходные данные и состояние конкретного запуска.
Что проверить после перехода
Запустите Menu, перейдите в Level, затем сделайте и проверьте сборку. Убедитесь, что загрузка работает по тому же списку сцен, камера активна, управление подключено и состояние раунда имеет ожидаемые значения.
Если сцена недоступна, проверьте имя и включение. Если отображается чёрный экран, изучите камеры и содержимое Level. Если появляется второй менеджер, проверьте правила создания постоянных систем.
Переход готов, когда он воспроизводится в приложении и не зависит от случайно открытой сцены Editor.