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:
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)#
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...
}
}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.
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");
}
}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
Startpara 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.