El personaje y el controlador

1

Programación de Videojuegos en Unity con C#

2

Creación y organización de proyectos 2D en Unity

3

Uso de Sprite Atlas en Unity para Optimizar Recursos Visuales

4

Animación de Personajes en Unity: Creación y Control de Sprites

5

Transiciones de Animaciones en Unity para Videojuegos 2D

6

Creación de Prefabs y Física Básica en Unity 2D

7

Conceptos de Física en Videojuegos con Unity: Colliders y RigidBodies

8

Creación y Uso de Colliders y Scripts en Unity para Videojuegos

9

Métodos Awake y Start en Unity para Configuración Inicial

10

Detección de Colisión con Raycast en Unity para Saltos Precisos

11

Uso de Gizmos y Física en Unity para Desarrollo de Videojuegos

12

Cambio de Animaciones de Personaje con Animator en Unity

13

Animación de Salto en Videojuegos: Creación de Estados Dinámicos

14

Animaciones y Transiciones en Unity Mechanim

15

Movimiento automático y control del personaje en Unity

El manager del videojuego

16

Creación y Gestión de un Game Manager en Videojuegos

17

Implementación de Singletons en Programación de Videojuegos

18

Transición de Estados en Videojuegos con Unity: Menú a Juego

19

Configuración de Controles en Unity: Uso del Input Manager

20

Configuración de Input Manager en Unity para Juegos

21

Creación de Zonas de Muerte con Colliders y Triggers en Unity

22

Función de Reset en Videojuegos 2D: Reinicio y Corrección de Bugs

23

Corrección de Bugs en Reaparición y Reinicio en Unity

Diseño procedural de niveles 2D

24

Diseño de Niveles: Creación Manual y Procedural en Videojuegos

25

Diseño Procedural de Niveles en Videojuegos: Pixel Perfect en Unity

26

Gestión de Bloques de Nivel en Videojuegos con Unity

27

Implementación de ExitZone para Destrucción de Bloques en Videojuegos

28

Generación Procedural de Niveles en Unity: Object Pooling y Optimización

29

Implementación de Cámara Follow en Videojuegos 2D con Unity

30

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

31

Corrección de errores en el Game Manager de videojuegos

32

Sincronización de Cámara y Fondo en Videojuegos 2D

HUD, menús y gameplay

33

El canvas en Unity

34

Diseño de Menú de Inicio en Videojuegos con Canvas

35

Programación de Funcionalidades de Botones en Unity

36

Diseño de Canvas para Pantalla de Juego y Game Over

37

Programación de Script para Interfaz de Juego en Unity

38

Incorporación de Objetos Recolectables en Unity

39

Implementación de un sistema de recolección de monedas en Unity

40

Programación de Pociones de Vida y Maná en Videojuegos

41

Notificación de Recolección de Pociones en Unity

42

Diseño e Implementación de Barras de Vida y Maná en Unity

43

Cálculo de Puntuación y Persistencia en Videojuegos con Unity

44

Implementación de Super Salto en Unity con Uso de Maná

Enemigos y dificultad

45

Creación de Plataformas Móviles en Unity con Animaciones

46

Scripts y Triggers para Plataformas Móviles en Videojuegos 2D

47

Programación de Enemigos Móviles en Unity con C#

48

Implementación de Fixed Update para Movimiento de Enemigos en Unity

49

Programación de colisiones para enemigos en videojuegos

50

Corrección de Bugs en Colisiones y Vida de un Personaje en Videojuegos

51

Control de Vida y Muerte de Personaje en Videojuegos

52

Añadir Música de Fondo en Videojuegos con Unity

53

Implementación de Efectos de Sonido en Videojuegos con Unity

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de C# para Videojuegos

Curso de C# para Videojuegos

Juan Gabriel Gomila

Juan Gabriel Gomila

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

30/53
Recursos

¿Cómo eliminar bloques en el juego?

Para mantener el rendimiento y la experiencia de juego, es crucial eliminar los bloques que el jugador ya no necesita ver o interactuar. Implementar la destrucción de bloques es una tarea fundamental en el diseño procedural de niveles en videojuegos. En esta sección, exploramos cómo el Level Manager realiza esta función y ajustamos su comportamiento para obtener un resultado óptimo.

¿Cómo funciona el método remove level block?

El método remove level block se encarga de destruir el primer bloque de la colección Current Level Blocks. Utiliza un sencillo truco en el cual, al destruir el bloque en la posición cero, el siguiente bloque pasa automáticamente a ocupar esa posición. Esto asegura que siempre se destruya el bloque más antiguo.

LevelBlock oldBlock = currentLevelBlocks[0];
currentLevelBlocks.RemoveAt(0);
Destroy(oldBlock.gameObject);

Ventajas de esta implementación:

  • Eficiencia en tiempo de ejecución: Destruir siempre el primer bloque simplifica el código y optimiza el ciclo de vida del juego.
  • Orden coherente: Garantiza que se eliminen los bloques en el orden en que se colocaron, manteniendo el flujo del juego.

¿Cómo eliminar todos los bloques?

Para eliminar todos los bloques, el método removeAllLevelBlocks utiliza un while loop. Este ciclo continua hasta que no quede ningún bloque en la colección Current Level Blocks.

while (currentLevelBlocks.Count > 0) {
    removeLevelBlock();
}

Razones para usar un while loop:

  • Adaptabilidad: No se requiere conocer de antemano cuántos bloques hay que eliminar, el ciclo se adapta a la cantidad existente.
  • Robustez: Asegura que todos los bloques sean eliminados sin riesgo de errores por índices fuera de rango.

¿Cuándo se deben eliminar los bloques?

La determinación de cuándo eliminar bloques se implementa mediante el sistema OnTriggerEnter. Cada vez que el personaje entra en la zona de salida, se verifican las colisiones para identificar si el jugador ha sobrepasado la zona de eliminación.

if (collision.tag == "Player") {
    LevelManager.SharedInstance.AddLevelBlock();
    LevelManager.SharedInstance.RemoveLevelBlock();
}

Principales beneficios:

  • Sincronización perfecta: La eliminación de bloques ocurre solo cuando es necesario, mejorando el rendimiento del juego.
  • Reciclaje visual: Mientras se elimina un bloque viejo, se añade uno nuevo, manteniendo siempre dos bloques en pantalla para el jugador.

Consideraciones finales sobre la eliminación de bloques

El ajuste de la zona de eliminación es crucial para lograr una experiencia de usuario fluida. Si la eliminación ocurre demasiado pronto o tarde, puede ser necesario ajustar la posición de la Exit Zone o incorporar retrasos en el código.

  • Ubicación ajustable: Mover la Exit Zone más a la derecha puede prevenir que los jugadores vean la eliminación de bloques.
  • Uso de Invoke: Para retrasar la destrucción, se puede usar Invoke para ejecutar la eliminación tras unos segundos.

Esta estrategia de manejo de bloques no solo es funcional y efectiva, sino que también puede adaptarse para otros tipos de juegos con geometría tridimensional o niveles más complejos. Como siempre, sigue experimentando y ajustando para crear entornos desafiantes e inmersivos para los jugadores.

Aportes 11

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Una alternativa mas amistosa y con una mejora en rendimiento es cambiar la condición. collision.tag == "Player" Por Collision.CompareTag("Player")


Mucho OJO, a mi teniendo el Player con 2 colliders (tal y como lo tiene Juan Gabriel, el collider de cápsula y el de caja para los pies), me detectaba dos colisiones con el ExitPoint y me borraba los 2 LevelBlock

Solución dejar al Player con 1 solo collider, por ejemplo el de capsula ;=)

Un desafío de las clases anteriores era programar que nuestro personaje pudiera ir no solo hacia adelante sino también hacia atrás, pero, ¿cómo podríamos ir atrás si destruimos los bloques inmediatamente después de superarlos? 🤔

Si queremos destruir los componentes con delay, la misma función “Destroy” recibe como 2do parámetro un float para ese delay.

Destroy(oldBlock, 1f);

Importante, me dio un error de index o algo así. Creía que por alguna razón todos los bloques se eliminaba por un error en el código pero resultó ser que la lista de todos los bloques iniciales a los cuales debemos arrastrar los prefabs de los niveles se había vaciado quién sabe por qué, solo los volví a arrastrar y ya estaba funcionando perfecto

Cada clase que avanzo me doy cuenta de que voy comprendiendo mejor la sintaxis de C# y lo mejor de todo, aprendiendo a interpretarla haciendo mis propios comentarios en el código.

 public void RemoveLevelBlock() //Metodo para eliminar bloque de nivel
    {
        /*Dentro del método RemoveBlock hemos instanciado la clase LevelBlock con la variable oldBlock
         * en el elemento 0 del array CurrentLevelBlocks.
         * Invocamos el método Remove para que elimine el OldBlock en la posición 0 del Array,
         * de manera que cuando se elimine el bloque 0, el bloque siguiente pasará a ser el elemento 0 
         * del Array (Lista de bloques en Unity) y así sucesivamente con todos los bloques. 
         * Por último hemos invocado el método Destroy para que destruya de la pantalla de juego
         * el GameObject instanciado y llamado OldBlock.*/
        
        LevelBlock oldBlock = CurrentLevelBlocks[0];
        CurrentLevelBlocks.Remove(oldBlock);
        Destroy(oldBlock.gameObject);
    }

Solemos hacer uso de bucle while cuando no sabemos la cantidad de iteraciones que queremos que se ejecute algo.

Tener en cuenta que al estar destruyendo y generando constantemente, hace que sea un mayor esfuerzo para el procesador.
Por eso el Patron de diseño Object Pool trata de reciclar los recursos.

Genial

Excelente clase, todo funciona a la perfección.