Juega otra vez
Lección 12 de 14 del curso Juego de Unity: Serpiente 3D de Coddy.
Cuando la serpiente muere, aparece un panel de fin de partida con un botón para volver a jugar. El panel está en el HUD y empieza oculto; SetActive(true) lo muestra. La serpiente sabe cuándo muere, y GameManager se encarga de las pantallas, así que Die() llama a un método público GameOver() de GameManager.
Volver a jugar empieza de nuevo cargando otra vez la escena. Todos los objetos vuelven tal como están en la escena: la serpiente en su primera celda con dos segmentos, la puntuación en 0 y el panel oculto. El botón Retry de un juego de carreras se conecta de la misma manera:
void Start()
{
retryButton.onClick.AddListener(Retry);
}
void Retry()
{
SceneManager.LoadScene("Track1");
}Cargar por nombre vincula el botón a una sola escena. SceneManager.GetActiveScene().buildIndex es la escena que está en ejecución, así que cargarla reinicia la escena en la que esté el botón. La nueva escena tiene un GameManager nuevo, cuyo Awake() vuelve a establecer Instance, así que la nueva serpiente se comunica con el nuevo GameManager.
Desafío
IntermedioAl morir, se muestra un panel de Game Over y «Jugar otra vez» inicia una nueva partida.
- En
GameManager, añadeusing UnityEngine.UI;,using UnityEngine.SceneManagement;,public GameObject gameOverPanel;ypublic Button playAgainButton; public void GameOver()muestra el panel;void PlayAgain()vuelve a cargar la escena activa, y Start() lo añade aplayAgainButton.onClick.- El método
Die()deSnakellama aGameManager.Instance.GameOver().
Pulsa «Jugar», choca y haz clic en «Jugar otra vez»: se inicia una nueva partida. Después, pulsa «Comprobar».
Pruébalo tú mismo
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Snake snake;
public GameObject foodPrefab;
public TMP_Text scoreText;
private Transform food;
private int score;
void Awake()
{
Instance = this;
}
void Start()
{
scoreText.text = "Score: 0";
food = Instantiate(foodPrefab).transform;
MoveFood();
}
public bool IsFood(Vector3 cell)
{
return cell == food.position;
}
public void Eat()
{
score++;
scoreText.text = "Score: " + score;
MoveFood();
}
void MoveFood()
{
List<Vector3> free = new List<Vector3>();
for (int x = -snake.edge; x <= snake.edge; x++)
{
for (int z = -snake.edge; z <= snake.edge; z++)
{
Vector3 cell = new Vector3(x, 0f, z);
if (!snake.Occupies(cell))
{
free.Add(cell);
}
}
}
food.position = free[Random.Range(0, free.Count)];
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Unity: Serpiente 3D
Practica por tu cuenta: Playground de Unity