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.
Aufgabe
MittelErzeuge die Steine aus Text. Die Szene füllt levels mit drei Layouts; das erste ist die Wand, die du jetzt hast.
- Entferne in
GameManagerrows,columnsundrowHits. Fügepublic string[] levels,public Ball ball(die Szene verknüpft den Ball), einint levelund einint bricksLefthinzu. - Ersetze
BuildWall()durchvoid BuildLevel(int index): Die Methode speichertindexinlevelund teiltlevels[index]an/in Zeilen auf. Für jede Ziffercerstellt sie einen Stein mitc - '0'Treffern und erhöhtbricksLeftum eins; Punkte bleiben leer. Die Zeilen sind wie zuvor zentriert und mit Abständen versehen.Start()ruftBuildLevel(0)auf. - Ziehe in
BrickBrokeneins vonbricksLeftab. 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;
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.