Detección de Colisiones y Reinicio en Unity

Clase 23 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

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.
  • Variables clave: timeToRevivePlayer, timeRevivalCounter, playerReviving, thePlayer.
  • 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.
using UnityEngine;

public class DamagePlayer : MonoBehaviour
{
    public float timeToRevivePlayer = 2f;

    private float timeRevivalCounter;
    private bool playerReviving;
    private GameObject thePlayer;

    void Update()
    {
        if (playerReviving)
        {
            timeRevivalCounter -= Time.deltaTime;
            if (timeRevivalCounter <= 0f && thePlayer != null)
            {
                playerReviving = false;
                thePlayer.SetActive(true);
            }
        }
    }

    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            collision.gameObject.SetActive(false);
            playerReviving = true;
            timeRevivalCounter = timeToRevivePlayer;
            thePlayer = collision.gameObject;
        }
    }
}

¿Qué ocurre frame a frame en Update?

  • 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.