SceneManager
класс в UnityEngine.SceneManagement
Выполнено в:UnityEngine.CoreModule
Описание
Управление сценами в проигрывателе и в режиме воспроизведения в редакторе.
Вы можете использовать SceneManager для управления и манипулирования сценами в проигрывателе.
Scene создание, загрузка и разгрузка
- Для динамического создания сцен во время выполнения используйте SceneManager.CreateScene.
- Для загрузки сцен из встроенного контента, используйте SceneManager.LoadSceneAsync или SceneManager.LoadScene.
- Сцены не могут быть сохранены во время выполнения.
- Вы можете загружать несколько сцен одновременно. Чтобы добавить дополнительные сцены к уже открытым, используйте опцию LoadSceneMode.Additive при вызове SceneManager.LoadSceneAsync или SceneManager.LoadScene.
- Вы можете загрузить одну и ту же сцену несколько раз как в Проигрывателе, так и в режиме воспроизведения в Редакторе. В режиме редактирования в Редакторе SceneManager не может быть использован, и сцена может быть загружена только один раз (используя EditorSceneManager).
- Чтобы выгрузить сцену явно, используйте SceneManager.UnloadSceneAsync. Все открытые сцены можно выгрузить косвенно, загрузив другую сцену с LoadSceneMode.Single.
Доступ к загруженным сценам
Менеджер Scene предлагает APIs для доступа к загруженным сценам. Например, SceneManager.loadedSceneCount, SceneManager.GetSceneAtи SceneManager.GetSceneByPath.
Scene манипуляции
Для перемещения объектов между сценами используйте методы SceneManager.MergeScenes и SceneManager.MoveGameObjectToScene.
SceneManager события
SceneManager также выводит следующие события:
Скрипты могут подписаться на эти события и получать уведомления об изменениях состояния SceneManager.
Список сцен
Проигрыватель содержит объект BuildSettings, который записывает список сцен, доступных для загрузки. Содержание этого списка показывается SceneManager.sceneCountInBuildSettings и SceneUtility.GetScenePathByBuildIndex.
Содержание этого списка определяется при создании проигрывателя:
- По умолчанию включены все включенные сцены в массиве EditorBuildSettings.scenes. Вы можете просмотреть и изменить этот список из активного профиля в окне Создание профилей.
- При построении с помощью скриптов с BuildPipeline.BuildPlayerукажите сцены с помощью BuildPlayerOptions.scenes.
Порядок сцен имеет решающее значение по нескольким причинам:
- Первая включенная сцена в списке Scene (с индексом сборки 0) загружается автоматически при запуске Проигрывателя.
- Ранее перечисленные Сцены загружаются быстрее благодаря оптимизированному назначению их зависимого содержимого меньшему количеству файлов sharedAsset.
- SceneManager.LoadSceneAsync и SceneManager.LoadScene поддерживает загрузку сцен по индексу, определяемому порядком в EditorBuildSettings.scenes или BuildPlayerOptions.scenes после удаления всех отключенных сцен.
AssetBundles и сцены
- Дополнительные сцены могут быть включены в AssetBundles. Когда загружается AssetBundle, содержащий сцены, его сцены становятся доступными для SceneManager и могут быть загружены по пути, используя SceneManager.LoadSceneAsync или SceneManager.LoadScene.
- Сцены из AssetBundles имеют Scene.buildIndex -1.
- При загрузке сцен по пути, соответствие из загруженного AssetBundle имеет приоритет над сценами в сборке Player.
Scene управление в Редакторе
- Используйте EditorSceneManager вместо SceneManager для создания сцен и манипуляций в Редакторе.
- SceneManager API должны использоваться только в режиме воспроизведения. В режиме редактирования вызовы неподдерживаемых методов, таких как SceneManager.LoadSceneAsync, будут вызывать недействительное исключение операции.
- В режиме воспроизведения, только сцены, перечисленные в EditorBuildSettings доступны для загрузки, вместе со сценами из загруженных AssetBundles, симулирующих поведение Игрока.
Примечания:
- Загрузка сцен по индексу может быть хрупкой из-за потенциального изменения порядка; рекомендуется загружать сцены по пути для большей ясности.
- Загрузка сцен по имени файла (без указания полного пути) может вызвать проблемы, если несколько сцен имеют одно и то же имя; указание полного пути устраняет эту двусмысленность.
Дополнительные ресурсы: ,EditorSceneManager,, ,SceneUtility,, ,Scene.buildIndex,, ,EditorBuildSettingsScene.enabled,, ,AssetBundle.GetAllScenePaths,.
using UnityEngine; using UnityEngine.SceneManagement;
// This MonoBehaviour could be placed as a component inside the first scene in the Build Profiles Scene List. // When the Player starts it instantiates this MonoBehaviour, which in turn loads // an additional scene. public class SceneLoader : MonoBehaviour { // This scene must be listed in the Scene List in the Build Profiles Window, // or available from a loaded AssetBundle. const string sceneToLoad = "Assets/Example/AnotherScene.unity";
void Start() { var op = SceneManager.LoadSceneAsync(sceneToLoad, LoadSceneMode.Additive); op.completed += (AsyncOperation obj) => { Scene loadedScene = SceneManager.GetSceneByPath(sceneToLoad); Debug.Log($"{sceneToLoad} finished loading (build index: {loadedScene.buildIndex})."); Debug.Log($"It has {loadedScene.rootCount} root(s)."); Debug.Log($"There are now {SceneManager.loadedSceneCount} Scenes open."); }; }
private void OnDestroy() { // When closing the Scene containing this MonoBehaviour we also remove the Scene we loaded SceneManager.UnloadSceneAsync(sceneToLoad); } }
using System.Text; using UnityEngine; using UnityEngine.SceneManagement;
public class SceneInfo : MonoBehaviour { void Start() { LogSceneManagerState(); }
void LogSceneManagerState() { var sb = new StringBuilder(); sb.AppendLine("SceneManager state");
sb.AppendLine($"Active Scene: {SceneManager.GetActiveScene().path}");
sb.AppendLine($"Scene List (size {SceneManager.sceneCountInBuildSettings})"); for(int i = 0; i < SceneManager.sceneCountInBuildSettings; i++) { var scenePath = SceneUtility.GetScenePathByBuildIndex(i); sb.AppendLine($" {i}: {scenePath}"); }
sb.AppendLine($"Loaded Scenes (size {SceneManager.sceneCount})"); for(int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); sb.AppendLine($" {i}: {scene.path}"); }
Debug.Log(sb.ToString()); } }
Статические свойства
| Свойство | Описание |
|---|---|
| loadedSceneCount | Количество загруженных сцен. |
| sceneCount | Текущее количество сцен. |
| sceneCountInBuildSettings | Количество сцен в настройках сборки. |
Статические методы
| Метод | Описание |
|---|---|
| CreateScene | Создать во время выполнения новый пустой Scene с указанным именем. |
| GetActiveScene | Получает текущий активный Scene. |
| GetSceneAt | Получает сцену с указанным индексом в списке сцен SceneManager. Это включает сцены, которые в данный момент загружаются или выгружаются. |
| GetSceneByBuildIndex | Получить структуру Scene по индексу в сборке. |
| GetSceneByName | Поиск в загруженных сценах Scene с заданным именем. |
| GetSceneByPath | Поиск во всех загруженных сценах Scene, имеющего указанный путь к ресурсу. |
| LoadScene | Загружает Scene по его имени или индексу в настройках сборки. |
| LoadSceneAsync | Загружает Scene асинхронно в фоновом режиме. |
| MergeScenes | Это объединит источник Scene в destinationScene. |
| MoveGameObjectsToScene | Переместить несколько GameObjects, представленных NativeArray, например IDs, из их текущего Scene в новый Scene. |
| MoveGameObjectToScene | Переместить GameObject из текущего Scene в новый Scene. |
| SetActiveScene | Настройте Scene на активный. |
| UnloadSceneAsync | Уничтожает все GameObjects, связанные с данным Scene и удаляет Scene из SceneManager. |
Мероприятия
| Мероприятие | Описание |
|---|---|
| activeSceneChanged | Подпишитесь на это событие, чтобы получать уведомления, когда активный Scene изменится. |
| sceneLoaded | Назначьте этому событию пользовательский обратный вызов, чтобы получать уведомления о загрузке Scene. |
| sceneUnloaded | Добавьте делегата к этому, чтобы получать уведомления, когда Scene разгрузился. |