Fin del juego
Lección 12 de 16 del curso Juego en Unity: Rompebloques de Coddy.
La última vida perdida pone fin al juego. La pelota deja de jugar, un panel de Game Over cubre la pantalla y su botón Play Again inicia una nueva partida. Ahora, la escena tiene el panel, oculto, dentro del lienzo del HUD, y la lista On Click del botón en el Inspector ya llama a GameManager.PlayAgain. La lista On Click solo ofrece métodos public, así que el método que elijas para un botón debe ser público.
La forma más sencilla de empezar una nueva partida es volver a cargar la escena. Cada objeto se crea de nuevo a partir de la escena: un GameManager nuevo con una puntuación de 0 y 3 vidas, una pared nueva y la pelota de vuelta en la pala. La escena que se está ejecutando es SceneManager.GetActiveScene(), y su buildIndex es su número en la compilación:
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);Ocultar la pelota con SetActive(false) detiene su Update(), así que la barra espaciadora ya no puede lanzarla y la saca de la simulación física. La comprobación se realiza después de lives--, así que el juego termina cuando lives llega a 0: la tercera pelota perdida cuando lives empieza en 3.
Desafío
Intermedio- Añade
using UnityEngine.SceneManagement;ypublic GameObject gameOverPanelaGameManager. La escena enlaza el GameOverPanel oculto. - En
BallLost, cuando se pierda la última vida, muestra el panel y oculta la pelota perdida conSetActive(false), en lugar de volver a ponerla en la paleta. - Escribe
public void PlayAgain(), que carga de nuevo la escena que se está jugando. El botón Play Again del panel ya lo llama.
Pulsa Play, pierde las tres pelotas, haz clic en Play Again y luego en Check.
Pruébalo tú mismo
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public string[] levels;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public Ball ball;
public int lives = 3;
public TMP_Text scoreText;
public TMP_Text livesText;
int score;
int level;
int bricksLeft;
void Awake()
{
Instance = this;
}
void Start()
{
BuildLevel(0);
ShowHud();
}
void BuildLevel(int index)
{
level = index;
string[] rows = levels[index].Split('/');
for (int row = 0; row < rows.Length; row++)
{
string line = rows[row];
float left = -(line.Length - 1) * spacingX / 2f;
for (int col = 0; col < line.Length; col++)
{
char c = line[col];
if (c == '.') continue;
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(c - '0');
bricksLeft++;
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
bricksLeft--;
ShowHud();
if (bricksLeft == 0)
{
ball.ResetToPaddle();
BuildLevel((level + 1) % levels.Length);
}
}
public void BallLost(Ball lost)
{
lives--;
ShowHud();
lost.ResetToPaddle();
}
void ShowHud()
{
scoreText.text = "Score: " + score;
livesText.text = "Lives: " + lives;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.