Reiniciar el nivel
Parte de la sección Creación de juegos reales del Journey de Unity de Coddy. Lección 18 de 56.
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 a estar donde lo colocó la escena, incluida una caja que el jugador haya volcado; cada campo vuelve a tener su valor del Inspector, y Awake y Start se ejecutan de nuevo. No hace falta que ningún código restablezca las cosas una por una. Como el botón solicita la escena activa en vez 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; normal 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.
Desafío
FácilDos niveles, Level1 y Level2, cada uno con un objeto Level que contiene el script LevelRestart. Las flechas mueven al jugador y el bloque dorado de Level1 carga Level2 (ambos están listos). Termina LevelRestart.cs:
- Cuando el jugador cae por debajo de
fallY(-3), suma 1 afallsy reinicia el nivel en el que está el jugador: una caída en Level2 reinicia Level2. fallscuenta todas las caídas del juego, así que debe conservarse después de volver a cargar el nivel. Start ya lo muestra comoFalls: 1.
Pulsa Play, salta por un borde en ambos niveles y luego pulsa Check.
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 está el jugador
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Creación de juegos reales
1Texto en pantalla
Canvas y textoMuestra la puntuaciónDa formato a los númerosUn temporizador de cuenta regresivaRepaso: velocímetro4Escenas y niveles
Cargar una escenaReiniciar el nivelSiguiente nivelConservar entre escenasRepaso: selección de nivel10Proyecto: plataformas 3D
El recorridoPlataformas móviles2Botones y pantallas
Botones y onClickLambdasConectar en el InspectorPaneles activados y desactivadosBarras de saludRepaso: tienda de mejoras5Guardar con PlayerPrefs
Guardar un númeroCargar con un valor predeterminadoPuntuación más altaGuardar ajustesRepaso: monedas en el banco3El gestor del juego
Un solo script ejecuta el juegoEl SingletonEstados del juegoActivar el estadoRepaso: gestor de rondas6Proyecto: corredor infinito
Tres carrilesObstáculos por delante9El nuevo sistema de entrada
Dos sistemas de entradaTeclado y ratónPulsado en este fotogramaAcciones de entradaRepaso: cambio de entrada