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.