Menu
CoddyTech

Personnalisez-le

Leçon 16 sur 16 du cours Jeu Unity : casse-briques de Coddy.

La dernière fonctionnalité est un meilleur score conservé d’une partie à l’autre. PlayerPrefs stocke de petites valeurs sur l’appareil du joueur : PlayerPrefs.GetInt(key, 0) en lit une, avec 0 si rien n’a encore été enregistré, et PlayerPrefs.SetInt(key, value) en enregistre une. Charge le meilleur score au démarrage du jeu et enregistre-le à la fin d’une partie si le score est supérieur. Play Again recharge la scène, et le nouveau GameManager charge à nouveau le meilleur score.

Ensuite, tu peux régler le jeu à ta convenance. Chaque nombre qui détermine son fonctionnement est un champ doté d’une valeur initiale dans le code :

  • Ball : speed (9) et minVertical (0.3).
  • Paddle : speed (14), wideFactor (1.6) et wideSeconds (8).
  • GameManager : lives (3), dropChance (0.15) et l’espacement des briques.

Les dispositions sont dans la liste levels de GameManager, dans l’Inspector : un chiffre représente une brique avec autant de points de vie, un point représente un espace vide et / commence la ligne suivante, par exemple 1.3.1/22222. Dans ton propre projet Unity, modifie les valeurs dans l’Inspector : une fois qu’un script est associé à un objet, l’Inspector en conserve sa propre copie, et toute nouvelle valeur initiale définie dans le code ne lui est plus transmise.

challenge icon

Défi

Difficile
  1. Dans GameManager, ajoute public TMP_Text bestText (la scène relie BestText) et un int best. Dans Start(), charge best depuis PlayerPrefs avec la clé BestScore et la valeur 0 si rien n’est enregistré. ShowHud() affiche aussi Best: 0 dans bestText, avec le meilleur score.
  2. Lorsque la partie se termine avec un score supérieur à best, enregistre-le dans best, sauvegarde-le sous BestScore et affiche-le.

Ensuite, personnalise le jeu : modifie les vitesses, le nombre de vies, la probabilité d’apparition et la puissance des bonus, puis joue jusqu’à ce que le résultat te convienne.

Appuie sur Play, établis un meilleur score, puis Check.

Essayez vous-même

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
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;
    public GameObject gameOverPanel;
    public GameObject[] powerUps;
    public float dropChance = 0.15f;

    int score;
    int level;
    int bricksLeft;
    List<Ball> balls = new List<Ball>();

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        balls.Add(ball);
        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 (Random.value < dropChance)
        {
            GameObject prefab = powerUps[Random.Range(0, powerUps.Length)];
            Instantiate(prefab, brick.transform.position, Quaternion.identity);
        }
        if (bricksLeft == 0)
        {
            balls[0].ResetToPaddle();
            BuildLevel((level + 1) % levels.Length);
        }
    }

    public void BallLost(Ball lost)
    {
        if (balls.Count > 1)
        {
            balls.Remove(lost);
            Destroy(lost.gameObject);
            return;
        }
        lives--;
        ShowHud();
        if (lives == 0)
        {
            gameOverPanel.SetActive(true);
            lost.gameObject.SetActive(false);
        }
        else lost.ResetToPaddle();
    }

    public void SplitBall()
    {
        Ball source = balls[0];
        Ball left = Instantiate(source, source.transform.position, Quaternion.identity);
        left.Launch(new Vector3(-0.6f, 1f, 0f));
        balls.Add(left);
        Ball right = Instantiate(source, source.transform.position, Quaternion.identity);
        right.Launch(new Vector3(0.6f, 1f, 0f));
        balls.Add(right);
    }

    public void PlayAgain()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    void ShowHud()
    {
        scoreText.text = "Score: " + score;
        livesText.text = "Lives: " + lives;
    }
}
quiz iconTestez-vous

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