Rookie Awards 2024 - Open for Entries!
Portfolio Matemáticas
Share

Portfolio Matemáticas

Javier Botía Castillo
by jaboca on 13 Jan 2022

Runner 3D de generación procedural (Perlin Noise)

0 546 0
Round of applause for our sponsors

Este proyecto consiste en un Runner 3d.  Para este proyecto he utilizado el Perlin Noise, la cual consiste en una generación aleatoria en función de un "ruido" o patrón a escala de grises, en el que las zonas de color negro o blanco serian los extremos.   Dicho patrón, ha sido utilizado en este proyecto para la generación, de manera procedural,  de todos los obstáculos y objetos que puedas encontrarte en un runner. Estos objetos generados son:

Los muros: parte fundamental de cualquier runner, son los obstáculos que los jugadores van a tener que intentar esquivar si no quieren que estos los empujen hasta la muerte. Por ello, estos muros son lo primero que se generaran a través del perlin noise y estos empezaran a crearse como GameObjects cuando el valor del perlin sea el establecido en la dificultad estándar. En la fácil este valor cambiara para hacer que la generación sea mucho menor y bajar de esa manera la dificultad, mientras que en el difícil la generación será mucho mayor para aumentarla. 

En caso de que el valor de nuestro perlin sea distinto a la cantidad solicitada, se escogerá un numero random. Volviendo al caso estándar, si el valor es el establecido, el juego generara una torreta como respuesta. Esta torreta, fijara a nuestro personaje en cuanto este entre en su campo visual, en base a la posición del jugador, la torreta ira disparando una serie de proyectiles (estos al igual que las torretas variaran en forma dependiendo del nivel de dificultad elegido). El proyectil se destruirá al  impactar al jugador y por consiguiente se le restaran puntos de vida, una vez llegue a 0, el jugador será llevado a una escena a modo de minijuego en la que tendrá que competir contra una IA para encontrar un objeto. 

Dependiendo de la dificultad que el jugador haya escogido, la IA utilizara un algoritmo de búsqueda lineal, binario o ternario. Lo que le permitira al jugador tener mas oportunidades o menos a la hora de fallar en función del algoritmo que utilice la IA.  En caso de que el jugador gane, se le llevara de nuevo a la escena del nivel en el que estaba, manteniendo el tiempo que había conseguido antes de morir junto con 5 vidas nuevas. En caso de que la IA gane, se llevara al jugador a la escena de la pantalla de game over, notificándole de que ha perdido y dándole la posibilidad de salir de la aplicación. 

Volviendo a la generación de objetos, en caso de que el numero random no este entre los valores establecidos se nos generara un powerup que se destruirá y nos subirá 0.5 de vida adicional si logramos colisionar con el. 

El jugador podrá moverse de izquierda a derecha hasta la parte donde están los muros, sin embargo, hacia delante solo podrá moverse hasta la mitad del juego debido a que tendrá un GameObject invisible a modo de muro que le impedirá seguir. Sin embargo, para seguir dándole  el efecto al jugador de que esta avanzando, los objetos que se generen (powerups,torretas y obstaculos) se moverán directamente hacia el. En caso de que estos lo empujen hacia atrás, acabara chocándose contra una pequeña pared que hay, la cual enviara al jugador a la escena del minijuego al colisionar.

Al igual que los muros, tanto las torretas como los powerups serán aparecerán de manera mas usual o menos en función del nivel de dificultad escogido: en fácil, los powerups aparecerán de manera frecuente mientras que en la dificultad difícil será muy raro ver alguno. El caso contrario sucede con las torretas.

Este nivel de dificultad lo podremos seleccionar a través de nuestra escena principal que actuara a modo de menú de selección de dificultad, en esta escena tendremos tres botones: fácil, normal y difícil. En función del botón seleccionado se nos cargara la escena con el nivel correspondiente.

Para este proyecto, he utilizado el motor de Unity, en concreto la versión de 2021.2.1, dicho motor se utiliza mucho en la industria de los videojuegos y es muy interactivo con el usuario, haciéndolo bastante sencillo de manejar. En cuanto al lenguaje de programación utilizado, he utilizado el que utiliza unity, que en este caso es c#, un lenguaje fuertemente tipado que detecta rápidamente cualquier error que se produzca en la programación y avisar en el acto al usuario, dándole sugerencias sobre como abordar el problema además de permitir encapsular el código y hacerlo mas seguro.

Por ultimo, cabe añadir que el Perlin Noise no es nuevo dentro de la industria de los videojuegos y lo hemos podido ver en ejemplos como Minecraft, el cual lo utiliza para la generación de semillas (es decir, generación del terreno).

 


Comments (0)

This project doesn't have any comments yet.