El Gallo contra Las Pesadillas


Tipo de proyecto:

Proyecto de la Universidad / Desarrollado en un equipo de 4 personas

Desarrollado en:

Unity 2021 / Programado en C#

Mi rol en el proyecto:

Programador general / Gameplay / UI


Menú reactivo 3D

Para El Gallo contra Las Pesadillas desarrollé un menú principal similar a Batalla Bolillera, siendo un menú 3D de una puerta que muestra uno de los escenarios del juego, al abrir y cerrar cambia de UI, funcionando con Eventos e index de botones, el menú cuenta con opciones básicas, además de una función especial, que cambia el cartel de inicio por otro dependiendo del nivel en el que te encuentres.

Al iniciar el juego se buscan los datos de guardado, y dependiendo de si están vacíos o de la información contenida sobre el nivel actual se activa un cartel diferente para mostrar el próximo reto para el jugador. Más abajo se encuentran dos funciones que son llamadas al pulsar los botones de la interfaz para ejecutar una animación en la puerta que activará el siguiente menú.

El código de la puerta contiene funciones llamadas por eventos en su animación al abrirse o cerrarse, tomando un index desde el menú y activando el UI correspondiente, la segunda función realiza la misma operación para desactivar el menú actual para ir al siguiente.


Movimiento del jugador

En El Gallo contra Las Pesadillas el jugador puede moverse hacia cualquier dirección, además puede rotar la cámara libremente para conseguir diferentes perspectivas según se sienta mejor en la escena, por lo que el movimiento siempre está orientado respecto al frente para que los controles no varíen o no vayan hacia la dirección que el jugador desea ir, dando una sensación de movimiento fluida y natural dependiendo hacia donde mire en todo momento en el entorno 3D.

Para el movimiento de El Gallo se toman los inputs del movimiento si este no está atacando, y calcula la dirección de movimiento según el frente de la cámara, después la normaliza y la multiplica por la velocidad para aplicar la fuerza al RigidBody mientras se anima o no el movimiento según su velocidad, por último rota al personaje hacia la dirección que está mirando mediante Quaternions.

Mientras El Gallo se mueve se ejecuta la función para que la cámara lo siga manteniendo la distancia inicial, que además puede rotar alrededor del jugador si se pulsa la tecla "Q" o "E" para girar a un lado o al otro en su propio eje según una velocidad.


Combate del jugador

Para combatir a Las Pesadillas El Gallo al ser un luchador puede lanzar golpes a sus enemigos con habilidad, alternando entre derecha e izquierda para atacar a mayor velocidad con gran técnica, estos golpes van siempre hacia adelante y hacen daño a todos los objetivos que se encuentren dentro del alcance de los golpes, mientras El Gallo está atacando se mantiene en su lugar y no puede avanzar.

El sistema de combate de El Gallo funciona mediante un Cooldown de ataque para cada mano, que se reduce continuamente en el Update, con un Clamp para mantenerlo dentro del 0 hasta el máximo de Cooldown, después existen dos comparaciones de input para el click izquierdo y derecho, cada uno independiente y encargado de cada mano, al recibir uno de los inputs se compara si el Cooldown es menor o igual a cero y se ejecuta el ataque, activando la condición de detener el movimiento de El Gallo, haciendo un Trigger a la animación y reiciando el Cooldown, por último llama a la función que vuelve a permitir caminar a El Gallo después de 1.15 segundos con un Invoke.

Una vez iniciado el ataque de El Gallo, se llama a la función Atacar en un Evento de la animación del golpe, que primero obtiene un Array con todos los enemigos alcanzados por el radio de ataque con una OverlapSphere en el Layer de enemigos, después con un Foreach aplica el daño del ataque a cada uno de los enemigos en el Array tras obtener su Script, se hace una comparación con todos los if ya que con cada golpe puede dañar a todos los enemigos en área y no solo a un objetivo, esta misma función se aplica para ambos puños.


Recolección de canicas

Dentro de cada nivel el jugador puede recolectar canicas al pasar sobre ellas, las cuales podrán usar en un futuro para incrementar las estadísticas de El Gallo para afrontar los próximos niveles, en cada escenario las canicas están colocadas en el mismo lugar, si el jugador no completa el nivel estas reaparecen y se pierden hasta que vuelva a recogerlas en otro intento dentro del nivel.

El funcionamiento de la recolección de canicas es muy simple, ya que cada canica tiene un Collider con un Trigger que al detectar al jugador se destruye y aumenta la cantidad de canicas al manager, al destruirse reproduce un sonido y cambia el texto del UI de canicas recolectadas en el nivel.


Habilidades

Para ayudarse en combate El Gallo también puede utilizar algunas habilidades cada cierto tiempo, las cuales son desbloqueadas en determinados niveles siendo tanto potenciadores como habilidades de ataque, la primera es un Boost tanto de velocidad como de poder de ataque durante un tiempo, la segunda es un lanzamiento de Tazos desde el aire que afecta a todos los enemigos en el área de impacto aplicándoles daño, la última es una habilidad de refuerzos, llamando un Camión cargado con Pollos de juguete que se despliegan al llegar, y se mueven de forma aleatoria mientras atacan a los enemigos, todas las habilidades tienen un Cooldown vivible en el UI.

El Boost tiene una función Update, la cual constantemente reduce el Cooldown de la habilidad con un Clamp para mantenerlo dentro del rango, después inician una serie de comparaciones, primero si la mejora está activa se comienza a restar el tiempo de duración del Boost, el siguiente if compara si el Cooldown está activo o no y se activa o desactiva el UI del Boost pasando constantemente el valor al Slider, después se compara si el jugador presiona el botón de la habilidad y si se cumplen las condiciones activa el feedback de la mejora y aplica los efectos, por último si el tiempo del Boost termina se desactiva el material especial y se reinician las estadísticas de El Gallo.

El Update de los Tazos tiene la misma función de Cooldown para pasar continuamente el valor al Slider y activar o desactivar el UI, al pulsar el número 2 se activa un Bool que marca esta habilidad como seleccionada y quita la selección a cualquier otra habilidad asignada si está dentro del Cooldown.

El daño de los Tazos se aplica mediante un Evento en la animación de cada Tazo, que al caer al suelo llama a la función Aplastar, la cual obtiene a todos los enemigos afectados dentro del rango de ataque, y con un Foreach compara sus Tags para aplicarles daño según su Script para cada individuo dentro del alcance, así el ataque de cada Tazo es independiente y relativo a los objetivos que golpea en su área.

Al igual que las otras habilidades, ésta cuenta con un Update donde se reduce un Cooldown y se compara su valor para mostrar el UI correspondiente a la habilidad, y al pulsar el número 3 que está asignado a la habilidad esta se coloca como la seleccionada y reemplaza a cualquier otra que lo estuviera previamente.

Esta habilidad se compone de más elementos que las otras, ya que al iniciar la habilidad en una zona se instancia un Camión de juguete que se dirige hasta el punto indicado, en su Update el Camión avanza mediante NavMesh y al acercarse lo suficiente su compara si este aún no había llegado, en caso de que haya sido empujado por algún otro objeto, después de eso instancia la cantidad de Pollos en el lugar y es destruido al pasar un tiempo determinado.

Al ser desplegado cada Pollo inicia su comportamiento, primero en el Update inicia su movimiento y un contador de vida para cada Pollo, la primer comparación es cuando su tiempo de vida sea 0 y entonces el Pollo será destruido, después si no hay ningún objetivo realiza la función DetectarEnemigo para encontrar enemigos mientras los mira con la función VerEnemigo, por último cada Pollo tiene un Cooldown de ataque y si este se cumple realiza un ataque al objetivo, si el enemigo sale de su rango de ataque este se establece como nulo y continúa la búsqueda de objetivos.

Cada Pollo tiene varias funciones para su comportamiento, la primera es MovimientoRandom, la cual genera unas coordenadas random en X/Z para crear un nuevo Vector3 que será a donde se moverá el Pollo, la segunda función es DetectarEnemigo que genera una OverlapSphere obteniendo a todos los enemigos dentro del rango de ataque para establecer al objetivo, ObjetivoEnRango es una función booleana que determina si el objetivo aún se encuentra dentro del rango del Pollo, la función VerEnemigo hacer girar al Pollo hacia la dirección de su movimiento o ataque, y por último la función Gritar instancia un Prefab que será el ataque al enemigo.

Los proyectiles instanciados por cada Pollo tienen un Update donde primero comparan si tienen un objetivo, si no lo tienen se autodestruyen, después de esto comparan su distancia con el enemigo y mueven su posición con Translate mientras miran al objetivo, y si se acercan lo suficiente golpean al enemigo mediante la función GolpearObjetivo.

La función Damage es llamada por GolpearObjetivo, aquí se compara a que enemigo golpeó el proyectil y toma su Script para aplicarle daño, aquí únicamente se incluyen las Sombras que son los enemigos básicos y El coco, ya que los Pollos se descubren en el último nivel donde solo te enfrentas a estos.

Después de pulsar cualquiera de las teclas para activar la habilidad de Tazos o Pollos es necesario hacer un click en el suelo, indicando el punto para ejecutar esta habilidad, esto funciona mediante un OnMouseDown que toma la posición del click y compara en que superficie se produjo, si esto fue en un objeto válido instanciará un Prefab según la habilidad seleccionada siendo los Tazos o el Camión de los Pollos e iniciará el Cooldown, si el punto del click no es válido simplemente se hace un Return y no sucede nada.