Menu
CoddyTech

Level abgeschlossen

Lektion 11 von 16 im Kurs Unity-Spiel: Brick Breaker von Coddy.

Ein Spiel mit Leveln braucht eine Möglichkeit, sie aufzuschreiben. Text ist am einfachsten: ein Zeichen pro Ziegel, ein String pro Zeile. In diesem Spiel ist eine Ziffer ein Ziegel mit so vielen Treffern und ein Punkt eine Lücke. Die Zeilen eines Levels kommen in einen String, getrennt durch /, sodass ein Level in eine Zeile im Inspector passt. Split('/') zerlegt den String in ein Array von Zeilen. Ein Garten, der aus Text gepflanzt wird:

string layout = "t.t.t/.ttt.";
string[] rows = layout.Split('/');
for (int row = 0; row < rows.Length; row++)
    for (int col = 0; col < rows[row].Length; col++)
        if (rows[row][col] == 't') Instantiate(treePrefab, new Vector3(col, 0f, -row), Quaternion.identity);

Ein Ziffernzeichen ist nicht seine Zahl: '3' ist ein char mit dem Code 51. Die zehn Ziffern haben aufeinanderfolgende Codes. Zieht man also '0' (Code 48) ab, erhält man die Zahl: '3' - '0' ist die int-Zahl 3.

Ein Level ist abgeschlossen, wenn sein letzter Ziegel zerbricht. Zähle mit: Addiere eins für jeden gebauten Ziegel, ziehe eins für jeden zerbrochenen Ziegel ab, und bei 0 ist das Level geschafft. Die noch in der Szene befindlichen Ziegel in diesem Moment zu zählen, funktioniert nicht, weil Destroy bis zum Ende des Frames wartet und der gerade zerbrechende Ziegel deshalb noch da ist.

challenge icon

Aufgabe

Mittel

Erzeuge die Steine aus Text. Die Szene füllt levels mit drei Layouts; das erste ist die Wand, die du jetzt hast.

  1. Entferne in GameManager rows, columns und rowHits. Füge public string[] levels, public Ball ball (die Szene verknüpft den Ball), ein int level und ein int bricksLeft hinzu.
  2. Ersetze BuildWall() durch void BuildLevel(int index): Die Methode speichert index in level und teilt levels[index] an / in Zeilen auf. Für jede Ziffer c erstellt sie einen Stein mit c - '0' Treffern und erhöht bricksLeft um eins; Punkte bleiben leer. Die Zeilen sind wie zuvor zentriert und mit Abständen versehen. Start() ruft BuildLevel(0) auf.
  3. Ziehe in BrickBroken eins von bricksLeft ab. Bei 0 setzt du den Ball zurück auf das Paddle und erstellst das nächste Level; nach dem letzten Level kommt wieder das erste.

Drücke Play und schaffe ein Level, wenn du kannst, dann Check.

Probier es selbst

using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Brick brickPrefab;
    public Transform wall;
    public int rows = 5;
    public int columns = 9;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;
    public int[] rowHits = { 2, 1, 1, 1, 1 };
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildWall();
        ShowHud();
    }

    void BuildWall()
    {
        float left = -(columns - 1) * spacingX / 2f;
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < columns; col++)
            {
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(rowHits[row]);
            }
        }
    }

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