Menu
CoddyTech

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 à 0

La balle revient d’abord sur la raquette, pour que le nouveau mur n’apparaisse pas alors qu’une balle est en plein vol.

challenge icon

Défi

Moyen

Éliminer toutes les briques permet de construire le niveau suivant.

  1. Dans GameManager, ajoute public Ball ball; (la scène le relie) et int bricksLeft; ; BuildLevel en ajoute une pour chaque brique construite.
  2. BrickBroken retire une unité de bricksLeft. À 0, appelle ball.ResetToPaddle(); et BuildLevel((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