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.
Wyzwanie
ŚredniUtrata ostatniego życia kończy grę, a „Graj ponownie” rozpoczyna ją od nowa.
- W
GameManagerdodajusing UnityEngine.SceneManagement;ipublic GameObject gameOverPanel; - 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. - 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;
}
}
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