Programación de Daño en Videojuegos: Lógica de Armas y Magia
Clase 23 de 33 • Curso de VR con Unity
Contenido del curso
Creando nuestro mundo 3D en Unity
- 6

Crear terreno 3D en Unity con Standard Assets
08:42 min - 7

Creación de Escenarios en Unity: Terreno y Erosión Realista
10:19 min - 8

Texturización de terrenos en Unity: creación de entornos realistas
10:56 min - 9

Cómo pintar árboles en Unity para VR
06:54 min - 10

Añadir césped y efectos de viento en Unity 3D
06:57 min - 11

Configurar skybox de seis lados en Unity
06:53 min - 12

Integración de Armas y Escudo en Realidad Virtual con HTC Vive
12:09 min
El realismo del VR: Programando a nuestro personaje
- 13

Programación de Lógica de Armas en Realidad Virtual
10:22 min - 14

Mapeado de controles HTC Vive en Unity
10:08 min - 15

Controles VR: grip y gatillo en Unity
10:02 min - 16

Configuración de Bolas de Fuego en Unity para Realidad Virtual
09:21 min - 17

Disparo de bola de fuego en VR
10:11 min - 18

Corrección de bugs: recarga y audio en armas Unity
04:44 min - 19

Colliders y Rigidbody en el diseño de personajes y armas en Unity
08:25 min - 20

Sistema de vida reutilizable en Unity
05:23 min
El realismo del VR: Creación de HUD (Heads Up Display) y generando enemigos
- 21

HUD en VR: canvas anclado a cámara
08:50 min - 22

Configuración de Barras de Vida y Maná en Unity
05:54 min - 23

Programación de Daño en Videojuegos: Lógica de Armas y Magia
Viendo ahora - 24

Slider Unity: vida y maná en un script
08:00 min - 25

Cómo configurar un dragón enemigo en Unity
11:40 min - 26

Colliders y barras de vida para dragones
08:31 min - 27

Animaciones de Muerte y Desaparición de Enemigos en Unity
10:01 min - 28

Cómo crear oleadas de dragones con portal
11:24 min
El realismo del VR: Programando la IA de nuestro juego
Un sistema de daño sólido en Unity con C# requiere reglas claras: quién hace daño, a quién y cuánto, sin golpes a aliados ni a uno mismo. Aquí verás cómo organizarlo con enumerados, triggers y configuración de armas y magia, manteniendo un buen balance entre velocidad de ataque y daño.
¿Cómo estructurar el sistema de daño con enumerados?
Para diferenciar el daño del personaje y el del enemigo se usa un enumerado. DamageType permite separar lógicas y evitar daño entre entidades del mismo tipo. Además, tanto el script de vida como el de daño llevan una variable pública para indicar su tipo por defecto.
- DamageType define Player y Enemy.
- Health incluye el tipo de vida para saber a quién representa.
- Damage incluye el tipo de daño y la cantidad base (por ejemplo, 10).
Código base:
// Enumerado global
public enum DamageType { Player, Enemy }
// En Health
public DamageType type = DamageType.Enemy; // Configurable a Player en el Inspector.
// En Damage
public DamageType type = DamageType.Enemy; // Configurable a Player en armas y proyectiles.
public float damage = 10f; // Daño base por defecto.
¿Por qué usar la variable type en health y damage?
- Evita fuego amigo: si un enemigo choca con otro, no se dañan.
- Evita autodaño: el personaje no se hiere con su propia espada.
- Escala a más facciones: solo hay que añadir valores al enumerado.
¿Cómo aplicar daño con triggers y colliders en C#?
El daño se ejecuta con triggers. Al entrar en un collider configurado como isTrigger, OnTriggerEnter pregunta si el otro objeto tiene vida y, solo si es de otro tipo, resta puntos de vida. Así, una bola de fuego daña al enemigo cuando entra en su collider.
- Usa GetComponent
() para validar si el objetivo tiene vida. - Compara tipos con DamageType para decidir si aplicar daño.
- currentDamage permite ajustar el daño en tiempo real (por ejemplo, al usar escudo).
Ejemplo del flujo en el script de daño:
void OnTriggerEnter(Collider other)
{
var targetHealth = other.GetComponent<Health>();
if (targetHealth == null) return; // Sin vida, no hay daño.
if (targetHealth.type == this.type) return; // Mismo tipo: no daña.
float currentDamage = damage; // Copia para poder modificar.
var targetWeapons = other.GetComponent<Weapons>();
if (targetWeapons != null && targetWeapons.shieldActive)
{
currentDamage /= 5f; // Escudo activo: reduce daño.
}
targetHealth.healthPoints -= currentDamage; // Aplica daño.
}
¿Cómo evitar daño entre aliados o a uno mismo?
- Compara targetHealth.type con this.type antes de restar vida.
- Si son iguales: return y no se modifica la salud.
¿Cómo reducir el daño con escudo activo?
- Comprueba GetComponent
() y su bandera shieldActive. - Si está activo: divide currentDamage (por ejemplo, entre 5).
- Permite estrategias de defensa sin desactivar por completo el ataque.
¿Qué configurar en player, armas y prefabs para balancear daño?
Una buena configuración diferencia qué objeto hace daño, cuál recibe y cómo se balancea el juego entre rapidez y potencia.
- Player con vida.
- Añade el script Health al personaje.
- En type: selecciona Player.
-
Define puntos de vida, por ejemplo, 100.
-
Armas del personaje.
- El daño lo hace el arma, no el personaje.
- Añade el script Damage a la espada u otra arma.
- En type: selecciona Player.
-
Activa el isTrigger del collider del arma para que funcione OnTriggerEnter.
-
Escudo del personaje.
- No necesita script de daño.
- Puede no tener vida propia si no se requiere.
-
La reducción de daño se controla con shieldActive en el controlador de armas.
-
Proyectil de magia (bola de fuego) en prefab.
- Abre el prefab con Rigidbody, SphereCollider y AudioSource.
- Añade el script Damage y configúralo como Player.
-
Ajusta daño alto (por ejemplo, 100) para compensar su cadencia: una bala cada dos segundos.
-
Balance velocidad vs daño.
- Espada: daño bajo (10) pero ataques rápidos.
- Bola de fuego: daño alto (100) pero disparo lento.
- Evita que la rapidez destruya enemigos demasiado rápido sin apuntar ni planear.
¿Te gustaría compartir tu implementación de DamageType, OnTriggerEnter o el ajuste del escudo? Comenta tus dudas y mejoras.