Version: 2017.1
UI Profiler
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 agregará el asset scene seleccioado a las escenas actuales mostradas en la jerarquía
Open Scene Additive agregará el asset scene seleccioado a las escenas actuales mostradas en la jerarquía

Cuando tiene varias escenas abiertas en el editor, el contenido de cada escena se muestra por separado en la ventana de jerarquía. El contenido de cada escena aparece debajo de una barra de división de escenas que muestra el nombre de la escena y su estado de guardado.

La ventana Hierarchy mostrando varias escenas abiertas simultaneamente
La ventana Hierarchy mostrando varias escenas abiertas simultaneamente

Mientras están presentes en la jerarquía, las escenas pueden ser loaded o unloaded para revelar u ocultar los gameobjects contenidos en cada escena. Esto es diferente a agregar y quitar de la ventana de jerarquía.

Los divisores de escena pueden colapsarse en la jerarquía con el contenido de la escena, lo que puede ayudarle a navegar por su jerarquía si tiene muchas escenas cargadas.

Cuando se trabaje en varias escenas, cada escena que se modifique necesitará guardar sus cambios, por lo que es posible tener abiertas varias escenas no guardadas al mismo tiempo. Las escenas con cambios no guardados mostrarán un asterisco junto al nombre en la barra de división de escena.

Un asterisco en el divisor de escena que indica que esta escena tiene cambios no guardados
Un asterisco en el divisor de escena que indica que esta escena tiene cambios no guardados

Cada escena se puede guardar por separado a través del menú contextual de la barra divisora. Si selecciona “Guardar escena” en el menú de archivos o presiona Ctrl/Cmd + S guardará los cambios en todas las escenas abiertas.

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

El menú del divisor de escenas para escenas cargadas:

Set Active Scene This allows you to specify which scene new Game Objects are created/instantiated in. There must always be one scene marked as the active scene
Save Scene Saves the changes to the selected scene only.
Save Scene As Saves the selected scene (along with any current modifications) as a new Scene asset.
Save All Saves changes to all scenes.
Unload Scene Unloads the scene, but keeps the scene in the Hierarchy window.
Remove Scene Unloads and removes the scene from the Hierarchy window.
Select Scene Asset Selects the scene’s asset in the Project window.
GameObject Provides a sub-menu allowing you to create GameObjects in the selected scene. The menu mirrors the creatable items available in Unity’s main GameObject menu. (shown below)
El sub-menu GameObject en el menú de barra divisor de la escena
El sub-menu GameObject en el menú de barra divisor de la escena

El menú del divisor de escenas para escenas no cargadas:

Load Scene Loads the scene’s contents
Remove Scene Remove the scene from the Hierarchy window.
Select Scene Asset Selects the scene’s asset in the Project window.

Baking Lightmaps con Varias Escenas

Para bake Lightmap data para varias escenas a la vez, abra las escenas que desee cocinar, desactive el modo “Auto” en la Ventana de Lighting y haga clic en el botón Build para crear la iluminación.

La entrada a los cálculos de iluminación es la geometría estática y las luces de todas las escenas. Por lo tanto, las sombras y los rebotes de luz GI funcionarán en todas las escenas. Sin embargo, los lightmaps y los datos GI en tiempo real se separan en datos cargados / descargados por separado para cada escena. Los lightmaps y los atlas de datos GI en tiempo real se dividen entre escenas. Esto significa que los lightmaps entre las escenas nunca se comparten y pueden descargarse de forma segura cuando se descarga una escena. Los datos de Lightprobes siempre están compartidos y todos los lightprobes para todas las escenas que están baked se cargan al mismo tiempo.

Alternativamente, puede automatizar la creación de lightmaps para varias escenas utilizando la función Lightmapping.BakeMultipleScenes en un script del editor.

Baking datos Navmesh con Varias Escenas

Para crear Navmesh data para varias escenas a la vez, debe abrir las escenas que desea bake y hacer clic en el botón Bake de la ventana de navegación. Los datos navmesh se convertirán en un solo recurso, compartido por todas las escenas cargadas. Los datos se guardan en la carpeta que coincide con el nombre de la escena activa actual (por ejemplo, ActiveSceneName/NavMesh.asset). Todas las escenas cargadas compartirán este activo navmesh. Después de bake el navmesh, las escenas afectadas deben guardarse para que la referencia de escena a navmesh sea persistente.

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

Playmode

En Playmode, con varias escenas en la Hierarchy (jerarquía), una escena adicional se mostrará llamada DontDestroyOnLoad.

Antes de Unity 5.3, todos los objetos que instanciarían en Playmode marcados como “DontDestroyOnLoad” seguirían apareciendo en la jerarquía. Estos objetos no se consideran parte de ninguna escena, pero para que Unity siga mostrando los objetos y para que los inspeccionen, estos objetos se muestran ahora como parte de la escena especial DontDestroyOnLoad.

No tiene acceso a la escena DontDestroyOnLoad y no está disponible en tiempo de ejecución.

Configuraciones especificas de la escena

Una cantidad de ajustes son específicos a cada escena. Estos son:

  • RenderSettings y LightmapSettings (ambos encontrados en la ventana de Lighting)
  • NavMesh settings
  • Scene settings en la ventana de Occlusion Culling.

La forma en que funciona es que cada escena maneja su propia configuración y sólo los ajustes asociados con esa escena se guardarán en el archivo de escena.

Si tiene varias escenas abiertas, los ajustes que se utilizan para renderizar y el navmesh son los de la escena activa. Esto significa que si desea cambiar los ajustes de una escena, debe abrir una sola escena y cambiar la configuración, o hacer que la escena en cuestión sea la escena activa y cambiar los ajustes.

Cuando cambie la escena activa en el editor o en tiempo de ejecución, se aplicarán todos los ajustes de la nueva escena y se reemplazarán todos los ajustes anteriores.

Scripting

Editor Scripting

Para edición de scripting nosotros proporcionamos una struct Scene y EditorSceneManager API y una clase de utilidad SceneSetup.

El struct Scene está disponible tanto en el editor como en tiempo de ejecución y contiene un conjunto de propiedades de sólo lectura relacionadas con la propia escena, como su nombre y ruta de acceso.

La clase EditorSceneManager class sólo está disponible en el editor. Se deriva de SceneManager y tiene una serie de funciones que le permiten implementar todas las funciones de edición de escenas múltiples descritas anteriormente a través del scripting del editor.

La clase SceneSetup es una pequeña clase de utilidad para almacenar información acerca de una escena actualmente en la jerarquía.

Las clases Undo y PrefabUtility se han extendido para soportar varias escenas. Ahora puede instanciar un prefab en una escena dada usanndo [PrefabUtility.InstantiatePrefab], y usted puede mover objetos a la raíz de una escena de una manera no-factible utilizando (Undo.MoveGameObjectToScene)[ScriptRef:Undo.MoveGameObjectToScene]

NOTA: Para utilizar Undo.MoveGameObjectToScene, usted debe asegurarse que el GameObject está disponible en la raíz de la escena en la que actualmente está.

Runtime Scripting (Scripting en tiempo real)

Para scripting en Runtime, las funciones que funcionan con varias escenas como LoadScene y UnloadScene se encuentra en la clase SceneManager.

Notas

En el menú File Save Scene As sólo se guardará la escena activa. Save Scene guardará todas las escenas modificadas, incluso pidiéndole que nombre la escena Sin título si existe.

Creación de un nuevo asset de Scene desde el menú Create de la ventana Project
Creación de un nuevo asset de Scene desde el menú Create de la ventana Project

Consejos y Trucos

Es posible agregar una escena a la jerarquía mientras mantiene su estado unloaded manteniendo Alt oprimido mientras arrastra. Esto le da la opción de cargar la escena más tarde, cuando lo desee.

Se pueden crear nuevas escenas con el menú Create en la ventana del proyecto. Las nuevas escenas contendrán la configuración predeterminada de Game Objects.

Para evitar tener que configurar su jerarquía cada vez que reinicie Unity o para que sea fácil de almacenar configuraciones diferentes, puede utilizar EditorSceneManager.GetSceneManagerSetup para obtener una lista de objetos SceneSetup que describe la configuración actual. A continuación, puede serializar estos en un ScriptableObject o cualquier otra cosa junto con cualquier otra información que desee almacenar acerca de su configuración de escena. Para restaurar la jerarquía simplemente vuelva a crear la lista de SceneSetups y utilice EditorSceneManager.RestoreSceneManagerSetup.

En tiempo de ejecución para obtener la lista de escenas cargadas simplemente obtenga sceneCount e itere sobre las escenas utilizando GetSceneAt.

Puedes obtener la escena a la que pertenece un GameObject a través de GameObject.scene y puedes mover un GameObject a la raíz de una escena utilizando SceneManager.MoveGameObjectToScene.

Se recomienda evitar el uso de DontDestroyOnLoad para persistir el administrador de GameObjects que desea que sobreviva a través de las cargas de escena. En su lugar, cree una manager scene que tenga todos sus administradores y utilice SceneManager.LoadScene(<path>, LoadSceneMode.Additive) y SceneManager.UnloadScene para administrar el progreso del juego.

Problemas conocidos:

  • Cross-Scene references are not supported, and are prevented in Edit mode. In Play mode they are allowed, because Scenes cannot be saved.
  • Occlusion culling data from Umbra cannot be loaded additively.
UI Profiler
Cargando recursos en tiempo de ejecución