EditorSceneManager
класс в UnityEditor.SceneManagement
Наследуется от:SceneManagement.SceneManager
Описание
Управление сценами в редакторе, когда он находится в режиме редактирования.
EditorSceneManager является системой управления сценами для режима редактирования в Редакторе. EditorSceneManager расширяет SceneManager и обеспечивает логику и поведение, характерные для Редактора, в дополнение к SceneManager API.
Используйте EditorSceneManager для управления тем, какие сцены отображаются в окне Hierarchy с помощью OpenScene, CloseScene, или, чтобы открыть несколько сцен одновременно, используйте RestoreSceneManagerSetup.
Примечание: В режиме воспроизведения используйте SceneManager API для загрузки и разгрузки сцен.
Терминология:
- SceneAsset — это импортированный объект для файлов ассетов сцены с расширением ‘.unity’. Он используется для создания ссылок на файлы сцены в скриптах Редактора. Обратите внимание, что SceneAsset используется только Редактором, так как пути или индекс сцены в Настройках Build используются для загрузки во время выполнения.
- Scene является экземпляром файла сцены, когда загружается с помощью SceneManager.LoadScene в режиме воспроизведения или открывается с помощью EditorSceneManager.OpenScene в режиме редактирования.
Когда файл сцены открывается EditorSceneManager.OpenScene, содержимое файла сцены загружается в память, и в процессе выполнения Scene структура-дескриптор. Эта структура Scene используется различными API редактора и времени выполнения.
Создание сцены
Вы можете использовать EditorSceneManager.NewScene для создания новой сцены. Когда вы создаете новую Scene, она отображается в Hierarchy как "Без названия". Эта сцена без названия еще не сохранена на диск. Вы можете иметь только одну сцену "Без названия" одновременно.
Сохранение сцены в SceneAsset
Это APIs, которые можно использовать для сохранения сцены в SceneAsset на диске в указанном пути, либо непосредственно из кода, либо из диалога Сохранить:
- EditorSceneManager.SaveScene
- EditorSceneManager.SaveScenes
- EditorSceneManager.SaveOpenScenes
- EditorSceneManager.SaveModifiedScenesIfUserWantsTo
Открытие и закрытие сцен
Используйте следующие команды для управления тем, какие сцены открываются в режиме редактирования и отображаются в окне Hierarchy:
- EditorSceneManager.OpenScene
- EditorSceneManager.CloseScene
- EditorSceneManager.RestoreSceneManagerSetup
Примечание: Редактор требует, чтобы хотя бы одна сцена была открыта и загружена. Если вы хотите закрыть все сцены, используйте NewSceneMode.Single с EditorSceneManager.NewScene API.
Доступ к загруженным сценам
EditorSceneManager предоставляет API для доступа к загруженным сценам через свой базовый класс. Например, SceneManager.loadedSceneCount, SceneManager.GetSceneAt, и SceneManager.GetSceneByPath.
Scene манипуляции
Используйте методы базового класса SceneManager, например SceneManager.MergeScenes и SceneManager.MoveGameObjectToScene, чтобы перемещать объекты между сценами.
EditorSceneManager события
EditorSceneManager предоставляет также множество событий, по которым можно отслеживать изменения сцен: создание новой сцены, открытие или закрытие сцены в редакторе. Скрипты могут подписаться на эти события и получать уведомления при изменении состояния сцены или EditorSceneManager. См. раздел «События».
Сцены инструментов редактора
EditorSceneManager также имеет следующие API для управления в памяти сценами инструментов только для Редактора. Они называются сценами предварительного просмотра и жизнь этих сцен должна поддерживаться вами. Вы можете использовать их для ваших собственных инструментов Редактора. Эти сцены не отображаются автоматически в окне Hierarchy.
Управление стартовой сценой в режиме воспроизведения
В любом сценарии Редактора можно установить EditorSceneManager.playModeStartScene, если вы хотите имитируемую пользовательскую стартовую сцену для режима воспроизведения вместо воспроизведения текущих открытых сцен из режима редактирования.
Образец кода ядра EditorSceneManager APIs
using UnityEngine; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine.UIElements; using UnityEditor.UIElements; using System.Collections.Generic;
public class EditorSceneManagerTestWindow : EditorWindow { private readonly string[] m_ScenePaths = { "Assets/Scene1.unity", "Assets/Scene2.unity", "Assets/Scene3.unity", "Assets/Scene4.unity" }; private ObjectField[] m_SceneFields;
[MenuItem("Examples/EditorSceneManager")] public static void ShowWindow() { var window = GetWindow<EditorSceneManagerTestWindow>(); window.titleContent = new GUIContent("EditorSceneManager APIs"); window.minSize = new Vector2(300, 400); }
public void CreateGUI() { var root = rootVisualElement; root.style.paddingLeft = root.style.paddingRight = root.style.paddingBottom = root.style.paddingTop = 10;
// Create buttons var createScenesButton = CreateButton("Create Test Scenes", 30, CreateScenes); var openSingleSceneButton = CreateButton("Open Single Scene", 10, OpenSingleScene); var restoreSceneManagerSetupButton = CreateButton("Restore SceneManager Setup", 10, RestoreSceneManagerSetup); var closeAllScenesButton = CreateButton("Close All Scenes", 10, CloseAllScenes);
// Add buttons to rootVisualElement root.Add(createScenesButton); root.Add(openSingleSceneButton); root.Add(restoreSceneManagerSetupButton); root.Add(closeAllScenesButton);
// Add title var titleLabel = new Label("Scene Asset References"); titleLabel.style.fontSize = 12; titleLabel.style.marginBottom = 10; titleLabel.style.marginTop = 30; titleLabel.style.unityFontStyleAndWeight = FontStyle.Bold; root.Add(titleLabel);
// Add a couple of object fields for picking SceneAssets const int kNumObjectFields = 5; m_SceneFields = new ObjectField[kNumObjectFields]; for(int i=0; i<m_SceneFields.Length; i++) { var sceneField = new ObjectField() { objectType = typeof(SceneAsset), allowSceneObjects = false }; root.Add(sceneField); m_SceneFields[i] = sceneField; } var openReferencedScenesButton = CreateButton("Open Referenced Scenes", 10, OpenReferencedScenes); root.Add(openReferencedScenesButton); }
private Button CreateButton(string text, float bottomMargin, System.Action clickEvent) { var button = new Button(clickEvent) { text = text }; button.style.marginBottom = bottomMargin; button.style.height = 30; return button; }
private void CreateScenes() { foreach (var scenePath in m_ScenePaths) { var scene = EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects, NewSceneMode.Single); EditorSceneManager.SaveScene(scene, scenePath); } }
private void RestoreSceneManagerSetup() { if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return;
var sceneSetups = new List<SceneSetup>(); for (int i = 0; i < m_ScenePaths.Length; i++) { var scenePath = m_ScenePaths[i]; var setup = new SceneSetup { path = scenePath, isLoaded = true, isActive = (i == 0) // First scene is active }; sceneSetups.Add(setup); }
EditorSceneManager.RestoreSceneManagerSetup(sceneSetups.ToArray()); }
private void OpenSingleScene() { if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return;
EditorSceneManager.OpenScene(m_ScenePaths[0], OpenSceneMode.Single); }
private void CloseAllScenes() { if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return;
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); }
private void OpenReferencedScenes() { // Check if we have valid scenes var sceneSetups = new List<SceneSetup>(); bool hasValidScenes = false;
for (int i = 0; i < m_SceneFields.Length; i++) { var sceneAsset = m_SceneFields[i].value as SceneAsset; if (sceneAsset != null) { hasValidScenes = true; var scenePath = AssetDatabase.GetAssetPath(sceneAsset); var sceneSetup = new SceneSetup { path = scenePath, isLoaded = true, isActive = (i == 0) // First scene is active }; sceneSetups.Add(sceneSetup); } }
if (!hasValidScenes) { EditorUtility.DisplayDialog("Error", "Please assign at least one scene.", "OK"); return; }
// Save current modified scenes if necessary if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) return;
// Restore the scene setup EditorSceneManager.RestoreSceneManagerSetup(sceneSetups.ToArray()); } }
Статические свойства
| Свойство | Описание |
|---|---|
| DefaultSceneCullingMask | Вместо этого используйте SceneCullingMasks.DefaultSceneCullingMask. |
| playModeStartScene | Загружает это SceneAsset при запуске режима игры. |
| preventCrossSceneReferences | Управляет разрешением перекрестных ссылок Scene в редакторе. |
| previewSceneCount | Текущее количество активных сцен предварительного просмотра. |
Статические методы
| Метод | Описание |
|---|---|
| CalculateAvailableSceneCullingMask | Пройдите через все Сцены и найдите наименьший неиспользуемый бит в объединении всех Scene маски отбора. |
| ClosePreviewScene | Закрывает предварительный просмотр Scene, созданный NewPreviewScene или OpenPreviewScene. |
| CloseScene | Закрыть Scene. Если флаг removeScene установлен на true, закрытый Scene также будет удален из EditorSceneManager. |
| DetectCrossSceneReferences | Обнаруживает перекрестные ссылки Scene в Scene. |
| EnsureUntitledSceneHasBeenSaved | Показывает диалог сохранения, если файл Без названия Scene существует в настоящее время Scene настройка менеджера. |
| GetSceneCullingMask | Возвращает маску удаления, установленную на заданной Scene. |
| GetSceneManagerSetup | Возвращает текущую настройку SceneManager. |
| IsPreviewScene | Проверяет, является ли сцена сценой предварительного просмотра. |
| IsPreviewSceneObject | Проверяет, является ли объект частью сцены предварительного просмотра. |
| LoadSceneAsyncInPlayMode | Этот метод позволяет загрузить Scene во время playmode в редакторе, без необходимости включения Scene в список Build Settings Scene. |
| LoadSceneInPlayMode | Этот метод позволяет загрузить Scene во время playmode в редакторе, без необходимости включения Scene в список Build Settings Scene. |
| MarkAllScenesDirty | Пометить все загруженные сцены как измененные. |
| MarkSceneDirty | Пометить указанный Scene как измененный. |
| MoveSceneAfter | Позволяет изменить порядок сцен, открытых в окне Hierarchy. Перемещает источник Scene так, чтобы он находился после назначения Scene. |
| MoveSceneBefore | Позволяет изменить порядок сцен, открытых в окне Hierarchy. Перемещает источник Scene так, чтобы он стоял перед назначением Scene. |
| NewPreviewScene | Создает новую сцену предварительного просмотра. |
| NewScene | Создайте новый Scene. |
| OpenPreviewScene | Открывает ресурс Scene в предварительном просмотре Scene. |
| OpenScene | Откройте Scene в редакторе. |
| RestoreSceneManagerSetup | Восстановите настройки SceneManager. |
| SaveCurrentModifiedScenesIfUserWantsTo | Задаёт вопрос пользователю, желает ли он сохранить текущий открытый измененный Scene или Сцены в Hierarchy. |
| SaveModifiedScenesIfUserWantsTo | Задаёт вопрос, следует ли сохранять модифицированные входные сцены. |
| SaveOpenScenes | Сохранить все открытые сцены. |
| SaveScene | Сохранить Scene. |
| SaveScenes | Сохранить список сцен. |
| SetSceneCullingMask | Установите маску удаления для этой сцены на это значение. Камера будет рендировать только объекты в сценах, которые имеют одинаковые биты, установленные в их маске удаления. |
Мероприятия
| Мероприятие | Описание |
|---|---|
| activeSceneChangedInEditMode | Подпишитесь на это событие, чтобы получать уведомления, когда активный Scene изменяется в режиме редактирования в Редакторе. |
| newSceneCreated | Это событие вызывается после создания нового Scene. |
| sceneClosed | Это событие вызывается после того, как Scene был закрыт в редакторе. |
| sceneClosing | Это событие вызывается перед закрытием открытого Scene после того, как вы запросили закрытие Scene. |
| sceneDirtied | Это событие вызывается после того, как Scene был изменён в редакторе. |
| sceneManagerSetupRestored | Это может быть полезно для уведомления, когда сцены SceneManager заменены набором новых сцен из вызовов RestoreSceneManagerSetup.Use аргумента scenes для проверки, какие сцены только что были добавлены в opened.Additional ресурсы: SceneManagerSetupRestoredCallback. |
| sceneOpened | Это событие вызывается после того, как Scene был открыт в редакторе. |
| sceneOpening | Это событие вызывается перед открытием существующего Scene. |
| sceneSaved | Это событие вызывается после сохранения Scene. |
| sceneSaving | Это событие вызывается перед сохранением диска Scene после того, как вы запросили сохранение диска Scene. |
Делегаты
| делегат | Описание |
|---|---|
| NewSceneCreatedCallback | Обратные вызова этого типа, которые были добавлены к событию newSceneCreated, вызываются после создания нового события Scene. |
| SceneClosedCallback | Обратные вызова этого типа, которые были добавлены к событию sceneClosed, вызываются сразу же после закрытия события Scene. |
| SceneClosingCallback | Обратные вызова этого типа, которые были добавлены к событию sceneClosing, вызываются непосредственно перед закрытием Scene. |
| SceneDirtiedCallback | Обратные вызова этого типа, которые были добавлены к событию sceneDirtied, вызываются после того, как Scene изменяется из неизмененного в изменённое. |
| SceneManagerSetupRestoredCallback | Обратные вызова этого типа, которые были добавлены к событию sceneManagerSetupRestored, вызываются после того, как был вызван RestoreSceneManagerSetup. |
| SceneOpenedCallback | Обратные вызова этого типа, которые были добавлены к событию sceneOpened, вызываются после открытия события Scene. |
| SceneOpeningCallback | Обратные вызова этого типа, которые были добавлены к событию sceneOpening, вызываются непосредственно перед открытием Scene. |
| SceneSavedCallback | Обратные вызова этого типа, которые были добавлены к событию sceneSaved, вызываются после сохранения события Scene. |
| SceneSavingCallback | Обратные вызова этого типа, которые были добавлены к событию sceneSaving, вызываются непосредственно перед сохранением события Scene. |
Унаследованные члены 3
Статические свойства
| Свойство | Описание |
|---|---|
| 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 разгрузился. |