PEC1. Escapa de la Escuela de Insultos
PEC1. Escapa de la Escuela de Insultos
Repositorio: https://gitlab.com/Ninquiet/ninquietuoc-2d-pec1
Tabla de Contenidos
Video del juego
Juego En WebGl
Para jugar, visita el siguiente enlace: Juega «Escapa de la Escuela de Insultos» aquí
Resumen
Este es un juego que toma como base las batallas de insultos en Monkey Island, donde el contrincante te insultará, tu tomarás una alternativa y según esto responderás bien o no a su ataque y será tu turno de atacarlo a el.
Mecanicas
El juego combina el movimiento por los escenarios con elecciónes, con las batallas de insultos, de esta manera en cada escenario hay algo que encontrar o algún enemigo que vencer para poder continuar.
Movimiento por los escenarios
Los escenarios son un papel fundamental en el juego, para moverte atraves de ellos solo debes oprimir el botón de tu escenario objetivo, estos son tu medio para moverte a lo largo del juego, en algunos encontrarás por ejemplo una llave, en muchos otros encontraras diversos enemigos que solo se encuentran en estos lugares, debes sortear los diferentes escenarios para poder llegar a la puerta con la llave y escapar.
Batallas de Insultos
En las batallas de insultos el enemigo iniciará el ataque, eligiendo de forma aleatoria un insulto, y el jugador deberá elegir la respuesta correcta entre tres posibilidades, si el jugador elige correctamente el ataque enemigo no tendrá efecto, sin embargo, si se equivoca, el ataque enemigo dañará al jugador.
Luego de esto, será el turno del jugador para insultar a su enemigo, entonces, el jugador elegirá un insulto de las posibilidades mostradas (elegidas de forma aleatoria de la lista de insultos), y el enemigo deberá tratar de responder el insulto con la respuesta correcta.
Estructura Logica del Codigo
Forma en que escribí el codigo:
El codigo está escrito con la intención de implementar el Self Comment Code (trato de seguir los lineamientos del libro Clean Code), tambien he escrito el codigo en inglés (a excepción de las partes relacionadas a algo que se vaya a mostrar al usuario, cómo dialogos o textos) esto debido a que es una convención estandar internacional hacerlo así (espero no haya problema).
Inicialmente cree el codigo para funcionar con el sistema de Task de C#, pero al finalizar el juego y exportarlo a WebGl, descubrí que WebGl no trabaja muy bien (por no decir que para nada) con los Delay temporales, por lo tanto me vi obligado a buscar alternativas, así que, uso ampliamente DoTween (librería gratuita) y UniTask (librería gratuita tambien)
Librerias externas:
He usado DoTween principalmente para gestionar animaciones simples, no soy muy fan de usar Animator para cosas simples, más que todo por su gran consumo en performance.
Unitask es similar al sistema de Task de c#, pero optimizado para funcionar con Unity, así que gracias a el pude solucionar los problemas con Delay en web sin necesidad de cambiar todo el proyecto.
Estructura
Tomé como base el juego de aventuras, pues quería crear un juego en que no fuera solo una batalla sino una pequeña aventura, sin embargo lo modifiqué bastante (tal vez ahora sea un paralelo muy lejano), esta estructura de modo Historia se nutre en tiempo real del documento Story ubicado al interior de la carpeta Resources
Nucleo Base:
Este nucleo estaría compuesto por los Scripts generales y de control, (Los que se pueden encontar en «/Scripts»), su principal exponente es GameplayManager, no es un script muy largo, pero su funcion es iniciar el juego y hacer de puente entre los distintos eventos que suceden, así conecta el modo historia con las batallas de insultos, y viceversa.
Nucleo Story:
El nucleo Story se compone por todos los Scripts al interior de «/Scripts/Story», el manejador principal es StoryGameplayManager, este se encarga de gestionar la historia y su loop. Cuando se inicializa, hace uso de StoryManager para traducir la información del Json Story a nodos, luego de esto inicia el texto y las opciones, para mostrar el texto usa StoryUIManager que es el encargado de todo los UI correspondiente a Story, para interconectar todo hago uso de un sistema de Acciones a modo de evento.
Cuando el modulo Story se encuentra que en el escenario en el que se encuentra el jugador hay un Enemigo, notifica a GameplayManager que hay un enemigo y que tipo de enemigo es, GameplayManager usa «UIManager» para activar la interfaz de batalla y notifica a «InsultsBattleManager» para que inicialize la batalla con el enemigo indicado.
Una vez que la batalla finaliza, GameplayManager notifica a StoryGameplayManager y este continua con el modo historia.
Nucleo InsultsBattle
Este nucleo se encarga de gestionar todo lo relacionado con batallas, se le notifica que enemigo es el con el cual se batallará, y este se encarga de organizar todo lo relacionado a inciar el enemigo, y controlar la interfaz con ayuda de «StoryUIManager», si el jugador muere se notifica la derrota a GameplayManager y este activa la pantalla derrota, por el contrario, si el jugador gana, tambien se notifica a GameplayManager y este cierra el modo batalla y continua con el modo historia.
Los insultos son cargados del archivo TestingInsults en la carpeta /Resources, el encargado de deserializar estos archivos y convertirlo a los DTO y posteriormente a los formatos de clases finales es Insults Manager
Ilustraciones
Las ilustraciones las he hecho yo, no son muy bonitas pero fueron hechas con mucho amor <3