
В Unity переключение сцен управляется классом SceneManager, который предоставляет методы для запуска нового окружения, фоновой подгрузки и проверки состояния операций. Корректная настройка списка сцен в Build Settings влияет на доступность переходов и предотвращает ошибки при обращении к сценам по имени или индексу.
При работе над проектом важно заранее определить, какая логика будет связана с загрузкой: мгновенное переключение, асинхронная подгрузка, отображение индикатора или сохранение данных между экранами. Выбор метода напрямую зависит от размера сцен и требуемой скорости реакции интерфейса.
Дополнительно стоит продумать способ передачи данных между экранами. Для небольших проектов подойдут ScriptableObject или статические контейнеры, а для сложных систем удобнее использовать сервисы с контролируемым жизненным циклом. Такой подход упрощает переходы и исключает обращения к недоступным объектам.
Подготовка списка сцен в Build Settings для последующей загрузки
Unity загружает сцены только из списка, указанного в Build Settings. Чтобы добавить сцену, нужно открыть окно File → Build Settings и перенести файлы сцен в раздел “Scenes In Build”. Порядок в списке влияет на их индексацию, поэтому перед настройкой загрузки стоит зафиксировать нужную последовательность.
Каждой сцене присваивается числовой индекс, который используется при вызове SceneManager.LoadScene(int index). Если индексы изменяются в процессе разработки, возникает риск загрузки неправильного экрана. Для стабильной структуры удобнее загружать сцены по имени, оставив индексы только для систем, где важна скорость обращения.
Перед публикацией проекта стоит выполнить проверку: удалить неиспользуемые сцены, убедиться в правильной расстановке галочек напротив нужных файлов и протестировать загрузку всех экранов через отдельный тестовый скрипт. Это снижает вероятность ошибок вида “Scene not in build” и упрощает дальнейшую работу с переходами.
Использование SceneManager.LoadScene для переключения экранов

Метод SceneManager.LoadScene подходит для мгновенного перехода между экранами без фоновой подгрузки. Вызов может выполняться по имени сцены или по индексу. Первый вариант безопаснее при работе с большим числом файлов, второй используется там, где важна минимальная задержка при обращении.
Перед вызовом загрузки стоит убедиться, что целевая сцена присутствует в Build Settings. При обращении к отсутствующему имени Unity вызывает исключение, которое можно отследить в консоли. Для предотвращения подобных ситуаций сценарии меню и переходов лучше связывать с константами или перечислениями, где указаны все доступные варианты.
Основные варианты вызова представлены в таблице:
| Способ вызова | Пример | Когда использовать |
|---|---|---|
| По имени | SceneManager.LoadScene(«MainMenu»); | При работе с проектом, где структура сцен может изменяться |
| По индексу | SceneManager.LoadScene(2); | В системах, где нужен быстрый вызов без строковых операций |
| С указанием режима | SceneManager.LoadScene(«Map», LoadSceneMode.Single); | Когда требуется закрыть предыдущую сцену и освободить память |
Применяя LoadScene, стоит учитывать, что предыдущая сцена полностью выгружается. Если необходимо сохранить объекты, их нужно пометить вызовом DontDestroyOnLoad ещё до старта перехода. Это помогает передавать состояния, таймеры и игровые параметры без создания глобальных хранилищ.
Загрузка сцен по индексу или имени: различия и примеры

SceneManager поддерживает два способа обращения к сценам: строковое имя и числовой индекс. Оба варианта используют один и тот же механизм загрузки, но решают разные задачи при работе с проектом.
Ключевые различия:
- Обращение по имени не зависит от позиции в Build Settings. Изменение порядка сцен не влияет на работу вызова.
- Обращение по индексу требует стабильного списка в Build Settings. Любое изменение порядка приводит к загрузке другого файла.
- Строковое имя удобнее для обслуживания проекта, а индекс подходит там, где важна минимальная нагрузка при вызове.
Примеры использования:
- Загрузка по имени: SceneManager.LoadScene(«Gameplay») – подходит для меню, карт выбора уровней, переходов между крупными модулями.
- Загрузка по индексу: SceneManager.LoadScene(1) – используется в проектах с фиксированной структурой или при серийном запуске однотипных сцен.
- Проверка доступности имени:
- if (Application.CanStreamedLevelBeLoaded(«Arena»)) { SceneManager.LoadScene(«Arena»); }
Для крупных проектов рекомендуется вести перечисление с именами сцен или использовать ScriptableObject-контейнер, чтобы исключить ошибки при переносе или переименовании файлов.
Асинхронная загрузка сцен через LoadSceneAsync и контроль прогресса
Метод LoadSceneAsync позволяет подгружать сцену в фоне, сохраняя отклик интерфейса и давая возможность отображать индикатор. Запуск возвращает объект AsyncOperation, через который можно отслеживать состояние загрузки.
Основные параметры AsyncOperation:
- progress – показывает степень готовности в диапазоне от 0 до 0.9; финальный этап активации не включён в значение.
- allowSceneActivation – управляет моментом переключения; если присвоить false, сцена не активируется, пока не будет завершена подготовка интерфейса.
Пример последовательности:
- Запустить загрузку: var op = SceneManager.LoadSceneAsync(«Level1»);
- Установить задержку активации: op.allowSceneActivation = false;
- Отображать данные progress для интерфейса, не раскрывая пользователю скрытый диапазон 0.9→1.0.
- После завершения подготовки UI или логики вызвать op.allowSceneActivation = true и перейти в новую сцену.
Такой подход удобен, когда требуется переход с предварительной загрузкой ресурсов, отображением полосы состояния или выполнением финальной проверки перед активацией сцены.
Переход между сценами с передачей данных через ScriptableObject или Singleton

При смене сцен объекты текущего окружения выгружаются, поэтому данные, используемые в следующем экране, необходимо вынести в отдельный контейнер. Наиболее удобные варианты – ScriptableObject и паттерн Singleton, которые сохраняют значения вне конкретной сцены.
ScriptableObject подходит для параметров, которые должны существовать независимо от жизненного цикла игровых объектов. Созданный файл хранит значения на диске и может использоваться в нескольких сценах без копирования. Такой способ удобен для передачи настроек уровня, временных параметров или состояния меню. Письменная запись выполняется напрямую: config.playerHealth = 80;, а чтение – в момент загрузки новой сцены.
Singleton применяют там, где требуется оперативный доступ к данным и выполнение логики. Компонент, помеченный DontDestroyOnLoad, продолжает работать после перехода и служит хранилищем состояний. Через него удобно передавать результат выбора пользователя, параметры запуска уровня, временные значения таймеров или информацию о сеансе.
Выбор подхода зависит от того, требуется ли хранить данные в виде отдельных файлов или нужен активный объект с поведением. ScriptableObject обеспечивает устойчивость структуры, а Singleton обеспечивает контроль контекста между сценами и позволяет обновлять значения в процессе работы.
Обработка ошибок при загрузке и проверка доступности сцены
Перед вызовом загрузки стоит проверить, присутствует ли сцена в Build Settings. Для этого используется метод Application.CanStreamedLevelBeLoaded, который возвращает логическое значение. Если метод сообщает, что сцена недоступна, переход выполнять нельзя – нужно вывести сообщение в интерфейс или записать информацию в лог.
При работе через LoadScene и LoadSceneAsync возможны ошибки, вызванные опечатками в именах или удалением файлов сцены. Чтобы исключить подобные ситуации, имена сцен удобно хранить в перечислении или в ScriptableObject-каталоге, где задаются допустимые параметры загрузки. Такой подход предотвращает обращение к несуществующим файлам.
После выявления ошибки полезно выполнить повторную проверку структуры Build Settings: убедиться, что сцена добавлена, индекс соответствует ожидаемому порядку, а пути к файлам не были изменены в процессе работы над проектом.
Вопрос-ответ:
Почему сцена не загружается через LoadScene, хотя файл присутствует в проекте?
Чаще всего проблема связана с тем, что сцена не добавлена в Build Settings. Unity не загружает файлы, которые отсутствуют в списке “Scenes In Build”. Откройте Build Settings, убедитесь, что сцена включена, и проверьте, совпадает ли её имя с тем, что используется в коде. Ошибка также может возникнуть из-за лишних пробелов или неверного регистра символов.
Когда лучше использовать загрузку по индексу, а когда — по имени?
Загрузка по имени удобнее там, где структура проекта может меняться. При обращении по индексу любая перестановка сцен приведёт к вызову другого файла, что создаёт риск появления трудноловимых ошибок. Индекс выбирают только тогда, когда список сцен стабилен и не планируется менять порядок.
Как правильно показывать индикатор прогресса при асинхронной загрузке?
LoadSceneAsync возвращает значение progress в диапазоне от 0 до 0.9. Финальная активация проходит отдельно, поэтому индикатор обычно нормализуют: отображают progress / 0.9, а после достижения 0.9 переходят к экрану ожидания или вручную разрешают активацию сцены через allowSceneActivation.
Можно ли передавать данные между сценами без Singleton?
Да, для этого подходят ScriptableObject-файлы. Они хранят параметры на диске и не зависят от самого перехода. Запишите нужные значения перед вызовом LoadScene, а в новой сцене считайте их в момент инициализации. Такой подход удобен, если данные не требуют выполнения логики и используются как конфигурация.
Как проверить, доступна ли сцена перед загрузкой?
Используйте Application.CanStreamedLevelBeLoaded. Метод возвращает true, если Unity может обратиться к сцене из Build Settings. Это позволяет заранее вывести предупреждение пользователю, переключить кнопку в неактивное состояние или записать информацию в журнал, не допуская вызова с ошибкой.
Почему асинхронная загрузка зависает на значении progress = 0.9 и сцена не переключается?
Поведение связано с тем, что Unity останавливает активацию сцены на этапе 0.9, ожидая разрешения. Если в коде установлено allowSceneActivation = false, переключение не произойдёт, пока не выполнить явное включение этого параметра. Такой подход используют при создании экрана загрузки: сначала отображают интерфейс, затем вручную разрешают активацию сцены. Если значение параметра нигде не меняется, проверьте, не повторяется ли назначение allowSceneActivation в нескольких компонентах.
