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

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 разгрузился.