Spiel vorbei
Lektion 12 von 16 im Kurs Unity-Spiel: Brick Breaker von Coddy.
Das letzte verlorene Leben beendet das Spiel. Der Ball verlässt das Spielfeld, ein „Spiel vorbei“-Panel bedeckt den Bildschirm, und seine Schaltfläche „Noch einmal spielen“ startet ein neues Spiel. Die Szene enthält jetzt das Panel, ausgeblendet im HUD-Canvas, und die On-Click-Liste der Schaltfläche im Inspector ruft bereits GameManager.PlayAgain auf. Die On-Click-Liste bietet nur public-Methoden an, daher muss die Methode, die du für eine Schaltfläche auswählst, public sein.
Am einfachsten startest du ein neues Spiel, indem du die Szene erneut lädst. Jedes Objekt wird neu aus der Szene erstellt: ein neuer GameManager mit Punktzahl 0 und 3 Leben, eine neue Wand, der Ball wieder auf dem Schläger. Die gerade laufende Szene ist SceneManager.GetActiveScene(), und ihr buildIndex ist ihre Nummer im Build:
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);Wenn du den Ball mit SetActive(false) ausblendest, wird sein Update() gestoppt, sodass die Leertaste ihn nicht mehr starten kann, und er wird aus der Physik entfernt. Die Prüfung erfolgt nach lives--, sodass das Spiel endet, wenn die Leben 0 erreichen: beim dritten verlorenen Ball, wenn lives bei 3 beginnt.
Aufgabe
Mittel- Füge
using UnityEngine.SceneManagement;undpublic GameObject gameOverPanelzuGameManagerhinzu. Die Szene verweist auf das ausgeblendete GameOverPanel. - Zeige in
BallLost, wenn das letzte Leben verloren ist, das Panel an und blende den verlorenen Ball mitSetActive(false)aus, statt ihn wieder auf das Paddle zu setzen. - Schreibe
public void PlayAgain(), das die gerade laufende Szene erneut lädt. Der Play Again-Button des Panels ruft die Methode bereits auf.
Klicke auf Play, verliere alle drei Bälle, klicke auf Play Again und dann auf Check.
Probier es selbst
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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.