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.
Défi
MoyenConstruis le mur à partir de texte, par exemple 3.3.3/22222.
- Dans
GameManager, supprime les lignes, les colonnes etrowHits; ajoutepublic string[] levels;etint level; - Remplace
BuildWall()parBuildLevel(int index): stocke index dans level, découpelevels[index]au niveau de'/'et, pour chaque chiffrec, crée une brique centrée avecSetHits(c - '0'); un point indique un espace vide. Start()appelleBuildLevel(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