Livello completato
Lezione 11 di 16 del corso Gioco Unity: Rompi-mattoni di Coddy.
Un gioco con livelli ha bisogno di un modo per registrarli. Il testo è il modo più semplice: un carattere per mattone, una stringa per riga. In questo gioco una cifra rappresenta un mattone con quel numero di colpi e un punto rappresenta uno spazio vuoto; le righe di un livello vanno in un'unica stringa, separate da /, così un livello sta su una riga dell'Inspector. Split('/') suddivide la stringa in un array di righe. Un giardino piantato a partire dal testo:
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 carattere cifra non è il suo numero: '3' è un char il cui codice è 51. I codici delle dieci cifre sono in ordine, quindi sottraendo '0' (codice 48) si ottiene il numero: '3' - '0' è l'int 3.
Un livello è completato quando si rompe l'ultimo mattone. Conta i mattoni: aggiungine uno per ogni mattone costruito, sottrai uno per ogni mattone rotto e, quando arrivi a 0, il livello è terminato. Contare i mattoni ancora presenti nella scena in quel momento non funziona, perché Destroy attende la fine del frame, quindi il mattone che si sta rompendo è ancora lì.
Sfida
MedioCrea i mattoni a partire dal testo. La scena riempie levels con tre schemi; il primo è il muro che hai adesso.
- In
GameManager, rimuovirows,columnserowHits. Aggiungipublic string[] levels,public Ball ball(la scena collega la Ball), unint levele unint bricksLeft. - Sostituisci
BuildWall()convoid BuildLevel(int index): memorizzaindexinlevele suddividelevels[index]in righe usando/. Per ogni cifrac, crea un mattone conc - '0'colpi e incrementabricksLeftdi uno; i punti restano vuoti. Le righe sono centrate e distanziate come prima.Start()chiamaBuildLevel(0). - In
BrickBroken, decrementabricksLeftdi uno. Quando arriva a 0, rimetti la palla sulla racchetta e crea il livello successivo; dopo l'ultimo livello si ricomincia dal primo.
Premi Play e prova a completare un livello, poi Check.
Provalo tu
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;
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.