🎮 UnityDocs

Checkpoint y respawn

Un sistema de puntos de control: al tocar un checkpoint se guarda la posición de reaparición, y al morir el jugador reaparece ahí. Con un gestor central y triggers, listo para ampliar a guardado.

🍳 RecetaIntermedio✅ RevisadoUnity 6.0 LTSActualizado 2026-07-15
DificultadConceptual Código Matemáticas
Tiempo📖 Lectura 6 min · ⌨️ Práctica 20 min

El objetivo#

Repartir puntos de control por el nivel. Al tocar uno, se convierte en el lugar de reaparición. Cuando el jugador muere, vuelve al último checkpoint activado.

Paso 1 — El gestor de checkpoints#

Un Singleton sencillo guarda la posición actual de respawn:

C#
using UnityEngine;

public class GestorCheckpoints : MonoBehaviour
{
    public static GestorCheckpoints Instance { get; private set; }

    public Vector3 PosicionRespawn { get; private set; }

    void Awake()
    {
        if (Instance != null && Instance != this) { Destroy(gameObject); return; }
        Instance = this;
    }

    public void FijarCheckpoint(Vector3 posicion)
    {
        PosicionRespawn = posicion;
        Debug.Log("Checkpoint guardado en " + posicion);
    }
}

Paso 2 — El checkpoint (un trigger)#

C#
using UnityEngine;

[RequireComponent(typeof(Collider2D))]
public class Checkpoint : MonoBehaviour
{
    private bool activado = false;

    void OnTriggerEnter2D(Collider2D other)
    {
        if (activado || !other.CompareTag("Player")) return;

        activado = true;
        GestorCheckpoints.Instance.FijarCheckpoint(transform.position);
        // Feedback: cambia el sprite, suena algo, enciende una hoguera...
    }
}
Marca `activado` para no repetir

El activado evita reprocesar el mismo checkpoint cada vez que lo pisas. Si quieres que se pueda "reactivar" (por diseño), quítalo; para lo habitual, una vez basta.

Paso 3 — Reaparecer al morir#

Conéctalo con el sistema de vida: al morir, en vez de destruir al jugador, lo mueves al respawn y le restauras la vida.

C#
using UnityEngine;

public class Jugador : MonoBehaviour
{
    [SerializeField] private Salud salud;

    void OnEnable()  => salud.AlMorir += Reaparecer;
    void OnDisable() => salud.AlMorir -= Reaparecer;

    void Reaparecer()
    {
        transform.position = GestorCheckpoints.Instance.PosicionRespawn;
        // Aquí también restaurarías vida, resetearías enemigos, etc.
        Debug.Log("Reaparecido en el checkpoint");
    }
}
Si mueves un Rigidbody, resetea su velocidad

Al teletransportar al jugador al respawn, si tiene Rigidbody pon su linearVelocity a cero. Si no, llega al checkpoint con la velocidad de la caída mortal y sale disparado.

Ampliaciones#

  • Persistencia entre sesiones: guarda el índice/posición del checkpoint con JSON para continuar la partida tras cerrar el juego.
  • Estado del mundo: un respawn "de verdad" suele resetear enemigos, plataformas y objetos recogidos a su estado en ese checkpoint.
  • Feedback: hogueras que se encienden (estilo Souls), un sonido y un mensaje "Progreso guardado".
  • Checkpoint inicial: fija uno en el punto de inicio en Start para que el primer respawn funcione aunque no hayas tocado ninguno.

Errores frecuentes#

  • Olvidar fijar un checkpoint inicial y que el primer respawn mande al jugador a (0,0,0).
  • No resetear la velocidad del Rigidbody al reaparecer.
  • Destruir al jugador al morir en vez de reposicionarlo (pierdes referencias).
  • Reprocesar el mismo checkpoint una y otra vez (usa la bandera activado).

Resumen#

Un Singleton GestorCheckpoints guarda la posición de respawn; cada checkpoint es un trigger que la fija al pisarlo. Al morir (evento del sistema de vida), reposicionas al jugador ahí (reseteando la velocidad del Rigidbody). Fija un checkpoint inicial y, si quieres continuar entre sesiones, persístelo con JSON.

Fuentes y para profundizar