Área GPU (GPU Area)
Cargando recursos en tiempo de ejecución

Multi Scene Editing (Edición de varias escenas)

El Multi Scene Editing le permite a usted tener múltiples escenas abiertas en el editor simultáneamente, y hace que sea más fácil el manejo de escenas en tiempo de ejecución.

La habilidad de tener múltiples escenas abiertas en el editor le permite a usted crear grandes mundos de streaming y mejora el flujo de trabajo cuando se colabora en la edición de escenas.

Esta página describe:

  • La integración multi scene editing en el Editor
  • El scripting del Editor y los APIs del scripting en tiempo de ejecución
  • Problemas actualmente conocidos

En el Editor

Para abrir una nueva escena y agregarla a la lista actual de escenas en la jerarquía, puede seleccionar Open Scene Additive en el menú de contexto para un asset de escena, o arrastre una o más escenas desde la ventana del Proyecto a la ventana de Jerarquía.

Open Scene Additive will add the selected scene asset to the current scenes shown in the hierarchy
Open Scene Additive will add the selected scene asset to the current scenes shown in the hierarchy

When you have multiple scenes open in the editor, each scene’s contents are displayed separately in the hierarchy window. Each scene’s contents appears below a scene divider bar which shows the scene’s name and its save state.

The Hierarchy window showing multiple scenes open simultaneously
The Hierarchy window showing multiple scenes open simultaneously

While present in the hierarchy, scenes can be loaded or unloaded to reveal or hide the gameobjects contained within each scene. This is different to adding and removing them from the hierarchy window.

The scene dividers can be collapsed in the hierarchy to the scene’s contents which may help you to navigate your hierarchy if you have lots of scenes loaded.

When working on multiple scenes, each scene that is modified will need its changes saved, so it is possible to have multiple unsaved scenes open at the same time. Scenes with unsaved changes will have an asterisk shown next to the name in the scene divider bar.

An asterisk in the scene divider indicating this scene has unsaved changes
An asterisk in the scene divider indicating this scene has unsaved changes

Each Scene can be saved separately via the context menu in the divider bar. Selecting “Save Scene” from the file menu or pressing Ctrl/Cmd + S will save changes to all open scenes.

El menú de contexto en el las barras divisoras de la escena le permiten a usted realizar otras acciones en la escena seleccionada.

The Scene Divider Menu For Loaded Scenes:

Set Active Scene Esto le permite a usted especificar en qué escena nuevos Game Objects son creados/instanciados. Siempre tiene que haber una escena marcada como la escena activa
Save Scene Guarda los cambios de la escena seleccionada solamente.
Save Scene As Guarda la escena seleccionada (junto con otras modificaciones actuales) como un nuevo asset de Escena.
Save All Guarda cambios a todas las escenas.
Unload Scene Descarga la escena, pero mantiene la escena en la ventana de Jerarquía.
Remove Scene Descarga y quita la escena de la ventana de jerarquía.
Select Scene Asset Selecciona el asset de escena en la ventana del Proyecto.
GameObject Proporciona un sub-menú permitiéndole crear GameObjects en la escena seleccionada. El menú refleja los items disponibles para crear en el menú GameObject principal de Unity. (Mostrado abajo)
The GameObject sub-menu in the Scene divider bar menu
The GameObject sub-menu in the Scene divider bar menu

The Scene Divider Menu For Unloaded Scenes:

Load Scene Carga el contenido de la escena
Remove Scene Quita la escena de la ventana de Jerarquía.
Select Scene Asset Selecciona el asset de escena en la ventana del Proyecto.

Baking Lightmaps with Multiple Scenes

To bake Lightmap data for multiple scenes at once, you should open the scenes that you want to bake, turn off “Auto” mode in the Lighting Window, and click the Build button to build the lighting.

The input to the lighting calculations is the static geometry and lights from all scenes. Therefore shadows and GI light bounces will work across all scenes. However, the lightmaps and realtime GI data are separated out into data that is loaded / unloaded separately for each scene. The lightmaps and realtime GI data atlases are split between scenes. This means lightmaps between scenes are never shared and they can be unloaded safely when unloading a scene. Lightprobe data is currently always shared and all lightprobes for all scenes baked together are loaded at the same time.

Alternatively, you can automate building lightmaps for multiple scenes by using the Lightmapping.BakeMultipleScenes function in an editor script.

Baking Navmesh data with Multiple Scenes

To make Navmesh data for multiple scenes at once, you should open the scenes that you want to bake, and click the Bake button in the Navigation Window. The navmesh data will be baked into a single asset, shared by all loaded scenes. The data is saved into the folder matching the name of the current active scene (e.g. ActiveSceneName/NavMesh.asset). All loaded scenes will share this navmesh asset. After baking the navmesh, the scenes affected should be saved to make the scene-to-navmesh reference persistent.

Alternatively, you can automate building navmesh data for multiple scenes by using the NavMeshBuilder.BuildNavMeshForMultipleScenes function in an editor script.

Playmode

In Playmode, whith multiple scenes in the Hierarchy, an additional scene will show up called DontDestroyOnLoad.

Prior to Unity 5.3, any objects you would instantiate in Playmode marked as “DontDestroyOnLoad” would still show up in the hierarchy. These objects are not considered part of any scene but for Unity to still show the objects, and for you to inspect them, these objects are now shown as part of the special DontDestroyOnLoad scene.

You do not have access to the DontDestroyOnLoad scene and it is not available at runtime.

Scene-specific settings

A number of settings are specific to each scene. These are:

  • RenderSettings and LightmapSettings (both found in the Lighting Window)
  • NavMesh settings
  • Scene settings in the Occlusion Culling Window.

The way it works is that each scene will manage its own settings and only settings associated with that scene will be saved to the scene file.

If you have multiple scenes open, the settings that are used for rendering and navmesh are the ones from the active scene. This means that if you want to change the settings of a scene, you must either open only one scene and change the settings, or make the scene in question the active scene and change the settings.

When you switch active scene in the editor or at runtime, all the settings from the new scene will be applied and replace all previous settings.

Scripting

Editor Scripting

For editor scripting we provide a Scene struct and EditorSceneManager API and a SceneSetup utility class.

The Scene struct is available both in the editor and at runtime and contains a handful of read-only properties relating to the scene itself, such as its name and asset path.

The EditorSceneManager class is only available in the editor. It is derived from SceneManager and has a number of functions that allow you to implement all the Multi Scene Editing features described above via editor scripting.

The SceneSetup class is a small utility class for storing information about a scene currently in the hierarchy.

The Undo and PrefabUtility classes have been extended to support multiple scenes. You can now instantiate a prefab in a given scene using [PrefabUtility.InstantiatePrefab], and you can move objects to the root of a scene in an un-doable manner using (Undo.MoveGameObjectToScene)[ScriptRef:Undo.MoveGameObjectToScene]

NOTE: To use Undo.MoveGameObjectToScene, you must make sure the GameObject is already at the root of the scene it is currently in.

Runtime Scripting

For scripting at Runtime, the functions to work with multiple scenes such as LoadScene and UnloadScene are found on the SceneManager class.

Notes

In the File menu Save Scene As will only save the active scene. Save Scene will save all modified scenes, including prompting you to name the Untitled scene if it exists.

Creating a new Scene asset from the Project windows Create menu
Creating a new Scene asset from the Project window’s Create menu

Tips and Tricks

It is possible to add a scene to the hierarchy while keeping it its unloaded state by holding Alt while dragging. This gives you the option to load the scene later, when desired.

New scenes can be created using the Create menu in the project window. New scenes will contain the default setup of Game Objects.

To avoid having to set up your hierarchy every time you restart unity or to make it easy to store different setups you can use EditorSceneManager.GetSceneManagerSetup to get a list of SceneSetup objects which describes the current setup. You can then serialize these into a ScriptableObject or something else along with any other information you might want to store about your scene setup. To restore the hierarchy simply recreate the list of SceneSetups and use EditorSceneManager.RestoreSceneManagerSetup.

At runtime to get the list of loaded scenes simply get sceneCount and iterate over the scenes using GetSceneAt.

You can get the scene a GameObject belongs to through GameObject.scene and you can move a GameObject to the root of a scene using SceneManager.MoveGameObjectToScene.

It is recommended to avoid using DontDestroyOnLoad to persist manager GameObjects that you want to survive across scene loads. Instead, create a manager scene that has all your managers and use SceneManager.LoadScene(<path>, LoadSceneMode.Additive) and SceneManager.UnloadScene to manage your game progress.

Problemas conocidos:

  • Cross-scene references are not supported but also not prevented.
  • Occlusion culling data from Umbra can still not be loaded additively.
Área GPU (GPU Area)
Cargando recursos en tiempo de ejecución