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

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 на диске в указанном пути, либо непосредственно из кода, либо из диалога Сохранить:

Открытие и закрытие сцен

Используйте следующие команды для управления тем, какие сцены открываются в режиме редактирования и отображаются в окне Hierarchy:

Примечание: Редактор требует, чтобы хотя бы одна сцена была открыта и загружена. Если вы хотите закрыть все сцены, используйте 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 разгрузился.