Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio
  1. Añade using UnityEngine.SceneManagement; y public GameObject gameOverPanel a GameManager. La escena enlaza el GameOverPanel oculto.
  2. En BallLost, cuando se pierda la última vida, muestra el panel y oculta la pelota perdida con SetActive(false), en lugar de volver a ponerla en la paleta.
  3. 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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego en Unity: Rompebloques