Unreal Engine: Creación de un Sistema de Daño y Puntos de Golpe (HP) con Blueprint
Este tutorial te guiará paso a paso en la implementación de un sistema de daño y puntos de golpe (HP) completamente funcional en Unreal Engine 5. Cubrirá desde la definición de atributos básicos hasta la aplicación de daño, curación y la gestión de la muerte del personaje, todo ello utilizando el sistema de Blueprints visual de Unreal.
🚀 Introducción al Sistema de Daño y HP en Unreal Engine
En el mundo del desarrollo de videojuegos, un sistema de daño y puntos de golpe (HP) es fundamental. Permite que los personajes (jugadores y enemigos) interactúen de forma significativa, añadiendo desafío, estrategia y realismo al juego. Sin un sistema así, los enfrentamientos serían meramente cosméticos o se basarían en mecánicas binarias de "golpear y destruir".
Este tutorial se centrará en construir un sistema flexible y modular utilizando Blueprints en Unreal Engine 5, lo que lo hace accesible incluso para aquellos con poca o ninguna experiencia en programación. Exploraremos cómo definir atributos, aplicar y recibir daño, gestionar la curación y, finalmente, cómo un personaje reacciona cuando sus puntos de golpe llegan a cero.
¿Por qué Blueprint? 🤔
Blueprint es el sistema de scripting visual de Unreal Engine. Es increíblemente potente y permite a los diseñadores y programadores prototipar y construir funcionalidades complejas sin escribir una sola línea de código. Para un sistema de daño y HP, Blueprint ofrece:
- Accesibilidad: Fácil de entender y visualizar el flujo lógico.
- Rapidez de Prototipado: Permite iterar rápidamente sobre mecánicas de juego.
- Modularidad: Facilita la creación de componentes reutilizables.
🛠️ Configuración Inicial: Atributos Básicos
El primer paso es definir los atributos esenciales que controlarán la salud de nuestros personajes. Necesitamos al menos dos variables clave: la salud actual y la salud máxima.
Creando un Componente de Salud 📦
Para hacer nuestro sistema reutilizable, crearemos un Actor Component llamado HealthComponent. De esta manera, cualquier Actor en nuestro juego (personajes, enemigos, objetos destructibles) podrá tener un sistema de salud simplemente añadiéndole este componente.
-
Crear Blueprint Componente:
- Haz clic derecho en el Content Browser.
- Selecciona
Blueprint Class. - Expande
All Classesy buscaActorComponent. - Nómbralo
BP_HealthComponent.
-
Variables en
BP_HealthComponent:- Abre
BP_HealthComponent. - Crea las siguientes variables:
CurrentHealth(Tipo:Float, Valor por defecto:100.0)MaxHealth(Tipo:Float, Valor por defecto:100.0)
💡 Consejo: Usa `Float` en lugar de `Integer` para la salud para permitir valores de daño fraccionarios, lo que añade más granularidad al sistema. - Abre
-
Hacer Variables Editables:
- Selecciona
CurrentHealthyMaxHealthen el panelDetails. - Marca el ojo al lado de cada variable para hacerlas
Editable(aparecerán en el panelDetailsde cualquier Actor que use este componente). - Marca
ReplicatedparaCurrentHealthsi planeas un juego multijugador. Esto asegura que la salud se sincronice entre clientes y el servidor.
- Selecciona
💖 Implementando Lógica de Daño y Curación
Ahora que tenemos los atributos, necesitamos funciones para modificarlos. Añadiremos funciones para aplicar daño, curar y un evento para manejar la muerte.
Función: ApplyDamage 💥
Esta función será la encargada de reducir la salud del personaje.
-
Crear Función:
- En
BP_HealthComponent, en el panelMy Blueprint, haz clic en+ Function. - Nómbrala
ApplyDamage.
- En
-
Parámetros de la Función:
- Haz clic en la función
ApplyDamage. - En el panel
Details, haz clic en+ New ParameterparaInputs. - Nombra el parámetro
DamageAmount(Tipo:Float).
- Haz clic en la función
-
Lógica de la Función:
- Arrastra un
Get CurrentHealthy unGet DamageAmount. - Usa un nodo
Float - Floatpara restarDamageAmountdeCurrentHealth. - Usa un nodo
FMath::Maxpara asegurar que la salud nunca baje de cero (es decir, el mínimo será0.0f). Conecta el resultado delFloat - FloatalAy0.0alB. - Arrastra un
Set CurrentHealthy conecta el resultado deFMath::Maxal input deCurrentHealth. - Después de
Set CurrentHealth, añade una rama (Branch) para comprobar siCurrentHealthes igual a0.0. - Si es
True, el personaje ha muerto. Llamaremos a un evento.
- Arrastra un
Evento: OnDeath 💀
Necesitamos una forma de notificar a otros Blueprints cuando este personaje muere. Usaremos un Event Dispatcher.
-
Crear Event Dispatcher:
- En
BP_HealthComponent, en el panelMy Blueprint, bajoEvent Dispatchers, haz clic en+. - Nómbralo
OnDeath.
- En
-
Llamar al Evento:
- En la función
ApplyDamage, después delSet CurrentHealthy la rama que comprueba siCurrentHealthes0.0f. - Si la condición de la rama es
True, arrastra desde el pinTruey buscaCall OnDeath.
- En la función
Función: Heal ❤️🩹
Esta función aumentará la salud del personaje, sin superar el MaxHealth.
-
Crear Función:
- En
BP_HealthComponent, crea una nueva función llamadaHeal.
- En
-
Parámetros:
- Añade un parámetro de input llamado
HealAmount(Tipo:Float).
- Añade un parámetro de input llamado
-
Lógica:
- Arrastra un
Get CurrentHealthy unGet HealAmount. - Usa un nodo
Float + Floatpara sumarHealAmountaCurrentHealth. - Usa un nodo
FMath::Minpara asegurar que la salud nunca supereMaxHealth. Conecta el resultado deFloat + FloatalAyGet MaxHealthalB. - Arrastra un
Set CurrentHealthy conecta el resultado deFMath::Min.
- Arrastra un
🖥️ Integración con un Personaje (Player/Enemy)
Ahora que tenemos el BP_HealthComponent, vamos a añadirlo a un personaje y hacer que interactúe con él.
Añadir el Componente al Personaje 🚶
Para este ejemplo, usaremos el ThirdPersonCharacter por defecto de Unreal Engine.
-
Abrir Personaje Blueprint:
- Abre
BP_ThirdPersonCharacter(o tu Blueprint de personaje/enemigo). - En la pestaña
Components, haz clic en+ Add. - Busca
BP_HealthComponenty selecciónalo. Puedes renombrarlo aHealthComppara mayor brevedad.
- Abre
-
Configurar Valores Iniciales:
- Con
HealthCompseleccionado, en el panelDetails, verásCurrentHealthyMaxHealth. - Puedes ajustarlos aquí si no quieres los valores por defecto.
- Con
Suscribirse al Evento OnDeath ☠️
Cuando el personaje muera, queremos que haga algo (por ejemplo, reproducir una animación, destruir el actor, mostrar una pantalla de game over).
- En
BP_ThirdPersonCharacter, en elEvent Graph:- Selecciona
HealthCompen la pestañaComponents. - Haz clic derecho en un espacio vacío del
Event Graph. - Busca
Assign OnDeath (HealthComp)y haz clic. - Esto creará un nodo
Assign OnDeathy unCustom Event(normalmente llamadoOnDeath). - Desde este
Custom Event, puedes añadir la lógica de muerte. Por ejemplo:Print String(mensaje "¡El personaje ha muerto!").Disable Input(para el jugador).Destroy Actor(si es un enemigo).
- Selecciona
Recibir Daño desde el Exterior 🥊
Un personaje necesita una forma de recibir daño de otras fuentes (proyectiles, ataques cuerpo a cuerpo, caídas).
-
Usando
Any DamageEvent:- En
BP_ThirdPersonCharacter, haz clic derecho en elEvent Graphy buscaEvent AnyDamage. - Este evento se dispara cuando el Actor recibe daño a través de la función
ApplyDamagede Unreal (generalmente llamada por proyectiles, colisiones, etc.). - Desde el pin
DamagedelEvent AnyDamage:- Arrastra desde
HealthCompy buscaApplyDamage. - Conecta el pin
DamagedelEvent AnyDamagealDamageAmountdelApplyDamagedelHealthComp.
- Arrastra desde
🔥 Importante: Para que `Event AnyDamage` funcione, la fuente de daño debe llamar a la función `ApplyDamage` (por ejemplo, `K2_ApplyDamage` en C++ o el nodo `Apply Damage` de Blueprint). - En
📊 Interfaz de Usuario (UI) para la Salud
Mostrar la salud actual al jugador es crucial. Usaremos UMG (Unreal Motion Graphics) para crear una barra de salud.
Creando la Barra de Salud 💚
-
Crear Widget Blueprint:
- Haz clic derecho en el Content Browser.
- Selecciona
User Interface->Widget Blueprint. - Elige
User Widgety nómbraloWBP_HealthBar.
-
Diseño del Widget:
- Abre
WBP_HealthBar. - Arrastra un
Progress Bardesde la paleta deUser CreatedalCanvas Panel. - Configura su
Anchorsa la esquina superior izquierda,Position X/YySize X/Ypara que tenga un tamaño y posición adecuados. - Puedes cambiar el
Fill Color and Opacitya verde.
- Abre
-
Binding de la Barra de Progreso:
- Con el
Progress Barseleccionado, en el panelDetails, busca la propiedadPercent. - Haz clic en el botón
Bindy seleccionaCreate Binding. - Esto creará una nueva función en el
Graphdel widget (GetPercent_XXXX).
- Con el
-
Lógica del Binding:
- En esta nueva función, necesitamos obtener la salud del personaje.
- Primero, necesitamos una referencia a nuestro personaje. En el
Event ConstructdelWBP_HealthBar:- Usa
Get Player Character. Cast To BP_ThirdPersonCharacter.- Promueve el resultado a una variable (
PlayerRef).
- Usa
- Luego, en la función
GetPercent_XXXX:- Arrastra
PlayerRef. - Desde
PlayerRef, arrastra y buscaGet HealthComp. - Desde
HealthComp, arrastra y buscaGet CurrentHealthyGet MaxHealth. - Divide
CurrentHealthporMaxHealth(Float / Float). - Conecta el resultado al
Return Valuedel nodoReturn.
- Arrastra
Mostrar la Barra de Salud en el Juego 🎮
-
En
BP_ThirdPersonCharacter(o tuPlayerController/HUDBlueprint):- En el
Event BeginPlay:Create Widget(Clase:WBP_HealthBar, Owning Player:Get Player Controller).- Promueve el resultado a una variable (
HealthBarRef). - Desde
HealthBarRef, arrastra y buscaAdd To Viewport.
💡 Consejo: Considera crear el HUD en el `PlayerController` o un `HUD` Blueprint específico para una mejor organización, especialmente en juegos complejos. - En el
✨ Eventos Personalizados y Comunicación
Para un sistema de salud más robusto, es útil tener eventos que se disparen cuando la salud cambia, no solo cuando el personaje muere. Esto permite que otros sistemas reaccionen a estos cambios (por ejemplo, efectos visuales de sangre, sonidos de dolor, actualizaciones de la UI).
Event Dispatcher: OnHealthChanged 🔄
-
Crear Event Dispatcher:
- En
BP_HealthComponent, en el panelMy Blueprint, bajoEvent Dispatchers, haz clic en+. - Nómbralo
OnHealthChanged.
- En
-
Parámetros del Dispatcher:
- Añade un parámetro
NewHealth(Tipo:Float) yHealthDelta(Tipo:Float).HealthDeltapuede indicar cuánto cambió la salud y si fue positivo o negativo.
- Añade un parámetro
-
Llamar al Evento en
ApplyDamageyHeal:- En
ApplyDamage, después delSet CurrentHealth(pero antes de la rama de muerte):- Calcula
HealthDelta(OldHealth - NewHealth). - Llama
Call OnHealthChanged, pasandoCurrentHealthcomoNewHealthy elHealthDeltacalculado.
- Calcula
- En
Heal, después delSet CurrentHealth:- Calcula
HealthDelta(NewHealth - OldHealth). - Llama
Call OnHealthChanged, pasandoCurrentHealthcomoNewHealthy elHealthDeltacalculado.
- Calcula
- En
Suscribirse a OnHealthChanged (Ejemplo: HUD) 🔔
Aunque el binding de la barra de salud funciona, usar OnHealthChanged puede ser más eficiente, ya que la UI solo se actualiza cuando la salud realmente cambia, en lugar de cada frame.
-
Modificar
WBP_HealthBar:- En el
Event GraphdelWBP_HealthBar(después de obtenerPlayerRefenEvent Construct):- Desde
PlayerRef,Get HealthComp. - Desde
HealthComp, buscaAssign OnHealthChanged. - Esto creará un
Custom Event(por ejemplo,OnHealthChanged_Event) con los parámetrosNewHealthyHealthDelta. - Dentro de este evento, puedes actualizar manualmente el
Percentde tuProgress BarusandoSet Percent (Progress Bar). Calcula el porcentaje comoNewHealth / MaxHealth.
- Desde
📌 Nota: Puedes usar tanto el binding como el evento, pero el evento ofrece más control para animaciones o efectos específicos cuando la salud cambia. - En el
🎯 Pruebas y Depuración
Un sistema robusto requiere pruebas exhaustivas. Aquí hay algunas ideas para verificar que todo funciona correctamente.
Simulación de Daño y Curación 🧪
-
Botones de Prueba en la UI:
- Crea un
WBP_Debugsimple con dos botones: "Aplicar Daño" y "Curar". - Al hacer clic en "Aplicar Daño", llama a
ApplyDamageen tu personaje con un valor fijo. - Al hacer clic en "Curar", llama a
Heal. - Añade este
WBP_Debuga la pantalla como hiciste conWBP_HealthBar.
- Crea un
-
Volúmenes de Daño:
- Crea un
Blueprint Classbasado enActor. - Añade un
Box Collisiona este Actor. - En el
Event Graph, enEvent Overlap(On Component Begin Overlap),Cast To BP_ThirdPersonCharacter. - Desde el personaje,
Get HealthCompy llama aApplyDamagecada segundo, por ejemplo, usando unTimer by Event.
- Crea un
-
Comandos de Consola:
- Puedes crear
Custom Eventsen tu personaje que simulen daño o curación y vincularlos a comandos de consola para pruebas rápidas. - Por ejemplo, en
BP_ThirdPersonCharacter, crea unCustom EventllamadoDEBUG_TakeDamage. - Desde este evento, llama a
HealthComp->ApplyDamage(20.0f). - En los detalles del
Custom Event, marcaCall In EditoryExpose To Cinematics. También puedes hacer clic derecho en el evento y seleccionarAdd to Console Command(esto requiere que el juego esté en modoPlay In EditoroStandalone).
- Puedes crear
Consideraciones Avanzadas 🌌
- Tipos de Daño: Implementar una
DamageTypeenumera y/o clases para aplicar diferentes efectos según el tipo de daño (fuego, veneno, físico). - Resistencias/Vulnerabilidades: Añadir un
DataTableoStructpara definir cómo reacciona un personaje a diferentes tipos de daño. - Invulnerabilidad Temporal: Después de recibir daño, un personaje puede ser invulnerable por un corto período (
TimerenHealthComponent). - Pooling de Efectos: En lugar de
Destroy Actorpara la muerte, usar un sistema deObject Poolingpara reutilizar los cuerpos de los enemigos o efectos. - Guardar/Cargar: Asegurarse de que
CurrentHealthse guarde y cargue correctamente en tu sistema de guardado de juego.
✅ Conclusión
Has llegado al final de este tutorial sobre cómo crear un sistema de daño y puntos de golpe en Unreal Engine usando Blueprints. Hemos cubierto desde la configuración inicial de atributos hasta la integración con la interfaz de usuario y consideraciones avanzadas. Este sistema es una base sólida para cualquier juego y se puede expandir para adaptarse a mecánicas más complejas.
Recuerda que la práctica es clave. Experimenta con las configuraciones, añade nuevos efectos y personaliza el sistema para que se adapte perfectamente a la visión de tu juego. ¡Ahora tienes las herramientas para hacer que tus personajes sean vulnerables y puedan luchar por su supervivencia!
¡Felicidades por construir un sistema tan crucial para tu juego! Sigue explorando las posibilidades que Unreal Engine te ofrece.
Tutoriales relacionados
- Unreal Engine: Creación de un Sistema de Diálogos Ramificados con Data Tables y Blueprintintermediate15 min
- Unreal Engine: Creando Interactividad con el Sistema de Interacciones Basado en Componentesintermediate15 min
- Dominando el Sistema de Animación en Unreal Engine 5: Desde Retargeting hasta Blend Spacesintermediate20 min
- Unreal Engine: Implementando IA Básica con Behaviour Trees y EQS para Enemigosintermediate15 min
- Unreal Engine: Creando un Sistema de Inventario Dinámico con UMG y C++intermediate25 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!