Menu
CoddyTech

Reiniciar el nivel

Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 18 de 60.

La forma más rápida de reiniciar un nivel es volver a cargarlo. SceneManager.GetActiveScene() devuelve la escena que está abierta ahora, y su name (o su buildIndex) es lo que recibe LoadScene. Este botón Restart de un panel de fin de partida llama a:

public void Restart()
{
    SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}

Unity destruye la escena abierta y la vuelve a crear a partir del archivo de escena. Cada objeto vuelve al lugar que le asignó la escena, incluida una caja que el jugador haya volcado; todos los campos recuperan sus valores del Inspector, y Awake y Start se ejecutan de nuevo. No hace falta que ningún código restaure las cosas una por una. Como el botón solicita la escena activa en lugar de un nombre como "Level3", el mismo script reinicia cualquier nivel en el que se coloque.

Un campo static no forma parte de la escena: pertenece a la clase, así que una recarga lo deja tal como estaba. Un private static float bestTime; conserva el mejor tiempo entre reinicios, mientras que un private float time; vuelve a empezar desde 0 con la nueva escena. GameManager.Instance también es static: después de una recarga apunta al GameManager destruido hasta que el Awake del nuevo lo establece.

challenge icon

Desafío

Fácil

Una caída debería reiniciar el nivel en el que está el jugador y contabilizar la caída.

  1. Añade using UnityEngine.SceneManagement; y cambia el contador a private static int falls; para que se conserve al recargar el nivel.
  2. En Update(), cuando player.position.y < fallY, ejecuta falls++; y carga SceneManager.GetActiveScene().name.

Pulsa «Jugar» y salta por un borde en ambos niveles: Falls: 1, después Falls: 2. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;
using TMPro;

public class LevelRestart : MonoBehaviour
{
    public Transform player;
    public TMP_Text fallsText;
    public float fallY = -3f;
    private int falls;

    void Start()
    {
        fallsText.text = "Falls: " + falls;
    }

    void Update()
    {
        // por debajo de fallY: cuenta la caída y reinicia el nivel en el que se encuentra el jugador
    }
}

Todas las lecciones de Creación de juegos reales

Practica por tu cuenta: Playground de Unity