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.
Aufgabe
MittelBaue die Wand aus Text, zum Beispiel 3.3.3/22222.
- Entferne in
GameManagerrows, columns und rowHits; fügepublic string[] levels;undint level;hinzu. - Ersetze BuildWall() durch
BuildLevel(int index): speichere index in level, teilelevels[index]bei'/'auf und erstelle für jede Zifferceinen zentrierten Stein mitSetHits(c - '0'); ein Punkt ist eine Lücke. Start()ruftBuildLevel(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