Menu
CoddyTech

Niveaux à partir de texte

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

Un jeu avec des niveaux a besoin d’un moyen de les décrire. Le texte est le plus simple : un caractère par brique, une chaîne par rangée. Ici, un chiffre représente une brique ayant autant de points de vie, un point représente un espace vide et les rangées d’un niveau sont réunies dans une chaîne, séparées par / ; ainsi, levels de la scène contient trois configurations, et la première correspond au mur d’aujourd’hui.

string[] rows = "1.1/22".Split('/');   // "1.1" et "22"
char c = rows[1][0];                     // '2'

Un caractère chiffre n’est pas son nombre : '3' est un char dont le code est 51. Les codes des chiffres se suivent dans l’ordre ; soustraire '0' donne donc le nombre : '3' - '0' vaut l’int 3. Chaque rangée est centrée en fonction de sa propre longueur, -(line.Length - 1) * spacingX / 2f.

challenge icon

Défi

Moyen

Construis le mur à partir de texte, par exemple 3.3.3/22222.

  1. Dans GameManager, supprime les lignes, les colonnes et rowHits ; ajoute public string[] levels; et int level;
  2. Remplace BuildWall() par BuildLevel(int index) : stocke index dans level, découpe levels[index] au niveau de '/' et, pour chaque chiffre c, crée une brique centrée avec SetHits(c - '0') ; un point indique un espace vide.
  3. Start() appelle BuildLevel(0).

Clique sur « Jouer » : le même mur, désormais construit à partir du texte du premier niveau. 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 int rows = 5;
    public int columns = 9;
    public float spacingX = 1.75f;
    public float spacingY = 0.75f;
    public float topY = 6f;
    public int[] rowHits = { 2, 1, 1, 1, 1 };
    public int lives = 3;
    public TMP_Text scoreText;
    public TMP_Text livesText;

    int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        BuildWall();
        ShowHud();
    }

    void BuildWall()
    {
        float left = -(columns - 1) * spacingX / 2f;
        for (int row = 0; row < rows; row++)
        {
            for (int col = 0; col < columns; col++)
            {
                Vector3 pos = new Vector3(left + col * spacingX, topY - row * spacingY, 0f);
                Brick brick = Instantiate(brickPrefab, pos, Quaternion.identity, wall);
                brick.SetHits(rowHits[row]);
            }
        }
    }

    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