Menu
CoddyTech

Game Over

Lezione 12 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.

L’ultima vita persa termina la partita. La palla esce dal gioco, un pannello Game Over copre lo schermo e il suo pulsante Play Again avvia una nuova partita. Ora la scena contiene il pannello, nascosto all’interno del canvas HUD, e l’elenco On Click del pulsante nell’Inspector richiama già GameManager.PlayAgain. L’elenco On Click mostra solo metodi public, quindi il metodo che scegli per un pulsante deve essere pubblico.

Il modo più semplice per iniziare una nuova partita è caricare di nuovo la scena. Ogni oggetto viene ricreato dalla scena: un nuovo GameManager con punteggio 0 e 3 vite, un nuovo muro e la palla di nuovo sulla racchetta. La scena in esecuzione è SceneManager.GetActiveScene() e il suo buildIndex è il suo numero nella build:

SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

Nascondere la palla con SetActive(false) interrompe il suo Update(), quindi la barra spaziatrice non può più lanciarla, e la rimuove dalla fisica. Il controllo avviene dopo lives--, quindi la partita termina quando le vite raggiungono 0: la terza palla persa, se le vite iniziano da 3.

challenge icon

Sfida

Medio
  1. Aggiungi using UnityEngine.SceneManagement; e public GameObject gameOverPanel a GameManager. La scena collega il GameOverPanel nascosto.
  2. In BallLost, quando rimane a zero vite, mostra il pannello e nascondi la palla persa con SetActive(false), invece di rimetterla sulla racchetta.
  3. Scrivi public void PlayAgain(), che ricarica la scena in corso. Il pulsante Play Again del pannello la richiama già.

Premi Play, perdi tutte e tre le palle, fai clic su Play Again, poi su Check.

Provalo tu

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 iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: Rompi-mattoni