Menu
CoddyTech

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.

challenge icon

Aufgabe

Mittel
  1. Füge using UnityEngine.SceneManagement; und public GameObject gameOverPanel zu GameManager hinzu. Die Szene verweist auf das ausgeblendete GameOverPanel.
  2. Zeige in BallLost, wenn das letzte Leben verloren ist, das Panel an und blende den verlorenen Ball mit SetActive(false) aus, statt ihn wieder auf das Paddle zu setzen.
  3. 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;
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: Brick Breaker