Menu
CoddyTech

Level aus Text

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

Ein Spiel mit Levels braucht eine Möglichkeit, sie festzuhalten. Text ist am einfachsten: ein Zeichen pro Ziegel, eine Zeichenfolge pro Zeile. Hier steht eine Ziffer für einen Ziegel mit so vielen Treffern, ein Punkt für eine Lücke, und die Zeilen eines Levels stehen in einer Zeichenfolge, die mit / aufgeteilt wird, sodass levels der Szene drei Layouts enthält und das erste die heutige Wand ist.

string[] rows = "1.1/22".Split('/');   // "1.1" und "22"
char c = rows[1][0];                     // '2'

Ein Ziffernzeichen ist nicht seine Zahl: '3' ist ein char mit dem Code 51. Die Ziffern haben aufeinanderfolgende Codes, daher ergibt das Abziehen von '0' die Zahl: '3' - '0' ist die int-Zahl 3. Jede Zeile wird anhand ihrer eigenen Länge zentriert, -(line.Length - 1) * spacingX / 2f.

challenge icon

Aufgabe

Mittel

Baue die Wand aus Text, zum Beispiel 3.3.3/22222.

  1. Entferne in GameManager rows, columns und rowHits; füge public string[] levels; und int level; hinzu.
  2. Ersetze BuildWall() durch BuildLevel(int index): speichere index in level, teile levels[index] bei '/' auf und erstelle für jede Ziffer c einen zentrierten Stein mit SetHits(c - '0'); ein Punkt ist eine Lücke.
  3. Start() ruft BuildLevel(0) auf.

Drücke „Spielen“: dieselbe Wand, jetzt aus dem Text des ersten Levels erstellt. Dann „Prüfen“.

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

Alle Lektionen in Unity-Spiel: Brick Breaker

Übe selbstständig: Unity-Playground