Daniel Zaleta
Les comparto un poco de como va quedando mi proyecto. Agregue un efecto de Jump cuando muere.
!HeaderGif
Alexis Duque
Se ve padre
Alexis Duque
Que herramienta usaste para crear el gif?
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.
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?
¿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.
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?
¿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.
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?
¿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.
Daniel Zaleta
Les comparto un poco de como va quedando mi proyecto. Agregue un efecto de Jump cuando muere.
!HeaderGif
Alexis Duque
Se ve padre
Alexis Duque
Que herramienta usaste para crear el gif?
Yone Moreno Jiménez
También podemos lograr pasar los frames en los cuales el Player aún está con la animación de Die usando las corrutinas:
public void StartGame() { animator.SetBool(STATE_ALIVE, true); animator.SetBool(STATE_ON_THE_GROUND, false); StartCoroutine(ResetPositionAndVelocity()); } IEnumerator ResetPositionAndVelocity() { yield return new WaitForSeconds(0.3f); transform.position = startPosition; rigidBody.velocity = Vector2.zero; ```
Yusei Umehara
El nivel de modulación / organización del profesor es impresionante
Juan
Lo que yo hice para que la animacion de morir no apareciera quando le damos restart al juego fue en el animator, en la flecha de transition de la animacion de muerte para run, abajo de "Has exit time" dice "Settings" con una flechita, si le hacen click aparecen varias cosas. Yo le puse la Transition Duration en 0 e funciono sin tener que usar el metodo Invoke.
Santiago Sarmiento
Un metodo sencillo para deshacerse del pequeño frame en el que el personaje se ve muerto es reducir el tiempo de transición de las animaciones de "Die" y "Run" a 0, esto se pude hacer en el animator al darle click a la flechita de transición que une a las animaciones de "Die" y "Run" en la sección desplegable "Settings", aparecerá la opcion "Transition duration".
Gabriel Andrés Medina Aguilar
Gran consejo el que nos diste ! Gracias ! Me funcionó perfectamente.
Tomas Leonardo Amaya Ríos
Corrección invoke  { SceneManager.LoadScene(SceneManager.GetActiveScene().name); //esta en la documentación de unity lo de las escenas, hay otra que es con un canvas para programar un botón de reinicio }
y en el update coloque esta condición
if (Input.GetKeyDown(KeyCode.R)) { RestartGame(); }
aunque lo reinicia en cualquier momento no solo cuando muere.
Alfredo Esteban Acuña Nova
Profe mi propia solución que hice fue Hacer lo que hizo usted copiar y pegar y puse un anim.Play("Run"); y me vuelve a a iniciar la animación de caminar
Yone Moreno Jiménez
También podemos lograr pasar los frames en los cuales el Player aún está con la animación de Die usando las corrutinas:
public void StartGame() { animator.SetBool(STATE_ALIVE, true); animator.SetBool(STATE_ON_THE_GROUND, false); StartCoroutine(ResetPositionAndVelocity()); } IEnumerator ResetPositionAndVelocity() { yield return new WaitForSeconds(0.3f); transform.position = startPosition; rigidBody.velocity = Vector2.zero; ```
Luis Rodrigo Alvarez Herrera
Yo en mi caso en la animacion, solo jugue con los tiempso de salida y de entrada
Edson Rodríguez
Me estaba resultando algo complicado ya que mi personaje se mueve manualmente, pero ya voy comprendiendo detallitos simples q ayudan mucho.
Javier Hernan Santagiuliana Gomez
Excelente curso!!!!
Alexis Duque
Mi solución fue crear una nueva animación con los sprites de la muerte, pero en orden inverso y también con el sprite donde el personaje esta de frente, así lo que tengo al reiniciar, es el personaje levantándose de la muerte bien sonriente y volviendo a correr.
Luca Cristian Manea
continuando con los cambios que venia realizando lo solucione de esta manera
basicamente al llamar StartGame del player consulta desde que estado lo esta haciendo, si el mismo no es pause reiniciara la pocicion del player, anulara la velocidad y cambiara su estado a vivo, en caso contrario el estado es pause y simplemente continuara desde donde estaba
public void StartGame() { if (GameManager.shareInstance.currentState != GameState.pause) { this.anim.SetBool("isAlive", true); this.transform.position = startPosition; this.rb.velocity = Vector2.zero; } }
Ikal Esteban Fernández Galván
La line de código
this.rigidBody.velocity = Vector2.zero;
no hace falta porque unity tiene una función activada por defecto que hace que cada vez que te mmueves unity revisa pixel por pixel para ver si puedes pasar o no