Menu
CoddyTech

Poziom ukończony

Lekcja 11 z 16 w kursie Gra w Unity: Zbijanie klocków w Coddy.

Gra z poziomami wymaga sposobu na ich zapisanie. Najłatwiej zrobić to tekstowo: jeden znak na cegłę, jeden ciąg na wiersz. W tej grze cyfra oznacza cegłę z określoną liczbą uderzeń, a kropka — przerwę. Wiersze poziomu zapisuje się w jednym ciągu, rozdzielając je za pomocą /, dzięki czemu poziom mieści się w jednym wierszu Inspektora. Split('/') dzieli ciąg na tablicę wierszy. Ogród posadzony na podstawie tekstu:

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

Znak cyfry to nie jej wartość liczbowa: '3' to znak typu char o kodzie 51. Kody dziesięciu cyfr są kolejne, więc odjęcie '0' (kod 48) daje liczbę: '3' - '0' to int o wartości 3.

Poziom jest ukończony, gdy rozpada się jego ostatnia cegła. Licznik: dodawaj 1 za każdą zbudowaną cegłę, odejmuj 1 za każdą rozbitą cegłę, a gdy licznik osiągnie 0, poziom jest ukończony. Liczenie cegieł, które wciąż znajdują się na scenie, w tej chwili nie działa, ponieważ Destroy czeka do końca klatki, więc rozpadająca się cegła nadal tam jest.

challenge icon

Wyzwanie

Średni

Buduj cegły z tekstu. Scena wypełnia levels trzema układami; pierwszy to ściana, którą masz teraz.

  1. W GameManager usuń rows, columns i rowHits. Dodaj public string[] levels, public Ball ball (scena łączy obiekt Ball), int level i int bricksLeft.
  2. Zastąp BuildWall() metodą void BuildLevel(int index): zapisuje ona index w level i dzieli levels[index] na wiersze przy /. Dla każdej cyfry c tworzy cegłę z c - '0' trafieniami i zwiększa bricksLeft o jeden; kropki pozostają puste. Wiersze są wyśrodkowane i rozmieszczone tak jak wcześniej. Start() wywołuje BuildLevel(0).
  3. W BrickBroken zmniejsz bricksLeft o jeden. Gdy osiągnie 0, umieść piłkę z powrotem na paletce i zbuduj następny poziom; po ostatnim poziomie znów zaczyna się pierwszy.

Naciśnij Play i spróbuj oczyścić poziom, a następnie naciśnij Check.

Spróbuj swoich sił

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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Zbijanie klocków