Configura un sistema de daño claro y efectivo en Unity con C#: cuando el enemigo colisiona con el protagonista, lo desactiva al instante y lo reactiva tras un temporizador. Esta lógica directa valida el ataque del enemigo y sienta la base para añadir vida, defensa y otros sistemas más adelante. Todo se resuelve con un script en el prefab del enemigo, usando colisión física, temporizador y activación/ desactivación del GameObject.
¿Qué objetivo cumple el daño por colisión en Unity?
Implementar una colisión física entre enemigo y jugador que cause una “muerte” inmediata y un respawn automático tras unos segundos. Es una solución drástica, pero ideal para verificar que el enemigo ataca correctamente antes de introducir mecánicas complejas.
Colisión física con OnCollisionEnter: no se usa trigger. Se detecta contacto real.
Filtro por jugador: comprobación por tag "Player" o por nombre para asegurar que el impacto es con el protagonista.
Desactivar y reactivar: el jugador se oculta con SetActive(false) en la colisión y se reactiva con SetActive(true) cuando termina el conteo.
Temporizador de respawn: contador que descuenta con Time.deltaTime hasta llegar a cero.
Asignación en el prefab: el script se agrega al prefab del enemigo y se hereda en todas sus instancias.
¿Cómo programar el script DamagePlayer en C#?
La lógica se divide en dos partes: detección de la colisión y gestión del temporizador en Update. Se guarda una referencia segura al jugador justo cuando ocurre el choque para reactivarlo después.
¿Qué variables controlan el respawn?
timeToRevivePlayer: segundos hasta reactivar al jugador. No debe ser cero para evitar respawn instantáneo.
timeRevivalCounter: contador interno que disminuye cada frame.
playerReviving: indica si el jugador está en proceso de reaparición.
thePlayer: referencia al GameObject del jugador que colisionó.
¿Cómo detectar la colisión física con el Player?
Usar OnCollisionEnter(Collision collision) en lugar de trigger.
Filtrar por tag "Player" para ejecutar el daño solo al protagonista.
Desactivar visualmente al jugador con SetActive(false) y arrancar el temporizador.
Si playerReviving es true, se descuenta Time.deltaTime del contador.
Al llegar a cero, se marca playerReviving = false y se reactiva thePlayer con SetActive(true).
¿Cómo probar y ajustar desde el prefab del enemigo?
Agrega el script al prefab del enemigo para que todas sus instancias hereden el comportamiento. Ajusta los valores desde el Inspector sin repetir trabajo en cada objeto de escena.
Asignar el script al prefab del enemigo.
Configurar timeToRevivePlayer a 2 segundos como punto de partida.
Evitar el valor 0 para no reactivar de inmediato.
Verificar en la jerarquía: el Player se desactiva (gris) tras el impacto y vuelve a activarse al finalizar el temporizador.
Probar con las flechas de movimiento: mientras está desactivado, el personaje no responde porque el GameObject está inactivo.
¿Te gustaría que el daño active un sistema de vidas o defensa antes de desactivar al jugador? Cuéntame qué mecánica quieres priorizar y lo diseñamos paso a paso.
Por más simple que parezca, se le puede sacar mucho provecho a este Script, solo hay que ser un poco creativos.😄
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassDamagePlayer:MonoBehaviour{/**** Variables. ****///El tiempo que se va a tomar para revivir al jugador.public float timeToRevivePlayer;//Contador interno de la clase.private float timeToRevivalCounter;//Si el jugador esta en proceso de ser revivido.private bool playerReviving;/**** Los Componentes. ****/privateGameObject thePlayer;/**** Los Metudus. ****/// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){//Proceso de revivir.if(playerReviving){//Restamos la cantidad de tiempo que le asignamos para revivir el 'player'. timeToRevivalCounter -=Time.deltaTime;//Cuando el contador llegue a cero.if(timeToRevivalCounter <0){//Dejara de el proceso de espera de revivir. playerReviving =false;//Y activara el personaje revivido. thePlayer.SetActive(true);}}}//Detectamos la colision del personaje con el enemigo.privatevoidOnCollisionEnter2D(Collision2D collision){//Comprobamos si el objeto que colisiono con el enemigo es el 'Player'.if(collision.gameObject.tag.Equals("Player")){//Desactivamos al 'Player'. collision.gameObject.SetActive(false);//Activamos la resurreción del 'player'. playerReviving =true;//Le asignamos el tiempo que se tardara en revivir el 'Player'. timeToRevivalCounter = timeToRevivePlayer;//Asignamos el GameObject del 'Player' para que tenga la refencia del objeto en cuestion que va a desactivar cuando los reviva. thePlayer = collision.gameObject;}}}
En lugar de "collision.gameObject.tag.Equals("Player")" usad "collision.gameObject.CompareTag("Player")" no es importante, pero la segunda forma tiene mucho mejor performance
Y que tal solo collision.gameObject.Tag ???
@gabrielpinzn Esta mucho mas optimizado el CompareTag a nivel interno del motor
Yo le agregue vida al player y tiempo de invulnerabilidad 😃
Esta forma de contabilizar la duracion de cierta accion es muy util, a veces nos centramos o pensamos que todo manejo del tiempo en Unity se debe realizar con corutinas y nos complicamos sin necesidad, lo digo por experiencia.