Приветствую всех друзья! В прошлой статье я рассказал о методах ввода в редакторе Unity, и специальных именах папок, используемых для различных целей в Unity. Сегодня речь пойдет о множественном редактировании сцен в окне Hierarchy View.
Редактирование нескольких сцен позволяет одновременно открывать в редакторе несколько сцен и упрощает управление ими во время выполнения.
Возможность открытия нескольких сцен в редакторе позволяет создавать большие потоковые миры и улучшает рабочий процесс при совместной работе над редактированием сцен.
Чтобы открыть новую сцену и добавить ее в текущий список сцен в окне иерархии (Hierarchy view), либо выберите пункт «Open Scene Additive» в контекстном меню для ассета сцены, либо перетащите одну или несколько сцен из окна проекта (Project view) в окно иерархии (Hierarchy view).
Если в редакторе открыто несколько сцен, содержимое каждой сцены отображается отдельно в окне иерархии. Содержимое каждой сцены отображается под разделительной полосой сцены, которая показывает имя сцены и ее состояние сохранения.
Находясь в иерархии, сцены могут быть загружены или выгружены, чтобы показать или скрыть игровые объекты, содержащиеся в каждой сцене. Это отличается от добавления и удаления их из окна иерархии.
Разделители сцен могут быть свернуты в иерархии в соответствии с содержимым сцены, что может помочь вам ориентироваться в иерархии, если у вас загружено много сцен.
При работе с несколькими сценами каждая измененная сцена будет нуждаться в сохранении своих изменений, поэтому возможно одновременное открытие нескольких несохраненных сцен. Сцены с несохраненными изменениями будут иметь звездочку, показанную рядом с именем в строке разделителя сцен.
Каждая сцена может быть сохранена отдельно через контекстное меню в разделительной строке. Выбрав пункт "Save scene" в меню файл или нажав Ctrl/Cmd + S, вы сохраните изменения во всех открытых сценах.
Контекстное меню в разделительных полосах сцены позволяет выполнять другие действия на выбранной сцене.
- Set Active Scene – Это позволяет вам указать, в какой сцене создаются новые игровые объекты. Всегда должна быть одна сцена, отмеченная как активная сцена.
- Save Scene – Сохраняет изменения только в выбранной сцене.
- Save Scene As – Сохраняет выбранную сцену (вместе с любыми текущими изменениями) в качестве нового ассета сцены.
- Save All – Сохраняет изменения во всех сценах.
- Unload Scene – Выгружает сцену, но сохраняет ее в окне иерархии.
- Remove Scene – Выгружает и удаляет сцену из окна иерархии.
- Select Scene Asset – Выбор ассета сцены в окне проекта.
- GameObject – Предоставляет подменю, позволяющее создавать игровые объекты в выбранной сцене. Меню отражает создаваемые элементы, доступные в главном меню GameObject Unity.
- Load Scene – Загружает содержимое сцены.
- Remove Scene – Удаляет сцену из окна иерархии.
- Select Scene Asset – Выбор ассета сцены в окне проекта.
Запекание карт света в нескольких сценах.
Чтобы запечь данные Lightmap для нескольких сцен одновременно, вы должны открыть сцены, которые хотите запечь, отключить режим “авто” в окне освещения (Lighting Window) и нажать кнопку Build, чтобы построить освещение.
Входные данные для расчетов освещения - это статическая геометрия и свет от всех сцен. Поэтому тени и отскоки света GI будут работать во всех сценах. Однако световые карты и данные GI в реальном времени разделяются на данные, которые загружаются / выгружаются отдельно для каждой сцены. Световые карты и атласы данных GI в реальном времени разделены между сценами. Это означает, что световые карты между сценами никогда не используются совместно, и их можно безопасно выгружать при выгрузке сцены. Данные световых зондов (Lightprobe) в настоящее время всегда совместно используются, и все световые зонды для всех сцен, запеченные вместе, загружаются одновременно.
Кроме того, вы можете автоматизировать создание световых карт для нескольких сцен с помощью Lightmapping.BakeMultipleScenes в скрипте редактора.
Запекание данных NavMesh в нескольких сценах.
Чтобы создать данные Navmesh для нескольких сцен одновременно, вы должны открыть сцены, которые хотите запечь, и нажать кнопку Bake в окне навигации (Navigation Window). Данные Navmesh будут запечены в единый ассет, общий для всех загруженных сцен. Данные сохраняются в папку, соответствующую имени текущей активной сцены (например, ActiveSceneName/NavMesh.asset). Все загруженные сцены будут совместно использовать этот ассет Navmesh. После запекания Navmesh затронутые сцены должны быть сохранены, чтобы сделать ссылку сцены на запеченные данные Navmesh постоянной.
Кроме того, вы можете автоматизировать построение данных Navmesh для нескольких сцен с помощью NavMeshBuilder.BuildNavMeshForMultipleScenes в скрипте редактора.
Запекание данных Occlusion Culling в нескольких сценах.
Чтобы запечь данные Occlusion Culling для нескольких сцен одновременно, откройте сцены, которые вы хотите запечь, откройте окно Occlusion Culling (меню: Window/Rendering/Occlusion Culling) и нажмите кнопку Bake. Данные окклюзии сохраняются в ассете, называемом OcclusionCullingData.asset в папке, соответствующей имени текущей активной сцены. Например, Assets/ActiveSceneName/OcclusionCullingData.asset. Ссылка на данные добавляется в каждую открытую сцену. После запекания Occlusion Culling сохраните затронутые сцены, чтобы сделать ссылку сцены на запеченные данные Occlusion Culling постоянной.
Всякий раз, когда сцена загружается аддитивно, если она имеет ту же ссылку на данные окклюзии, что и активная сцена, статические визуализаторы и порталы, отбирающие информацию для этой сцены, инициализируются из данных окклюзии. В дальнейшем система Occlusion Culling работает так, как если бы все статические визуализаторы и порталы были запечены в одной сцене.
Play Mode.
В режиме воспроизведения с несколькими сценами в иерархии появится дополнительная сцена под названием DontDestroyOnLoad.
До Unity 5.3 любые объекты, которые вы создадите в Playmode с пометкой "DontDestroyOnLoad", все равно будут отображаться в иерархии. Эти объекты не считаются частью какой-либо сцены, но для Unity, чтобы все еще показывать объекты, и для вас, чтобы проверить их, эти объекты теперь отображаются как часть специальной сцены DontDestroyOnLoad.
У вас нет доступа к сцене DontDestroyOnLoad, и она недоступна во время выполнения.
Настройки для конкретных сцен.
Для каждой сцены существует определенное количество настроек. Это:
- RenderSettings и LightmapSettings (оба находятся в окне освещения).
- Настройки NavMesh.
- Настройки сцены в окне Occlusion Culling.
Это работает так, что каждая сцена будет управлять своими собственными настройками, и только настройки, связанные с этой сценой, будут сохранены в файле сцены.
Если у вас открыто несколько сцен, то настройки, используемые в RenderSettings и Navmesh, являются настройками из активной сцены. Это означает, что, если вы хотите изменить настройки сцены, вы должны либо открыть только одну сцену и изменить настройки, либо сделать рассматриваемую сцену активной и изменить настройки.
При переключении активной сцены в редакторе или во время выполнения все настройки из новой сцены будут применены и заменят все предыдущие настройки.
Примечания.
В меню Save Scene As будет сохранена только активная сцена. Save Scene сохранит все измененные сцены, включая запрос на присвоение имени безымянной сцене, если она существует.
Советы и рекомендации.
Можно добавить сцену в иерархию, сохраняя ее в состояние unloaded, удерживая Alt при перетаскивании. Это дает вам возможность загрузить сцену позже, когда это необходимо.
Новые сцены можно создать с помощью меню создать (Create menu) в окне проекта. Новые сцены будут содержать настройки игровых объектов по умолчанию.
Чтобы избежать необходимости настраивать иерархии каждый раз, когда вы перезагрузите Unity, вы можете использовать EditorSceneManager.GetSceneManagerSetup, чтобы получить список объектов SceneSetup, который описывает текущую настройку. Затем вы можете сериализовать их в ScriptableObject или что-то еще вместе с любой другой информацией, которую вы, возможно, захотите сохранить о своей настройке сцены. Чтобы восстановить иерархию, просто воссоздайте список SceneSetups и используйте EditorSceneManager.RestoreSceneManagerSetup.
Во время выполнения, чтобы получить список загруженных сцен, просто получите sceneCount и повторите сцены с помощью GetSceneAt.
Вы можете получить сцену, к которой принадлежит GameObject, через GameObject.scene и вы можете переместить GameObject в корень сцены с помощью SceneManager.MoveGameObjectToScene.
Рекомендуется избегать использования DontDestroyOnLoad для сохранения игровых объектов менеджеров, которые вы хотите сохранить при различных загрузках сцены. Вместо этого создайте сцену, в которой есть все ваши менеджеры, и используйте SceneManager.LoadScene(<path>, LoadSceneMode.Additive) и SceneManager.UnloadScene для управления вашим игровым прогрессом.
На сегодня это все. Следующая статья будет посвящена решению типичных проблем, которые могут возникнуть при работе с редактором. Спасибо всем, кто дочитал эту статью до конца, подписывайтесь на канал, ставьте лайки, а для тех, у кого появились вопросы - спрашивайте в комментариях! А если вы хотите помочь данному каналу в развитии – делитесь этой статьей с друзьями в социальных сетях!