🎮 UnityDocs

Escenas y SceneManager

Qué es una escena, cómo cambiar de nivel con SceneManager, la diferencia entre carga síncrona y asíncrona, las escenas aditivas y por qué debes añadirlas a los Build Profiles.

📄 ArtículoPrincipiante✅ RevisadoUnity 6.0 LTSActualizado 2026-07-14
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 7 min · ⌨️ Práctica 15 min

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#

C#
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
    }
}
Añade tus escenas a los Build Profiles

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.

⚖️ Comparativa · LoadScene vs LoadSceneAsync
LoadSceneLoadSceneAsync
Bloquea el juegoNo
Barra de progresoNo
Ideal paraEscenas pequeñas, menúsNiveles grandes, pantallas de carga
C#
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;
        }
    }
}
El 0.9 no es un error

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.

C#
SceneManager.LoadScene("HUD", LoadSceneMode.Additive);
SceneManager.UnloadSceneAsync("Zona1");   // descargar una zona

Sobrevivir 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:

C#
void Awake()
{
    DontDestroyOnLoad(gameObject);
}
Ojo con los duplicados

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 DontDestroyOnLoad evite 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.

Fuentes y para profundizar