Menu
CoddyTech

Koniec gry

Lekcja 12 z 16 w kursie Gra w Unity: Zbijanie klocków 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
  1. Dodaj using UnityEngine.SceneManagement; i public GameObject gameOverPanel do GameManager. Scena zawiera odwołanie do ukrytego GameOverPanel.
  2. W BallLost, gdy zabraknie ostatniego życia, pokaż panel i ukryj utraconą piłkę za pomocą SetActive(false), zamiast odkładać ją z powrotem na paletkę.
  3. Napisz public void PlayAgain(), która ponownie wczytuje aktualnie uruchomioną scenę. Przycisk Play Again na panelu już ją wywołuje.

Naciśnij Play, strac wszystkie trzy piłki, kliknij Play Again, a następnie Check.

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: Zbijanie klocków