Qué es una escena#
Una escena es un contenedor de GameObjects: un nivel, un menú, una pantalla de carga. Tu juego se divide en escenas que cargas y descargas según haga falta. El menú principal es una escena, cada nivel es otra.
Cambiar de escena#
using UnityEngine;
using UnityEngine.SceneManagement;
public class Navegacion : MonoBehaviour
{
public void IrANivel1()
{
SceneManager.LoadScene("Nivel1"); // por nombre
}
public void Reiniciar()
{
// Recargar la escena actual
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
public void Siguiente()
{
int actual = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(actual + 1); // por índice de build
}
}Para que LoadScene("Nivel1") funcione, la escena debe estar en la lista de File → Build Profiles → Scene List (en Unity 6; antes se llamaba "Build Settings"). Si no está, obtendrás el error "Scene 'Nivel1' couldn't be loaded because it has not been added to the build settings".
Carga síncrona vs asíncrona#
LoadScene congela el juego mientras carga: para escenas grandes se nota un parón. LoadSceneAsync carga en segundo plano y te deja mostrar una barra de progreso.
LoadScene | LoadSceneAsync | |
|---|---|---|
| Bloquea el juego | Sí | No |
| Barra de progreso | No | Sí |
| Ideal para | Escenas pequeñas, menús | Niveles grandes, pantallas de carga |
using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Cargador : MonoBehaviour
{
public IEnumerator CargarNivel(string nombre)
{
AsyncOperation op = SceneManager.LoadSceneAsync(nombre);
while (!op.isDone)
{
float progreso = Mathf.Clamp01(op.progress / 0.9f); // 0 a 1
Debug.Log("Cargando: " + (progreso * 100f) + "%");
yield return null;
}
}
}op.progress llega solo hasta 0.9 durante la carga; el último 10% es la activación de la escena. Por eso se divide entre 0.9f para obtener un 0–100% real en la barra.
Escenas aditivas#
Puedes cargar una escena encima de otra sin descargar la actual, con LoadSceneMode.Additive. Sirve para mundos grandes por trozos, o para tener el HUD/gestores en una escena separada siempre presente.
SceneManager.LoadScene("HUD", LoadSceneMode.Additive);
SceneManager.UnloadSceneAsync("Zona1"); // descargar una zonaSobrevivir al cambio de escena#
Al cargar una escena nueva, se destruyen los objetos de la anterior. Si un gestor (audio, partida) debe persistir, usa DontDestroyOnLoad:
void Awake()
{
DontDestroyOnLoad(gameObject);
}Si el objeto con DontDestroyOnLoad está en una escena que se vuelve a cargar, aparecerá otro (y otro más). Combínalo con el patrón Singleton para asegurarte de que solo existe uno.
Errores frecuentes#
- Cargar por nombre una escena que no está en los Build Profiles.
- Usar
LoadScene(bloqueante) para niveles grandes y provocar un parón. - Esperar que
DontDestroyOnLoadevite duplicados por sí solo. - Olvidar que al cambiar de escena se pierden las referencias a objetos de la anterior.
Resumen#
Las escenas dividen tu juego en niveles y pantallas. Cambia entre ellas con SceneManager.LoadScene (o LoadSceneAsync con barra de progreso para las grandes), cárgalas de forma aditiva cuando necesites varias a la vez, y usa DontDestroyOnLoad + Singleton para los gestores que deben persistir. Recuerda añadir cada escena a los Build Profiles.