Una alternativa mas amistosa y con una mejora en rendimiento es cambiar la condición. collision.tag == "Player" Por Collision.CompareTag("Player")
El personaje y el controlador
Programación de Videojuegos en Unity con C#
Creación y organización de proyectos 2D en Unity
Uso de Sprite Atlas en Unity para Optimizar Recursos Visuales
Animación de Personajes en Unity: Creación y Control de Sprites
Transiciones de Animaciones en Unity para Videojuegos 2D
Creación de Prefabs y Física Básica en Unity 2D
Conceptos de Física en Videojuegos con Unity: Colliders y RigidBodies
Creación y Uso de Colliders y Scripts en Unity para Videojuegos
Métodos Awake y Start en Unity para Configuración Inicial
Detección de Colisión con Raycast en Unity para Saltos Precisos
Uso de Gizmos y Física en Unity para Desarrollo de Videojuegos
Cambio de Animaciones de Personaje con Animator en Unity
Animación de Salto en Videojuegos: Creación de Estados Dinámicos
Animaciones y Transiciones en Unity Mechanim
Movimiento automático y control del personaje en Unity
El manager del videojuego
Creación y Gestión de un Game Manager en Videojuegos
Implementación de Singletons en Programación de Videojuegos
Transición de Estados en Videojuegos con Unity: Menú a Juego
Configuración de Controles en Unity: Uso del Input Manager
Configuración de Input Manager en Unity para Juegos
Creación de Zonas de Muerte con Colliders y Triggers en Unity
Función de Reset en Videojuegos 2D: Reinicio y Corrección de Bugs
Corrección de Bugs en Reaparición y Reinicio en Unity
Diseño procedural de niveles 2D
Diseño de Niveles: Creación Manual y Procedural en Videojuegos
Diseño Procedural de Niveles en Videojuegos: Pixel Perfect en Unity
Gestión de Bloques de Nivel en Videojuegos con Unity
Implementación de ExitZone para Destrucción de Bloques en Videojuegos
Generación Procedural de Niveles en Unity: Object Pooling y Optimización
Implementación de Cámara Follow en Videojuegos 2D con Unity
Destrucción de Bloques y Generación Procedural en Videojuegos
Corrección de errores en el Game Manager de videojuegos
Sincronización de Cámara y Fondo en Videojuegos 2D
HUD, menús y gameplay
El canvas en Unity
Diseño de Menú de Inicio en Videojuegos con Canvas
Programación de Funcionalidades de Botones en Unity
Diseño de Canvas para Pantalla de Juego y Game Over
Programación de Script para Interfaz de Juego en Unity
Incorporación de Objetos Recolectables en Unity
Implementación de un sistema de recolección de monedas en Unity
Programación de Pociones de Vida y Maná en Videojuegos
Notificación de Recolección de Pociones en Unity
Diseño e Implementación de Barras de Vida y Maná en Unity
Cálculo de Puntuación y Persistencia en Videojuegos con Unity
Implementación de Super Salto en Unity con Uso de Maná
Enemigos y dificultad
Creación de Plataformas Móviles en Unity con Animaciones
Scripts y Triggers para Plataformas Móviles en Videojuegos 2D
Programación de Enemigos Móviles en Unity con C#
Implementación de Fixed Update para Movimiento de Enemigos en Unity
Programación de colisiones para enemigos en videojuegos
Corrección de Bugs en Colisiones y Vida de un Personaje en Videojuegos
Control de Vida y Muerte de Personaje en Videojuegos
Añadir Música de Fondo en Videojuegos con Unity
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
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.
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);
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();
}
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();
}
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.
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
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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?