Corrección de Bugs en Reaparición y Reinicio en Unity

Clase 23 de 53Curso de C# para Videojuegos

Resumen

Domina el reinicio del personaje en Unity con C#: corrige la resurrección, evita frames indeseados y limita el reinicio al estado de muerte. Verás cómo mover inicializaciones a StartGame, crear una transición en el Animator, usar Invoke con un pequeño retraso y ajustar el input con && y !=. Además, convertirás la kill zone en Prefab para montar niveles con rapidez.

¿Cómo corregir el reinicio y el estado del personaje en Unity?

Para evitar que el personaje reaparezca muerto, mueve la inicialización del estado al método de juego y revisa el grafo de animaciones. El error suele estar en el flujo del Animator: todas las animaciones acaban en muerte y no hay transición de retorno. Soluciona ambos puntos.

  • Mueve los flags de vivo y en suelo a StartGame.
  • Crea una transición de Death a Run condicionada por isAlive = true.
  • Desactiva Exit Time para que la transición sea inmediata.
  • Prueba con Play y verifica que el personaje resucita de pie.
public class Player : MonoBehaviour
{
    [SerializeField] private Animator animator;

    void Start()
    {
        StartGame();
    }

    public void StartGame()
    {
        // Estado inicial al reiniciar.
        animator.SetBool("stateAlive", true);
        animator.SetBool("stateOnTheGround", true);
        // Aquí puedes reubicar posición/velocidad si ya lo manejas en otro método.
    }
}

¿Cómo configurar la transición en el animator?

  • Desde el estado muerte crea una transición a correr (Run).
  • Condición: isAlive == true.
  • Elimina Exit Time para que no espere al final de la animación.

¿Qué es invoke y cómo evitar el frame muerto?

Si ves un frame donde el personaje “nace muerto”, retrasa la reposición. La técnica Invoke retrasa la llamada a un método con precisión en segundos. Un pequeño delay (0.1 s) basta y el usuario no lo percibe.

  • Crea un método RestartPosition para posición y velocidad de reaparición.
  • Invoca con Invoke y un retraso: 0.1 s.
  • Ajusta fino si hace falta: 0.15 s o 0.2 s.
public void StartGame()
{
    animator.SetBool("stateAlive", true);
    animator.SetBool("stateOnTheGround", true);
    // Retrasa la recolocación para evitar el frame muerto.
    Invoke("RestartPosition", 0.1f);
}

private void RestartPosition()
{
    // Reposiciona y resetea velocidad aquí.
}

¿Qué mejora la experiencia al reiniciar?

  • Elimina parpadeos y estados inconsistentes.
  • Mantiene coherente el grafo de animaciones.
  • Reduce la fricción visual sin añadir complejidad.

¿Cómo limitar el reinicio al estado de muerte con el game manager?

Evita reinicios en cualquier momento. Usa doble ampersand (&&) para combinar condiciones y la negación “!=” para comprobar que el estado actual es diferente a “partida”. Solo entonces procesa el reinicio con Submit.

  • Condición con botón Submit y estado actual distinto de jugando.
  • Doble ampersand: ambas condiciones deben cumplirse a la vez.
  • Negación en C#: != significa “diferente”.
void Update()
{
    if (Input.GetButtonDown("Submit") && currentGameState != GameState.Playing)
    {
        StartGame(); // Reinicia solo cuando no estás en partida (por ejemplo, tras morir).
    }
}

¿Cómo preparar la kill zone como prefab y ajustar el nivel?

  • Arrastra la kill zone a la carpeta de Prefabs para reutilizarla.
  • Colócala a la altura deseada: invisible pero efectiva.
  • Usa Gizmos para visualizar su volumen y ajustar con precisión.
  • Prueba cambios siempre con Play y verifica que al tocar la zona el personaje muere.

¿Te gustaría que revisemos tu flujo de reinicio o tu configuración del Animator? Cuéntame en comentarios en qué parte necesitas más claridad y lo vemos paso a paso.