Nivel completado
Lección 11 de 16 del curso Juego en Unity: Rompebloques de Coddy.
Un juego con niveles necesita una forma de registrarlos. El texto es lo más sencillo: un carácter por ladrillo, una cadena por fila. En este juego, un dígito representa un ladrillo con esa cantidad de golpes y un punto representa un espacio vacío; las filas de un nivel van en una sola cadena, separadas por /, así que un nivel cabe en una línea del Inspector. Split('/') divide la cadena en una matriz de filas. Un jardín plantado a partir de texto:
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);Un carácter de dígito no es su número: '3' es un char cuyo código es 51. Los diez dígitos tienen códigos en orden, así que al restar '0' (código 48) se obtiene el número: '3' - '0' es el int 3.
Un nivel se completa cuando se rompe el último ladrillo. Lleva la cuenta: suma uno por cada ladrillo construido, resta uno por cada ladrillo roto y, al llegar a 0, el nivel termina. Contar los ladrillos que todavía están en la escena no funciona en ese momento, porque Destroy espera hasta el final del fotograma, así que el ladrillo que se está rompiendo todavía está ahí.
Desafío
IntermedioConstruye los ladrillos a partir de texto. La escena rellena levels con tres diseños; el primero es la pared que tienes ahora.
- En
GameManager, eliminarows,columnsyrowHits. Añadepublic string[] levels,public Ball ball(la escena enlaza la bola), unint levely unint bricksLeft. - Sustituye
BuildWall()porvoid BuildLevel(int index): guardaindexenlevely dividelevels[index]en filas usando/. Para cada dígitoc, crea un ladrillo conc - '0'impactos y suma uno abricksLeft; los puntos quedan vacíos. Las filas están centradas y espaciadas como antes.Start()llama aBuildLevel(0). - En
BrickBroken, resta uno abricksLeft. Cuando llegue a 0, devuelve la bola a la pala y construye el siguiente nivel; después del último nivel, vuelve al primero.
Pulsa Play e intenta superar un nivel; después, pulsa Check.
Pruébalo tú mismo
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;
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.