Variables

VoilĆ  un mot que tu risques de beaucoup croiser dans l’univers de la programmation! Si tu suis les ateliers Unity, il y a de fortes chances que tu aies dĆ©jĆ  entendu parler des variables. En effet, les variables ne sont pas utilisĆ©es que pour la programmation C#. Presque tous les langages de programmation utilisent des variables!

Dans cette page trouveras :

Qu’est ce qu’une Variable?

Ā 

Une variable est un outil qui nous permet de stocker de l’information en mĆ©moire!

C’est l’équivalent d’une boĆ®te, qui va contenir la derniĆØre valeur qu’on lui a assignĆ©. L’avantage de la variable, c’est justement qu’elle varie! On peut modifier la valeur qu’elle contient et exĆ©cuter des opĆ©rations dessus.

int vie = 10;

Cette dĆ©claration va stocker la valeur 10 dans une variable appelĆ©e vie. A chaque fois qu’on voudra rĆ©cupĆ©rer la valeur contenue dans vie, il suffira de l’appeler.Ā 

string message = « Il te reste actuellement «  + vie +  » points de vie »;

Tu peux utiliser une variable pour affecter une autre variable! Dans cet exemple, la variable message contient la phrase ā€œIl te reste actuellement X points de vieā€ avec X remplacĆ© par la valeur contenue dans la variable vie.Ā 

Il y a une multitude de faƧons d’exploiter les variables dans ton code. Cela permet de garder les informations et ne pas dĆ©pendre d’un cas particulier. Le programme devrait pouvoir fonctionner sans connaĆ®tre d’avance le contenu de la variable!

DƩclarer une variable

Ā 

Pour utiliser une variable, tu dois la déclarer. Cela signifie: préciser son type, son nom et sa valeur, de cette manière: 

type nom = valeur;

Voici quelques exemples:

int age = 15;
float volume = 0.8f;
string pays = « France »;

Comment nommer tes variables?Ā 

Prend l’habitude de nommer tes variables en camelCase, (littĆ©ralement casse de chameau) c’est-Ć -dire tout attachĆ© avec une majuscule uniquement pour sĆ©parer les mots. Tu n’as pas le droit d’utiliser des caractĆØres spĆ©ciaux comme des accents ou de la ponctuation! Ceci donne:Ā 

pouvoir,Ā  Ā  Ā pouvoirSecondaire,Ā  Ā  Ā position,Ā  Ā  Ā pointDeVie,Ā  Ā  Ā periodeInvincibilite.Ā 

La raison pour laquelle c’est bien de prendre l’habitude d’adopter cette convention, c’est qu’elle te permet de plus facilement collaborer avec d’autres dĆ©veloppeurs Unity. En effet, si chacun faisait ce qu’il voulait pour nommer une variable, le code deviendrait vite un terrain sans ordres ni rĆØgles qu’il serait difficile de s’approprier! Une fois que tu auras maĆ®trisĆ© toutes ces conventions, tu pourras te sentir Ć  l’aise en lisant le code d’un autre dĆ©veloppeur Unity!

Types de variables

Ā 

Chaque variable stocke un type d’information. Il faut prĆ©ciser le type au moment de dĆ©clarer la variable!

Voici une liste des types de variables supportƩes par Unity.

Nous allons nous attarder sur les plus importants.

Variables numƩriques: int et float

int score = 10;
float vitesse = 27.4f;

Les variables les plus courantes dans le jeu vidĆ©o sont les variables numĆ©riques! Surtout si tu veux stocker les points, la vie, l’expĆ©rience, l’argent, la position, la vitesse… 

  • int – pour les nombres entiers (integers en anglais), c’est-Ć -dire les nombres sans virgules.Ā 
  • float – pour les nombres dĆ©cimaux (aussi appelĆ©s flottants), c’est-Ć -dire les nombres avec virgule.Ā 

Remarque qu’il est nĆ©cessaire d’ajouter la lettre f Ć  la fin d’un nombre flottant! Un nombre Ć  virgule sans le petit f Ć  la fin est considĆ©rĆ© comme de type double (pareil qu’un nombre flottant mais prend deux fois plus de place dans la mĆ©moire de ton ordi).

Variables textuelles: string

string nom = « Maker »; 

Bien évidemment, tu peux aussi stocker du texte dans une variable en te servant du type string! 

Pour une seule lettre, il existe le type char (pour character en anglais)

char lettre = ‘a’;Ā 

VariablesĀ non-primitives

Enfin, tu verras souvent dans le code plein d’autres types de variables qui ne sont pas considĆ©rĆ©s comme primitifs! Ces variables sont en rĆ©alitĆ© des objets que Unity a crƩƩ pour nous pour qu’on puisse les stocker et manipuler

Ā 

Voici quelques exemples:

Camera camera;
Vector3 position;
GameObject player;

Tu peux assigner ces objets comme tu le ferais avec une autre variable, et tu peux mĆŖme faire appel Ć  leurs propres variables et fonctions.Ā 

Ā 

position.x; // pour lire la variable x de l’objet position
player.Respawn(); // pour lancer le code de rƩapparition du joueur

Public ou Private ?

Ā 

Pour dƩbuter dans le dƩveloppement de jeu vidƩo il est primordial de comprendre la distinction entre des variables qui auront une portƩe publique ou privƩe.
Lorsque la variable est « public » elle pourra être consultée ou modifier en dehors de son script c#, si elle est « private » alors vous ne pourrez agir sur cette variable uniquement depuis le script ou elle a été déclarer.

Par dĆ©faut si on ne met rien devant la variable elle est Private (donc PrivĆ©e, c’est Ć  dire cachĆ©e et inaccessible dans l’inspector ou depuis un autre script).

On va donc mettre Public devant la variable pour pouvoir la modifier.

using UnityEngine;

public class ScriptNom : MonoBehaviour
{
    public string monPrenom = « Fabien »;
Ā  Ā  void Start()
Ā  Ā  {
Ā  Ā  Ā  Ā Debug.Log(myName);
Ā  Ā  }

voidĀ Update()
Ā  Ā  {
Ā  Ā  Ā  Ā Debug.Log(myName);
Ā  Ā  }
}

Ce code crĆ©e un champ modifiable dans l’Inspecteur intitulĆ© « Mon PrenomĀ Ā».

GrĆ¢ce au deux Debug.Log, l’un crƩƩ au Start et l’autre dans l’Update, on peut voir le PrĆ©nom s’afficher.

On peut d’ailleurs retrouver ce champs modifiable dans l’Inspector de l’objet qui porte le Script:

Si on modifie en direct la valeur :

Le texte s’actualise dans la Console :

PortĆ©e d’une variable

Ā 

La derniĆØre chose importante Ć  comprendre dans une variable est sa portĆ©e! En effet, une variable n’existe que dans le cadre où elle a Ć©tĆ© dĆ©clarĆ©e. On dĆ©limite ce cadre entre les deux accolades entre lesquelles elle se trouve.Ā 

Ā 

Prenons ce code en exemple. Il y a deux variables qui sont crƩƩes: jour et heure. Tu peux voir un trait de couleur qui indique sur le cƓtƩ pendant combien de temps la variable existe:

  • La variable jour est crƩƩe au dĆ©but de la fonction. Elle existe donc jusqu’à ce qu’on atteigne la fermeture de la fonction! C’est pour Ƨa qu’on peut l’utiliser mĆŖme Ć  l’intĆ©rieur de la condition.Ā 
  • La variable heure, par contre, est crƩƩe Ć  l’intĆ©rieur de la condition. Elle n’existe donc plus quand on sort de la condition, ce qui explique pourquoi il y a une erreur quand on essaie de l’utiliser aprĆØs.Ā 

La leƧon importante Ć  retenir c’est qu’il faut toujours avoir en tĆŖte la portĆ©e d’une variable quand on la dĆ©clare! Une variable arrĆŖte d’exister dĆØs lors qu’on atteint l’accolade de fermeture du scope où elle se trouve.Ā 

VariablesĀ locales

Ce sont les variables que tu déclares dans les fonctions. Elles se déclarent de cette manière.

private void UneFonctionQuelconque() {
Ā  Ā  /* Du code … */
Ā  Ā  int level = 3;
Ā  Ā  /* Encore du code … */
}

On dit que la variable est locale car elle n’existe que dans la fonction où elle a Ć©tĆ© dĆ©clarĆ©e. Une fois sortie de la portĆ©e de la fonction, la variable n’existe plus.Ā 

Ā 

VariablesĀ globales

A la diffĆ©rence des variables locales, les variables globales existent en dehors d’une fonction. Elles persistent tant que le script est actif, et sont accessibles par toutes les fonctions de ce script.Ā 

Ā 

private int level;

private void UneFonctionQuelconque() {
Ā  Ā  /* Du code … */
Ā  Ā  level = 3;
Ā  Ā  /* Encore du code … */
}

As-tu remarquĆ© que la variable Ć©tait d’abord dĆ©clarĆ©e en dehors de la fonction? C’est ce qui en fait une variable globale! Il faut bien penser Ć  prĆ©ciser sa visibilitĆ© (publique ou privĆ©e)

Les tableaux

Bien souvent, tu auras besoin de ranger les Ć©lĆ©ments de ton jeu dans des collections: lister les ennemis, lister les obstacles, lister les points de sauvegarde…etc. Pour stocker ces listes, nous te recommandons d’utiliser une fonctionnalitĆ© trĆØs pratique du C#: les tableaux!

DƩclarer un tableau

int[] numeros = {10, 20, 30, 40};
string[] voitures = {« Volvo », « BMW », « Ford », « Mazda »};

Ces variables ne stockent pas une mais plusieurs valeurs!

Ā 

Lire un Ć©lement d’un tableau

Pour accĆ©der Ć  un Ć©lĆ©ment du tableau, on utilise son index (numĆ©ro reprĆ©sentant la position de l’élĆ©ment dans le tableau en partant de zĆ©ro)

voiture[0] /* va renvoyer « Volvo » */
voiture[2] /* va renvoyer « Ford » */

Attention! L’index commence toujours Ć  partir de zĆ©ro (et non de un)!

Par exemple, pour le tableau des numƩros un peu plus haut:

Ā 

Ā 

Obtenir la longueurĀ d’un tableau

Pour compter le nombre d’élĆ©ments contenus dans le tableau, on peut utiliser la propriĆ©tĆ© Length

voitures.Length
/*renvoie 4 puisque le tableau voitures contient 4 ƩlƩments*/

Ā 

Obtenir un Ć©lement alĆ©atoire d’un tableau

On peut utiliser Random.Range() pour obtenir un index entre 0 et le nombre d’élĆ©ments du tableau!

int aleatoire = Random.Range(0, nomDuTableau.Length);
nomDuTableau[aleatoire];

Variable Statique

Ā 

Il peut arriver que tu tombes sur des variables spĆ©ciales qui sont prĆ©cĆ©dĆ©es par le mot static. Tu peux ajouter static Ć  n’importe quelle variable globale pour en faire une variable statique. Mais alors? Qu’est-ce que c’est exactement?Ā 

La plupart des variables que tu crĆ©es sont considĆ©rĆ©es comme des variables membres. C’est-Ć -dire qu’elles appartiennent Ć  une instance spĆ©cifique. Les variables statiques, quant Ć  elles, appartiennent Ć  la classe en gĆ©nĆ©ral.

Si tu as une classe Ennemi avec la variable vie, chaque ennemi aura sa propre vie avec une valeur spécifique. Mais si tu en fais une variable statique, tous les ennemis partageront la même vie, peu importe qui a été touché!

Dans quel cas tu peux utiliser des variables statiques:
  • Pour stocker des variables qui sont communes Ć  tous tes objets
  • Pour stocker une variable sur la classe en entier plutĆ“t qu’un objet spĆ©cifique (exemple: le nombre d’ennemis prĆ©sents sur la scĆØne)
  • Pour stocker une information qui n’a pas besoin d’instance (comme le score)

CrĆ©er un Score (Modifier la valeur d’une variable d’un autre Script)

Ā 

Dans l’exemple qu’on va mettre en place, lorsque les Projectiles du Joueur dĆ©truit un Ennemi on gagne 10 Points, Ć  toi de l’adapter Ć  ton projet !

On va crĆ©er un UI > Text lĆ  où va s’afficher le texte Ć  l’écran. Si tu as besoin d’information concernant la mise en place d’un Texte Ć  l’écran rend toi sur la Fiche Ressources Menu & UI

On va crĆ©er un nouveau Script qu’on va nommer ā€œScoreScriptā€ puis donner ce Script Ć  l’Objet Text qu’on vient de crĆ©er Ć  l’instant. Voici le Script :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // ne pas oublier pour manipuler du text

public class ScoreScript : MonoBehaviour
{

Ā  Ā  public static int scoreValeur = 0; // Un static sera accessible de partout

    public Text Score; // On crée un emplacement de stockage nommé Score de type Text

Ā  Ā  // Start is called before the first frame update
Ā  Ā  void Start()
Ā  Ā  {
Ā  Ā  Ā  Ā  Score = GetComponent<Text>(); // RĆ©cupĆØre le composant Text qui est sur le gameObject Text et on l’associe Ć  Score
Ā  Ā  }

Ā  Ā  // Update is called once per frame
Ā  Ā  void Update()
Ā  Ā  {
        Score.text = « Score : «  + scoreValeur; // La variable scoreValeur associée au Text
Ā  Ā  }

}

Puis dans le Script qui dĆ©truit les Ennemies, on va rajouter un if qui prĆ©cise que si l’Ć©lĆ©ment est dĆ©truit par le Projectile alors on ajoute 10 points.

if(other.tag==cible) // pour vĆ©rifier que l’objet qu’on souhaite dĆ©truire a bien le mĆŖme tag que celui assignĆ© sur l’inspecteur
Ā  Ā  Ā  Ā  {
Ā  Ā  Ā  Ā  Ā  Ā  Destroy(other.gameObject); // DĆ©truire l’objet qui nous a touchĆ©

Ā  Ā  Ā  Ā  Ā  Ā  if(gameObject.tag == « ProjectileĀ Ā») // nouvelle ligne, cible l’Ć©lĆ©ment qui tue
Ā  Ā  Ā  Ā  Ā  Ā  {
                ScoreScript.scoreValeur += 10; // désigne le SCRIPT puis le nom de la Variable static
Ā  Ā  Ā  Ā  Ā  Ā  }
Ā  Ā  Ā  Ā  }

Attention :

Si le tag de l’élĆ©ment qui dĆ©truit les Ennemi se nomme ā€œEpeeā€ ou autre chose adapte ton code !

Et voilĆ  !

Par contre si tu as un Script qui redémarre la scène à la mort du héros ou quelque chose du genre, tu devras remettre le Score à Zéro dans ce Script.

Ā  Ā  void Update()
Ā  Ā  {
Ā  Ā  Ā  Ā  if (cible == null) // vĆ©rifie si l’objet n’existe plus sur la scĆØne
Ā  Ā  Ā  Ā  {
            SceneManager.LoadScene(prochaineScene); // passe à la scène qui porte le nom définie dans prochaineScene.
            ScoreScript.scoreValeur = 0;    // remettre le score à zéro                                   
Ā  Ā  Ā  Ā  }
Ā  Ā  }

Perdre / Gagner des points de vie

Ā 

Pour voir comment afficher des Variables ou du Texte Ć  l’Ć©cran, se rendre sur laĀ Fiche Ressources CanvasĀ 

AlƩatoire (Random)

Ā 
Retour en haut