Menu
CoddyTech

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í.

challenge icon

Desafío

Intermedio

Construye los ladrillos a partir de texto. La escena rellena levels con tres diseños; el primero es la pared que tienes ahora.

  1. En GameManager, elimina rows, columns y rowHits. Añade public string[] levels, public Ball ball (la escena enlaza la bola), un int level y un int bricksLeft.
  2. Sustituye BuildWall() por void BuildLevel(int index): guarda index en level y divide levels[index] en filas usando /. Para cada dígito c, crea un ladrillo con c - '0' impactos y suma uno a bricksLeft; los puntos quedan vacíos. Las filas están centradas y espaciadas como antes. Start() llama a BuildLevel(0).
  3. En BrickBroken, resta uno a bricksLeft. 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;
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego en Unity: Rompebloques