Menu
CoddyTech

Nächstes Level

Lektion 12 von 19 im Kurs Unity-Spiel: Brick Breaker von Coddy.

Ein Level ist abgeschlossen, wenn sein letzter Ziegel zerbricht. Zähle so: Addiere für jeden gebauten Ziegel eins und ziehe für jeden zerbrochenen Ziegel eins ab. Bei 0 ist das Level abgeschlossen.

Die noch in der Szene befindlichen Ziegel in diesem Moment zu zählen, funktioniert nicht: Destroy wartet bis zum Ende des Frames, daher ist der gerade zerbrechende Ziegel noch da.

Nach dem letzten Level kommt wieder das erste. Der Rest einer Division lässt eine Zahl umlaufen:

int next = (2 + 1) % 3;   // 0: nach Index 2 von 3 Ebenen zurück zu 0

Zuerst kehrt der Ball auf das Paddle zurück, damit die neue Wand nicht unter einem fliegenden Ball startet.

challenge icon

Aufgabe

Mittel

Wenn alle Steine abgeräumt sind, wird die nächste Ebene aufgebaut.

  1. Füge in GameManager public Ball ball; hinzu (die Szene verknüpft es) sowie int bricksLeft;; BuildLevel erhöht den Wert für jeden Stein, den es erstellt, um eins.
  2. BrickBroken zieht eins von bricksLeft ab. Bei 0 rufst du ball.ResetToPaddle(); und BuildLevel((level + 1) % levels.Length); auf.

Klicke auf „Spielen“ und räume eine Ebene ab: Der Ball wartet auf dem Schläger, und eine neue Wand erscheint. Klicke dann auf „Prüfen“.

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 int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;
    int level;

    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');
            }
        }
    }

    public void BrickBroken(Brick brick)
    {
        score += brick.points;
        ShowHud();
    }

    public void BallLost(Ball lost)
    {
        lives--;
        ShowHud();
        lost.ResetToPaddle();
    }

    void ShowHud()
    {
        scoreText.text = "Score: " + score;
        livesText.text = "Lives: " + lives;
    }
}

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground