Destrucción de Bloques y Generación Procedural en Videojuegos

Clase 30 de 53Curso de C# para Videojuegos

Resumen

Domina el reciclado de bloques en Unity con un flujo claro: destruye siempre el más antiguo, genera el siguiente al instante y mantén la escena limpia. Con un Level Manager basado en singleton, una exit zone con OnTriggerEnter y listas bien gestionadas, lograrás un diseño procedural estable y fluido.

¿Cómo reciclar bloques con un level manager en Unity?

La mecánica central es simple y robusta: mantener una lista ordenada de bloques activos y eliminar siempre el primero. Así, el bloque en posición 1 pasa a 0 tras cada eliminación, garantizando un ciclo sin errores y sin referencias perdidas.

  • Mantén una lista: CurrentLevelBlocks con el orden de aparición.
  • Elimina siempre el índice 0: el más antiguo desaparece primero.
  • Destruye el GameObject para limpiar la escena.
  • Asegura consistencia con un singleton: SharedInstance en el Level Manager.

¿Qué hace RemoveLevelBlock?

Elimina el primer bloque activo y su objeto en escena. Así se recicla el contenido sin acumular basura.

public void RemoveLevelBlock()
{
    if (currentLevelBlocks.Count == 0) return;
    LevelBlock oldBlock = currentLevelBlocks[0];
    currentLevelBlocks.Remove(oldBlock);
    Destroy(oldBlock.gameObject);
}

¿Cómo vaciar todos con while?

Cuando no sabes cuántos bloques hay, usa while para vaciar la lista llamando al método anterior hasta que no queden elementos.

public void RemoveAllLevelBlocks()
{
    while (currentLevelBlocks.Count > 0)
    {
        RemoveLevelBlock();
    }
}

¿Por qué usar while en lugar de for?

Porque la cantidad de bloques restantes es variable. while finaliza en cuanto la lista queda vacía. Seguro y predecible.

¿Cuándo eliminar un bloque con una exit zone y ontriggerenter?

La eliminación se dispara al cruzar una zona de salida. Al detectar al jugador por tag, se añaden y se quitan bloques en una sola acción: se agrega uno nuevo y se destruye el más antiguo. Así, siempre hay dos bloques visibles.

  • Usa un collider como exit zone y marca al jugador con tag "Player".
  • Detecta la entrada con OnTriggerEnter.
  • Llama a AddLevelBlock y luego a RemoveLevelBlock.
  • Mantén la experiencia suave: no dejes huecos ni cortes visibles.

¿Cómo detectar al player por tag?

Verifica la etiqueta del collider para asegurar que la lógica solo corre con el jugador.

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        LevelManager.SharedInstance.AddLevelBlock();
        LevelManager.SharedInstance.RemoveLevelBlock();
    }
}

¿Por qué mantener dos bloques en pantalla?

  • Garantiza continuidad visual sin pop-ins bruscos.
  • Simplifica el control de memoria.
  • Facilita el reciclado: entra uno, sale otro.

¿En qué se parece a una kill zone?

El patrón de detección es el mismo: un trigger que reacciona al Player y ejecuta lógica al cruzar la línea. Cambia la acción: aquí reciclas bloques, allí gestionas la muerte.

¿Qué ajustes prácticos evitan problemas visuales y bugs?

Si la destrucción se nota, ajusta la posición de la exit zone unos puntos a la derecha para que el cambio ocurra fuera de cámara. También puedes retrasar la eliminación con Invoke para hacerla aún más discreta.

  • Desplaza la exit zone si el cambio se ve demasiado pronto.
  • Retrasa la eliminación con Invoke si necesitas unos milisegundos extra.
  • Vigila el reinicio tras muerte: hay que resetear juego y escenario.

¿Cómo retrasar la destrucción con invoke?

Invoca la eliminación tras un breve retraso para suavizar la transición.

private void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        LevelManager.SharedInstance.AddLevelBlock();
        Invoke(nameof(DeferredRemove), 1f); // ajusta el tiempo según necesidad
    }
}

private void DeferredRemove()
{
    LevelManager.SharedInstance.RemoveLevelBlock();
}

¿Qué bug aparece al morir el personaje?

Si el personaje muere y no se hace reset del escenario, el reinicio falla: el juego arranca sin reconstruir los bloques. Es clave restaurar tanto el estado del juego como el del nivel tras la muerte.

¿Te gustaría comentar cómo posicionas tu exit zone o qué timing te funciona mejor con Invoke?