Mientras que el Player y el Enemy contienen un Text Mesh Pro y un panel de Hp que a su vez contiene un texto y un slider. El Slider es un componente que se encuentra cuando creamos un UI que lo que hace es deslizarse de izquierda a derecha
Esta es su representación gráfica:
Dentro de la configuración del componente Slider nos permite meter un valor Minimo, un valor Maximo y un valor Actúal que es representado con la barra verde de la imágen anterior
Dentro del MainPanel tenemos:
El funcionamiento de este sistema de combate es el siguiente. Nuestro jugador cuando entré en esta escena. Y esta escena va a tener un combatManager que lo que va a hacer es empezar a instanciar enemigos, es decir a colocar dentro de la escena enemigos, y va a contar como que has entrado en el nivel 1 si vencemos al enemigo pasaremos al nivel 2 y nos irá dando oro cada vez que avancemos de nivel. Si nuestro jugador no muere en esta cadena infinita de enemigos siempre aparecerá un menú cada vez que venza, ese menú es este:
Si pierde el jugador en el proceso del combate nos aparecerá está pantalla y se perderá todo el oro ganado. Tendrás dos opciones o volver al Menú principal o a la escena Town pero sin el oro que había ganado el jugador
El esquema del sistema de combate vamos a usar un SO(Scriptable Object) que es CombatUnit aquí es dónde vamos a definir los datos, es decir separar los datos de la lógica de lo que son las unidades. Pueden ser las unidades del enemigo, las unidades del player guardaremos lo que es su vida. Y después vamos a utilizar un componente que se llama el Combat Trigger que basicamente va a lanzar un evento que volveremos a crear y aquí dentro irá un Combat Request. Esto se hace porque el CombatManager está en otra escena, está en el Gameplay y necesita saber varias cosas, por un lado necesita saber los CombatUnitSO son varios datos, es decir necesita saber cual es el player y cúal el enemigo y después necesita saber las posiciones, donde situar sus prefabs. Al estar en escenas diferentes se lo tenemos que pasar a través de ese Request. El esquema es tal como aparecen en esta imagen
Después dentro de la escena Gameplay vamos a necesitar un CombatManager que va a estar escuchando el evento de CombatRequest y le va a hablar al CombatUI. Es decir vamos a separar la vista de la lógica y va a estar hablando con este elemento que se llama CombatUi pero no sabe lo que hace por detrás. Le hablará cada vez que necesite de algo y el CombatUI hará lo que tenga que hacer en pantall.
En total tendremos 5 componentes nuevos que los encontraremos en la carpeta de material llamado ProyectoFinal Sistema de combate estarán dentro de las carpetas de Managers y Utils
Si abrimos el script de CombatUnitSO nos encontramos con las siguientes líneas de código:
Es basicamente nuestro scriptable object(objeto programable) sobre el que trabajaremos el enemigo y el player para contener los datos de los mismos. Tiene el nombre de la unidad en si:
Que la mostraremos en el HUD
Tenemos luego otra variable llamada baseHP, hp son los health point que son los puntos de vida que tiene nuestro player. Esta variable será la base sobre la que nuestro jugador mejorará es decir los puntos iniciales de vida con los que empieza.
Cada nivel multiplicara el maxHP de los enemigos. Pero necesitamos resetearlo con el base cada vez que pasamos de nivel
El currentHP es el valor actual de la vida de nuestro player o del enemigo
Estas dos variables son temporales, la idea es que podamos añadir más poderes a nuestro juego. Ahora mismo le estamos asignando un poder de ataque y un poder de cura.
Y después el prefab, el propio scriptable object va tener el prefab del enemigo o del player. Cuando le pasemos este dato al CombatManager, este va a instanciarlo dentro de la escena
Luego tenemos la siguiente lógica dentro de este scriptable object que tiene que ver con el ataque que se hará tanto al player como al enemigo dentro del juego. La lógica está relacionada con la unidad de combate. Es atacar a otra unidad de combate:
Tomar algún daño, es decir ser dañado a traves de un mensaje de otra unidad de comabate
Curarte con algo de vida
Resetear tu HP, tu currentHP(tu HP actual) ponerlo al máximo
Ademas aquí le estamos diciendo que desactive el valor maximo de HP al valor base. Veremos más adelante como configurarlo.
Desarrollar un sistema de combate en Unity implica la implementación de mecánicas específicas para el combate, como la detección de colisiones, la gestión de la salud del jugador/enemigo, la animación y otros elementos relacionados:
1. Crear el Personaje/Enemigo:
1.1. Modelo 3D/2D: Importa o crea los modelos para tu personaje y enemigo.
2. Implementar la Salud:
2.1. Scripts de Salud:
- Crea un script para gestionar la salud (
HealthController
). - Controla la cantidad de salud y actualiza la interfaz de usuario (UI).
2.2. Colisiones:
- Usa colliders para detectar colisiones entre el jugador y los enemigos.
3. Controlar el Combate:
3.1. Scripts de Combate:
- Crea un script para gestionar las acciones de combate (
CombatController
). - Implementa métodos para atacar y recibir daño.
3.2. Animaciones:
- Asocia animaciones al combate.
- Utiliza el sistema de animación de Unity para cambiar entre estados de animación (atacar, recibir daño, etc.).
4. Input del Jugador:
4.1. Entrada de Teclado/Ratón:
- Implementa scripts para manejar la entrada del jugador (teclas, clics, etc.).
- Asigna acciones a los controles, como atacar, bloquear, etc.
5. Enemigos:
5.1. IA del Enemigo:
- Implementa una lógica simple para el comportamiento del enemigo (seguir al jugador, atacar, etc.).
- Utiliza la inteligencia artificial o patrones de diseño para gestionar la toma de decisiones del enemigo.
6. Interfaz de Usuario (UI):
6.1. Barra de Salud:
- Crea una barra de salud que refleje el estado actual del jugador/enemigo.
7. Sonido y Efectos Visuales:
7.1. Sonidos:
- Asocia efectos de sonido a las acciones de combate.
7.2. Partículas y Efectos Visuales:
- Agrega partículas y efectos visuales para realzar la experiencia de combate.
8. Optimización y Pulido:
8.1. Optimización:
- Optimiza el código para un rendimiento eficiente.
8.2. Pulido:
- Añade detalles adicionales, como transiciones suaves entre animaciones, retroalimentación háptica, etc.
9. Pruebas:
9.1. Pruebas de Jugabilidad:
- Realiza pruebas exhaustivas para garantizar un combate fluido y sin errores.