Fin de partie
Leçon 13 sur 19 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
MoyenPerdre la dernière vie met fin à la partie, et « Jouer à nouveau » permet de recommencer.
- Dans
GameManager, ajouteusing UnityEngine.SceneManagement;etpublic GameObject gameOverPanel; - Dans BallLost, lorsque
lives == 0, affiche le panneau et masque la balle aveclost.gameObject.SetActive(false); sinon, réinitialise-la comme avant. - Écris
public void PlayAgain():SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
Clique sur Jouer, perds trois balles et clique sur Jouer à nouveau : une nouvelle partie commence. Ensuite, 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 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.
Toutes les leçons de Jeu Unity : casse-briques
Entraînez-vous par vous-même : Playground Unity