tutoriales.com

Unreal Engine: Creación de un Sistema de Combate Cuerpo a Cuerpo Avanzado con Anim Montages y Notifies

En este tutorial completo aprenderás a diseñar e implementar un sistema de combate cuerpo a cuerpo robusto en Unreal Engine 5. Descubrirás cómo sincronizar Anim Montages con notificaciones personalizadas para activar daño, gestionar combos fluidos y aplicar efectos visuales en el momento exacto.

Avanzado12 min de lectura10 views
Reportar error

Introducción al Sistema de Combate Cuerpo a Cuerpo

El combate cuerpo a cuerpo es uno de los pilares fundamentales en una vasta cantidad de videojuegos modernos, desde los RPG de acción hasta los juegos de lucha tácticos. Diseñar un sistema que se sienta responsivo, fluido y satisfactorio requiere una sincronización milimétrica entre las animaciones de los personajes, la lógica de juego y los cálculos de impacto espacial.

En este tutorial avanzado, implementaremos un sistema de combate basado en Anim Montages, Anim Notifies personalizados y Box/Line Traces para la detección de impactos. Olvídate de los sistemas rígidos; aquí construiremos una arquitectura modular que te permitirá añadir combos encadenados y diferentes tipos de ataques con facilidad.

💡 Consejo: Este tutorial asume que tienes conocimientos básicos de Blueprints en Unreal Engine 5, como la creación de variables, funciones y el manejo de interfaces.

1. Preparación de los Recursos y del Personaje

Antes de escribir código o configurar Blueprints, necesitamos asegurarnos de que nuestro personaje cuente con las animaciones necesarias y los sockets correctos en su malla esquelética.

Configuración de Sockets para las Armas o Extremidades

Para que el motor sepa exactamente de dónde a dónde calcular el daño (por ejemplo, desde la empuñadura hasta la punta de una espada, o desde el nudillo hasta el codo en un ataque de puño), debemos añadir sockets dentro del editor de esqueleto.

  1. Abre tu Skeleton Asset principal.
  2. Busca el hueso correspondiente al arma o a la mano (por ejemplo, hand_r o un socket específico para el arma como Weapon_Socket).
  3. Haz clic derecho y selecciona Add Socket.
  4. Nómbralo TraceStart y ajusta su posición en la base del arma/mano. Añade un segundo socket llamado TraceEnd en la punta.
Esquema de Sockets de Colisión Hombro Malla Brazo Derecho Malla de Espada Socket TraceStart (Base de la espada) Socket TraceEnd (Punta de la espada) LINE TRACE (Detección de Daño)

2. Creación del Sistema de Combate Base (Anim Montages y Combos)

El corazón de un buen sistema de combate radica en la gestión de los estados de ataque. Queremos que el jugador pueda presionar el botón de ataque repetidamente para ejecutar una cadena de golpes (Combo).

Creación de la Estructura de Datos para Ataques

Para mantener nuestro código limpio, utilizaremos una estructura (Struct) que contenga la información de cada ataque individual dentro de la cadena de combos:

  • AnimMontage: La animación que se reproducirá.
  • DamageAmount: El daño base infligido por este golpe.
  • StaminaCost: El coste de energía o estamina para realizar el ataque.
  • PlayRate: La velocidad de reproducción de la animación.

Lógica de Entrada (Input) y Ventanas de Combo

Dentro de tu Character Blueprint, crearemos una variable entera llamada ComboCounter y un booleano llamado CanTransitionToNextCombo.

  1. Cuando el jugador presiona la tecla de ataque, verificamos si ya estamos atacando.
  2. Si no estamos atacando, iniciamos el primer golpe (ComboCounter = 1) y reproducimos el Anim Montage correspondiente.
  3. Si ya estamos atacando, verificamos si el booleano CanTransitionToNextCombo está activo. Si lo está, incrementamos ComboCounter en 1 y preparamos el siguiente montaje para reproducirse en cuanto termine el actual.
📌 Nota: Las ventanas de combo se controlan típicamente mediante Anim Notifies que activan el booleano solo durante los últimos fotogramas recuperables de la animación de ataque.

3. Implementación de Anim Notifies Personalizados

Los Anim Notifies nos permiten disparar eventos lógicos directamente desde la línea de tiempo de la animación. Esto garantiza una precisión perfecta entre lo que ve el jugador y lo que ocurre en el juego.

Creando el Notify de Ventana de Daño

  1. Haz clic derecho en el explorador de contenido -> Blueprint Class -> Busca AnimNotify y nóbralo AN_EnableHitBox.
  2. Sobrescribe la función Received_Notify.
  3. Dentro de esta función, obtén el Mesh Component al que pertenece la animación, haz un Cast a tu personaje jugable y llama a una función personalizada llamada ActivateMeleeTrace(true).

Repite el proceso creando otro Notify llamado AN_DisableHitBox que llame a ActivateMeleeTrace(false).

Línea de Tiempo: Anim Montage HITBOX ACTIVA (DAÑO) AN_EnableHitBox AN_DisableHitBox Inicio Montage Fin Montage Progresión de la Animación (Frames/Tiempo)

4. Detección de Impactos con Line / Box Trace

Cuando ActivateMeleeTrace(true) es llamado, nuestro personaje debe empezar a buscar objetivos de manera continua (cada Tick o mediante un Timer) entre el socket TraceStart y TraceEnd que configuramos anteriormente.

Lógica del Trace

  • Obtenemos la ubicación mundial del socket TraceStart.
  • Obtenemos la ubicación mundial del socket TraceEnd.
  • Ejecutamos un LineTraceByChannel (o BoxTraceByChannel para un área de impacto más generosa).
  • Filtramos los actores golpeados para evitar golpear al mismo enemigo múltiples veces en un solo swing utilizando un array temporal de enemigos impactados (HitActorsArray).
// Ejemplo conceptual de la lógica ejecutada en C++ o traducida a nodos de Blueprint:
FVector StartLocation = GetMesh()->GetSocketLocation(FName("TraceStart"));
FVector EndLocation = GetMesh()->GetSocketLocation(FName("TraceEnd"));

TArray<FHitResult> HitResults;
// Ejecución del BoxTrace...
⚠️ Advertencia: Asegúrate de limpiar el array `HitActorsArray` al inicio de cada nuevo Anim Montage de ataque para permitir que el jugador vuelva a golpear al mismo enemigo en un golpe posterior del combo.

5. Aplicación de Daño y Reacciones al Impacto (Hit Reactions)

Una vez que el Trace detecta un enemigo válido, debemos aplicar daño y forzar una animación de reacción.

Uso de Gameplay Interfaces para el Daño

En lugar de hacer un Cast directo a cada tipo de enemigo (lo que genera acoplamiento de código no deseado), utilizaremos una interfaz llamada BPI_Damageable.

  1. Crea una Blueprint Interface llamada BPI_Damageable con una función ReceiveDamage(Float Damage, FVector HitLocation, AActor* DamageCauser).
  2. Implementa esta interfaz en tu Blueprint de Enemigo.
  3. Cuando el LineTrace detecte un actor que implemente BPI_Damageable, simplemente ejecuta la función de la interfaz.

Tabla de Reacciones de Combate

Tipo de AtaqueDaño BaseReacción del EnemigoEmpuje (Knockback)
------------
Ataque Ligero 115.0Flinch Corto (Torso)Bajo
Ataque Ligero 220.0Flinch LateralModerado
------------
Ataque Pesado45.0Caída al Suelo (Ragdoll/Knockdown)Alto

6. Pulido, Efectos Visuales (VFX) y Sonidos (SFX)

Un sistema de combate no se siente real sin retroalimentación sensorial inmediata.

Spawn de Partículas y Sonidos en el Impacto

Cuando la interfaz ReceiveDamage procesa el golpe en el enemigo:

  1. Spawnéate un sistema de partículas (por ejemplo, chispas de metal o salpicadura de sangre) en la ubicación exacta del HitLocation devuelta por el Trace.
  2. Reproduce un sonido 2D o 3D de impacto (Play Sound at Location).
  3. Opcional: Aplica un Camera Shake sutil en el controlador del jugador para transmitir la fuerza del golpe.
💡 Consejo: Utiliza *Hit Stop* (congelar temporalmente el juego durante 0.05 segundos tanto en el atacante como en el receptor) para dar una sensación masiva y contundente a los ataques pesados.

Preguntas Frecuentes (FAQ)

¿Cómo evito que el jugador mueva el personaje libremente durante un ataque?Puedes utilizar nodos de *Disable Input* o configurar las animaciones con *Root Motion* habilitado, asegurando que el movimiento del personaje esté completamente dictado por la animación artística.
¿Es mejor usar Line Trace o Box Trace?Para armas delgadas como espadas o lanzas, un *BoxTrace* suele ser mucho más fiable ya que los *LineTraces* son extremadamente finos y pueden atravesar al enemigo si la animación es muy rápida.

Conclusión

¡Felicidades! Has implementado con éxito un sistema de combate cuerpo a cuerpo avanzado y modular en Unreal Engine 5. Este sistema te proporciona la base escalable necesaria para expandir tu juego con nuevas armas, habilidades especiales, bloqueos y esquivas.

Recuerda ajustar los tiempos de los Anim Notifies y los radios de los Traces mediante pruebas exhaustivas (playtesting) para encontrar el equilibrio perfecto de juice y jugabilidad que tu título necesita.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!