Menu
CoddyTech

Koniec gry

Lekcja 13 z 19 w kursie Gra w Unity: Brick Breaker w Coddy.

Ostatnie stracone życie kończy grę. Piłka wypada z gry, panel Game Over zakrywa ekran, a znajdujący się na nim przycisk Play Again rozpoczyna nową grę. Scena zawiera teraz panel, ukryty w kanwie HUD, a lista On Click przycisku w Inspectorze już wywołuje GameManager.PlayAgain. Lista On Click udostępnia tylko metody public, więc metoda wybrana dla przycisku musi być publiczna.

Najprostszy sposób na rozpoczęcie nowej gry to ponowne załadowanie sceny. Wszystkie obiekty są tworzone na nowo na podstawie sceny: nowy GameManager z wynikiem 0 i 3 życiami, nowa ściana, piłka z powrotem na platformie. Aktualnie odtwarzana scena to SceneManager.GetActiveScene(), a jej buildIndex to jej numer w kompilacji:

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

Ukrycie piłki za pomocą SetActive(false) zatrzymuje jej Update(), więc klawisz spacji nie może już jej wystrzelić, a piłka zostaje usunięta z symulacji fizyki. Sprawdzenie następuje po lives--, więc gra kończy się, gdy liczba żyć osiągnie 0: po stracie trzeciej piłki, jeśli na początku liczba żyć wynosi 3.

challenge icon

Wyzwanie

Średni

Utrata ostatniego życia kończy grę, a „Graj ponownie” rozpoczyna ją od nowa.

  1. W GameManager dodaj using UnityEngine.SceneManagement; i public GameObject gameOverPanel;
  2. W BallLost, gdy lives == 0, pokaż panel i ukryj piłkę za pomocą lost.gameObject.SetActive(false); w przeciwnym razie zresetuj ją jak wcześniej.
  3. Napisz public void PlayAgain(): SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);

Naciśnij „Graj”, strać trzy piłki i kliknij „Graj ponownie”: rozpocznie się nowa gra. Następnie kliknij „Sprawdź”.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Brick Breaker

Poćwicz samodzielnie: Edytor online Unity