Fin de partie
Leçon 12 sur 16 du cours Jeu Unity : casse-briques de Coddy.
La dernière vie perdue met fin à la partie. La balle sort du jeu, un panneau Game Over recouvre l’écran, et son bouton Play Again démarre une nouvelle partie. La scène contient maintenant le panneau, masqué, dans le canevas du HUD, et la liste On Click du bouton dans l’Inspector appelle déjà GameManager.PlayAgain. La liste On Click ne propose que des méthodes public, donc la méthode que tu choisis pour un bouton doit être publique.
Le moyen le plus simple de démarrer une nouvelle partie est de recharger la scène. Chaque objet est recréé à partir de la scène : un nouveau GameManager avec un score de 0 et 3 vies, un nouveau mur, la balle replacée sur la raquette. La scène en cours de jeu est SceneManager.GetActiveScene(), et son buildIndex est son numéro dans la compilation :
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);Masquer la balle avec SetActive(false) arrête son Update(), donc la barre d’espace ne peut plus la lancer, et la retire de la simulation physique. Le test vient après lives--, donc la partie se termine lorsque lives atteint 0 : à la troisième balle perdue, si lives commence à 3.
Défi
Moyen- Ajoute
using UnityEngine.SceneManagement;etpublic GameObject gameOverPanelàGameManager. La scène référence le GameOverPanel masqué. - Dans
BallLost, lorsque la dernière vie est perdue, affiche le panneau et masque la balle perdue avecSetActive(false), au lieu de la remettre sur la raquette. - Écris
public void PlayAgain(), qui recharge la scène en cours. Le bouton Play Again du panneau l’appelle déjà.
Appuie sur Play, perds les trois balles, clique sur Play Again, puis sur Check.
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 Ball ball;
public int lives = 3;
public TMP_Text scoreText;
public TMP_Text livesText;
int score;
int level;
int bricksLeft;
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');
bricksLeft++;
}
}
}
public void BrickBroken(Brick brick)
{
score += brick.points;
bricksLeft--;
ShowHud();
if (bricksLeft == 0)
{
ball.ResetToPaddle();
BuildLevel((level + 1) % levels.Length);
}
}
public void BallLost(Ball lost)
{
lives--;
ShowHud();
lost.ResetToPaddle();
}
void ShowHud()
{
scoreText.text = "Score: " + score;
livesText.text = "Lives: " + lives;
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.