Gestión de Bloques de Nivel en Videojuegos con Unity

Clase 26 de 53Curso de C# para Videojuegos

Resumen

Aprende a generar niveles dinámicos en Unity con un único gestor que añade y elimina bloques según avanzas. Aquí verás cómo estructurar un gestor de nivel sólido en C# con métodos claros, patrón Singleton, y el uso efectivo de listas, arrays y bucles para mantener la escena limpia y estable desde un bloque plano inicial.

¿Qué resuelve el levelmanager en la generación del nivel?

Un bloque cero plano permite que el jugador empiece en una zona estable y conocida, evitando aparecer entre plataformas. A partir de ahí, el gestor debe añadir nuevos bloques al final, destruir los anteriores, generar los bloques iniciales y limpiar todo cuando el personaje muere.

¿Qué métodos públicos debe exponer el levelmanager?

  • Añadir un bloque nuevo al final: public void AddLevelBlock.
  • Quitar el último o el que corresponda: public void RemoveLevelBlock.
  • Eliminar todos los bloques de la escena: public void RemoveAllLevelBlocks.
  • Preparar el inicio de la partida: public void GenerateInitialBlocks.
using System.Collections.Generic;
using UnityEngine;

public class LevelManager : MonoBehaviour
{
    public static LevelManager SharedInstance;

    public List<LevelBlock> allTheLevelBlocks = new List<LevelBlock>();
    public List<LevelBlock> currentLevelBlocks = new List<LevelBlock>();
    public Transform levelStartPosition;

    void Awake()
    {
        if (SharedInstance == null)
        {
            SharedInstance = this;
        }
    }

    void Start()
    {
        GenerateInitialBlocks();
    }

    public void AddLevelBlock() { }
    public void RemoveLevelBlock() { }
    public void RemoveAllLevelBlocks() { }

    public void GenerateInitialBlocks()
    {
        for (int i = 0; i < 2; i++)
        {
            AddLevelBlock();
        }
    }
}

¿Cómo preparar la escena en unity para un inicio estable?

El objetivo es arrancar siempre en el mismo punto y con una configuración clara. Además, necesitas ver y localizar el gestor con facilidad usando un gizmo.

¿Cómo configurar el objeto vacío con gizmo y posición cero?

  • Crear un objeto vacío llamado LevelManager. Asignar un gizmo para identificarlo. Colocarlo en 0, 0, 0.
  • Asignar el script de C# al objeto LevelManager.
  • Crear un objeto vacío llamado “Level Start”. Añadir gizmo y colocarlo como referencia del inicio del nivel.
  • Usar alturas conocidas: Y en -4 y -13 para alinear con el punto de inicio mencionado. Ajustar Z a 0 para que quede sobre el anterior.

¿Cómo asignar prefabs y referencias en el inspector?

  • En LevelManager, arrastrar “Level Start” al campo levelStartPosition.
  • Preparar la lista allTheLevelBlocks con el tamaño adecuado según los prefabs creados.
  • Arrastrar el bloque 0 (plano) y el bloque 1 a las posiciones 0 y 1 respectivamente.
  • Recordatorio crucial: los índices empiezan en 0. Elemento 0 es el primero. Elemento 1 es el segundo.

¿Cómo funcionan listas, arrays y bucles en c# dentro de unity?

Para gestionar bloques dinámicos, necesitas estructuras que crezcan y se modifiquen en tiempo de ejecución. Además, un bucle simple puede invocar varias veces el mismo método sin esfuerzo.

¿Cuál es la diferencia entre arrays y listas?

  • Un array tiene tamaño fijo. No puedes añadir posiciones nuevas.
  • Una List es dinámica. Puedes añadir y quitar elementos cuando quieras.
  • Para bloques que se crean y destruyen en escena, una List es más versátil.

¿Cómo opera el bucle for para generar bloques iniciales?

  • Se recomienda generar dos bloques al inicio: el plano inicial y el siguiente para la transición.
  • Estructura del bucle: contador que arranca en 0, condición que se cumple mientras sea menor que 2, e incremento al final.
for (int i = 0; i < 2; i++)
{
    AddLevelBlock();
}
  • Iteración 1: i = 0, se añade el primer bloque. Se incrementa i.
  • Iteración 2: i = 1, se añade el segundo bloque. Se incrementa i.
  • Salida: i = 2 ya no cumple i < 2, se detiene el bucle.

¿Por qué usar singleton en el gestor del nivel?

  • Debe existir solo un gestor de nivel. Evita conflictos de añadir y destruir a la vez.
  • Patrón Singleton: una instancia compartida accesible desde cualquier parte del juego mediante SharedInstance.

  • Ventajas prácticas.

  • Control centralizado del flujo del nivel.
  • Menos referencias manuales dispersas.
  • Código más claro y mantenible.

¿Te gustaría añadir más tipos de bloques o reglas para su aparición? Comparte tus ideas y preguntas en los comentarios.