Niveau suivant
Leçon 12 sur 19 du cours Jeu Unity : casse-briques de Coddy.
Un niveau est terminé lorsque sa dernière brique se brise. Compte : ajoute une unité pour chaque brique construite, enlève-en une pour chaque brique brisée, et lorsque le compte atteint 0, le niveau est terminé.
Compter les briques encore présentes dans la scène ne fonctionne pas à ce moment-là : Destroy attend la fin de la frame, donc la brique qui se brise est encore là.
Après le dernier niveau, on revient au premier. Le reste d’une division fait boucler un nombre :
int next = (2 + 1) % 3; // 0 : après l'indice 2 des 3 niveaux, retour à 0La balle revient d’abord sur la raquette, pour que le nouveau mur n’apparaisse pas alors qu’une balle est en plein vol.
Défi
MoyenÉliminer toutes les briques permet de construire le niveau suivant.
- Dans
GameManager, ajoutepublic Ball ball;(la scène le relie) etint bricksLeft;; BuildLevel en ajoute une pour chaque brique construite. - BrickBroken retire une unité de bricksLeft. À 0, appelle
ball.ResetToPaddle();etBuildLevel((level + 1) % levels.Length);
Appuie sur « Jouer » et élimine toutes les briques d’un niveau : la balle attend sur la raquette et un nouveau mur apparaît. Puis clique sur « Vérifier ».
Essayez vous-même
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Brick brickPrefab;
public Transform wall;
public string[] levels;
public float spacingX = 1.75f;
public float spacingY = 0.75f;
public float topY = 6f;
public int lives = 3;
public TMP_Text scoreText;
public TMP_Text livesText;
int score;
int level;
void Awake()
{
Instance = this;
}
void Start()
{
BuildLevel(0);
ShowHud();
}
void BuildLevel(int index)
{
level = index;
string[] rows = levels[index].Split('/');
for (int row = 0; row < rows.Length; row++)
{
string line = rows[row];
float left = -(line.Length - 1) * spacingX / 2f;
for (int col = 0; col < line.Length; col++)
{
char c = line[col];
if (c == '.') continue;
Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
brick.SetHits(c - '0');
}
}
}
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;
}
}
Toutes les leçons de Jeu Unity : casse-briques
Entraînez-vous par vous-même : Playground Unity