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.
Sfida
MedioPerdere l'ultima vita termina la partita e «Gioca ancora» la fa ricominciare.
- In
GameManager, aggiungiusing UnityEngine.SceneManagement;epublic GameObject gameOverPanel; - In
BallLost, quandolives == 0, mostra il pannello e nascondi la palla conlost.gameObject.SetActive(false); altrimenti reimpostala come prima. - 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;
}
}
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