PEC 05 – Media para videojuegos

Introducción al juego de pelea Robotic Fighters

Después de realizar las anteriores prácticas, he aprendido a modelar mis robots en 3D con Maya, texturizarlos, darles color y detalles, realizar su rigging y, finalmente, animarlos con diferentes secuencias como ataque, idle, muerte, movimiento y defensa. En esta última práctica, he creado una breve demostración de lo que sería un juego de lucha llamado Robotic Fighters, utilizando todos los elementos creados durante estas prácticas, es decir, tanto los robots como sus animaciones.

Cabe mencionar que ya tenía bastante experiencia previa con el programa Unity, tanto en 2D como en 3D, por lo que la implementación de un juego en dicho programa no me planteaba un reto extremadamente complicado a priori, pero sí desafiante y atractivo, ya que nunca había realizado un juego de lucha ni nada parecido.

La saga de videojuegos de lucha Tekken siempre ha sido un referente para mí en cuanto a juegos de este género, por lo que ha sido mi principal fuente de inspiración durante el proceso de desarrollo de Robotic Fighters, especialmente en lo relacionado con la cámara, el escenario y el HUD.

Creación del entorno del juego, cámaras y personajes

Lo primero que realicé en Unity fue importar los assets que iba a utilizar como escenario para el juego. En la Unity Store conseguí unos assets muy adecuados para mi juego, con unos escenarios futuristas y decadentes, perfectos para el estilo visual de mis personajes, alejados del estilo cartoon y más orientados a una estética futurista y sombría.

Así, creé una escena en la que arrastré diferentes assets para poco a poco ir formando el escenario, lleno de contenedores, bunkers y coches destruidos, lo que le da un toque de abandono y desolación al mundo del juego. Una vez que conseguí el resultado deseado, importé mis personajes de Maya: Robotydus y Archie. Los coloqué mirándose uno al otro con una distancia determinada y les apliqué a cada uno dos componentes: un Box Collider y un Rigidbody.

Hice lo mismo con el suelo, añadiendo un Collider para que los personajes se mantuvieran de pie al iniciar el juego. Para finalizar los preparativos, creé una cámara estática que enfocara a los dos personajes, colocando uno a la derecha y el otro a la izquierda. También añadí un Collider invisible detrás de cada robot para delimitar el espacio en el que se moverían durante el combate. Así conseguí preparar el entorno de mi juego de lucha y dejarlo listo para comenzar a implementar las funcionalidades jugables.

Lo primero que implementé en el juego Robotic Fighters fue el escenario mediante un Asset gratuito descargado desde la Unity Asset Store llamado RPG_FPS_Industrial Game.

Una vez creado el escenario implementé una cámara que enfocara a ambos robots en posición lateral mirándose el uno al otro.

Creación de las animaciones y el movimiento en cada robot

Este fue uno de los pasos más largos, aunque no el más difícil. Lo primero que hice fue crear un Animator para cada personaje y añadir allí los 5 clips de cada animación. Como ya había creado los clips en el proyecto anterior, pude acortar mucho trabajo.

Lo más desafiante fue crear las transiciones y conexiones entre cada animación, siendo Idle la animación central a la que derivaban todas las demás animaciones como muerte, movimiento, defensa y ataque. Para controlar estas animaciones, creé triggers como ataque, muerte y defensa, y un booleano para calcular la velocidad y activar la animación de movimiento.

Todo esto lo conecté con cada robot mediante un script llamado PlayerMovement. En este script, hice que, con el input de las teclas deseadas, se activara un trigger determinado. Además, al mover el robot, se modificaba el booleano del Animator para reproducir la animación de movimiento. Tuve que realizar algunos ajustes en la configuración del Animator para conseguir el resultado deseado en cuanto a los tiempos y las velocidades de las animaciones.

Todas las animaciones son controladas desde el Animator de cada robot. Cada animación cuenta con su propio trigger de activación y una transición con la animación siguiente.

HUD, menú y pausa

Una vez realizado el movimiento de los robots, me puse a crear las interfaces y los menús del juego, tanto el principal como el de pausa. Para ello, creé un Canvas en el que añadí tres paneles: el de la vida de los robots, el del menú de pausa y el del menú principal.

Para las vidas, creé un Slider para cada robot y ajusté algunos parámetros para conseguir el color y estilo visual deseado. Para los menús, importé un asset de UI Sci-Fi, que era muy acorde al estilo del juego. Creé dos paneles sencillos, cada uno con sus opciones. En el menú principal tenemos la opción de empezar el juego o salir. En el menú de pausa, las opciones son reiniciar el juego, continuar o salir.

Para configurar estos menús, creé un script con variables públicas para cada panel. La idea es que, al iniciar el juego, se muestra el menú principal, pero no se inicia el juego hasta que el jugador pulse los botones (a los que asigné métodos públicos). Al pulsar el botón Start, el movimiento de los robots y el juego en sí se inician. Con el botón Exit, se sale del juego. Durante la partida, si se pulsa la tecla espacio, el juego se pausa, y si se vuelve a pulsar, se retoma (con un margen de 1 segundo). En la pausa, podemos reiniciar, retomar el juego o salir.

Menú principal de juego y menú final que aparece cuando uno de los robots derrota al otro, y se muestra su nombre como el vencedor del combate.

Sistema de juego

El sistema de juego de Robotic Fighters está diseñado para ofrecer una experiencia fluida y dinámica en el combate entre los robots. Cada personaje comienza con 100 puntos de vida, representados visualmente mediante barras en el HUD. Cada golpe acertado por parte de un robot reduce la vida del oponente en 10 puntos, añadiendo un componente estratégico a los ataques y defensas.

El sistema de combate se basa en colisiones, habilitadas mediante colliders asignados a los modelos de los robots. Estos colliders permiten detectar los golpes en tiempo real. La gestión de los golpes se realiza a través de un script llamado AttackManager, que coordina los estados de ataque y defensa de ambos robots.

Cuando un robot ejecuta un ataque, su collider entra en trigger con el del oponente. El AttackManager verifica dos condiciones importantes:

  1. El robot atacante debe estar en estado de ataque, definido mediante un booleano en el script PlayerMovement.
  2. El robot oponente no debe estar en estado de defensa, lo cual también se controla mediante un booleano.

Si ambas condiciones se cumplen, el AttackManager llama a la función TakeDamage del script LifeManager. Este último es responsable de reducir la variable de vida del robot impactado y actualizar en tiempo real su barra de vida en el HUD.

Cada robot tiene un collider y un script llamado AttackManager que gestionan el impacto entre los robots. Cuando un robot ataca y el otro no está defendiendo, el AttackManager activa la función TakeDamage, lo que reduce la vida del robot afectado en 10 puntos y actualiza la barra de vida correspondiente.

Cuando se reinicia el juego, el LifeManager restablece todas las variables de vida a su estado inicial (100 puntos). Este proceso asegura que las barras de vida se reinicien adecuadamente al comenzar una nueva ronda.

En cuanto a la sonorización, el juego está completamente sonorizado: desde los movimientos de los robots hasta los botones de la interfaz de usuario. Estos sonidos se reproducen a través de Audio Sources, y son gestionados desde el script PlayerMovement, que controla la reproducción de los efectos de sonido durante las interacciones y acciones en el juego.

Script RobotFightController, que gestiona la mayoria de funciones del juego, como las animaciones de los personajes y sus movimientos, el reinicio del juego, el menú de pausa…

Script AttackController que gestiona el ataque de cada personaje al entrar en contacto con el otro y llama al método deseado del script LifeManager para reducir la vida del robot enemigo.

Script LifeManager, que gestiona la inicialización de las barras de vida de cada robot ( empezando con 100 en cada partida ) y la reducción de dichas barras cada vez que un robot golpea al otro.

Conclusiones y puntos de mejora

Así pues, ha sido un proceso muy dinámico y enriquecedor. Más que encontrarme con obstáculos o picos de dificultad, he tenido que dedicar bastante tiempo a planificar y complementar los elementos jugables, así como a asegurarme de que los aspectos visuales se alinearan con el estilo del juego. Estoy contento con el resultado, aunque soy consciente de que las animaciones podrían estar más pulidas y tener un timing más acertado.

Como puntos de mejora, me gustaría que, si en un futuro el juego tuviera más recursos y tiempo de desarrollo, se pudieran añadir más robots y escenarios para enriquecer la experiencia. Además, sería interesante incorporar un ataque especial para cada robot, con animaciones únicas que le den un toque más distintivo a cada uno. También me gustaría mejorar cada animación, tanto en términos de fluidez como de timing para que las transiciones entre ellas se perciban más naturales y realistas.

En resumen, este proyecto me ha permitido aprender y aplicar diversos conocimientos en modelado 3D, animación, programación en Unity y diseño de interfaces, lo cual me ha proporcionado una base sólida para futuros proyectos en el desarrollo de videojuegos.

Recursos Utilizados

A continuación, se detalla la lista de recursos utilizados en el desarrollo de Robotic Fighters, con sus respectivos enlaces:

Controles del juego

Controles para Archie V 1.34
  • Avanzar: Letra D
  • Retroceder: Letra A
  • Atacar: Letra F
  • Defenderse: Letra R
Controles para Robotydus
  • Avanzar: Letra L
  • Retroceder: Letra J
  • Atacar: Letra H
  • Defenderse: Letra Y
Controles comunes
  • Pausar el juego: Tecla Espacio. Al pulsarla, el juego se detiene, y al volver a pulsarla, el juego se reanuda con un margen de 1 segundo.

Enlace al juego en Simmer.io:

https://simmer.io/@daniTydus/fighting-robots

Entrada similar

Deixa un comentari