Menu
CoddyTech

Fine partita

Lezione 13 di 19 del corso Gioco in Unity: Rompi i 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

Perdere l'ultima vita termina la partita e «Gioca ancora» la fa ricominciare.

  1. In GameManager, aggiungi using UnityEngine.SceneManagement; e public GameObject gameOverPanel;
  2. In BallLost, quando lives == 0, mostra il pannello e nascondi la palla con lost.gameObject.SetActive(false); altrimenti reimpostala come prima.
  3. Scrivi public void PlayAgain(): SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

Premi «Gioca», perdi tre palle e fai clic su «Gioca ancora»: inizia una nuova partita. Poi premi «Verifica».

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 in Unity: Rompi i mattoni

Esercitati da solo: Playground Unity