[UNITY/C#] Accéder à une variable dans un autre script

[UNITY/C#] Accéder à une variable dans un autre script

Dans cet article, on va s’attaquer à un problème auquel un certain nombre de débutants se trouvent confronter (je suis passé par là et j’aurais bien aimé avoir cet article à ce moment-là !). Comment accéder à une variable dans un autre script ?

En POO (programmation orientée objet), mettre une variable en public pour pouvoir y accéder dans n’importe quelle autre classe en utilisant « nomDeLaClasse.laVariable » est très fortement déconseillé. Prenons l’exemple de la santé du joueur.

public class Player
{
  public int hp = 100;
};

Ici on va déclarer notre variable public de type int et lui affecter la valeur 100. Cette variable étant public, on peut imaginer que dans une classe gérant les ennemis, on va pouvoir utiliser « Player.hp = Player.hp – 10 ». Dans cet exemple, on ne contrôle pas du tout notre variable (pourquoi pas donner une valeur négative? ou mettre 20000 d’hp?). C’est pour cela que l’on va utiliser des getter/setter.

I – Les getters/setters

Voyez donc cet exemple.

public class Player
{
  private int hp = 100;

  public int getHP()
  {
    return hp; // On renvoie la valeur des points de santé du joueur
  }

  public void setHP(int value)
  {
    hp = value;
    if (hp < 0) // On limite la valeur entre 0 et 100
      hp = 0;
    if (hp > 100)
      hp = 100;
  }
};

Voilà, notre variable est privée donc on ne peut plus y accéder à l’aide d’un simple « Player.hp » mais on peut récupérer la valeur de santé en faisant « Player.getHP() » et la fixer à 50 en faisant par exemple « Player.setHP(50) ». On pourrait imaginer une fonction qui fait des dégâts aux joueurs en évitant de la faire passer sous la barre du 0, la fonction ressemblerait à :

public void dealDamage(int value)
{
  if (value > 0) // On vérifie que la valeur est bien positive
  {
    hp -= value;
    if (hp < 0) // On vérifie que les points de santé ne sont pas devenus négatifs
      hp = 0;
  }
}

Et voilà vous pouvez maintenant attaquer le joueur dans votre classe gérant les ennemis. Pour faire encore mieux, vous pouvez créer une classe Entity avec ces fonctions et faire hériter vos classes Player et Enemy de cette classe. Votre Enemy aura donc aussi des hp et votre joueur sera capable de l’attaquer. Dit comme ça, ça à l’air tout gentil tout beau mais il manque une chose. Comment le jeu peut savoir quel monstre attaquer ?

Une solution ressemblerait à ceci :

public class Player
{
  private Enemy enemy;

  void Start()
  {
    // Unity va chercher un objet de votre scène ayant la classe Enemy dans un de ces scripts
    // Vous pouvez aussi récupérer un tableau contenant tous les objets ayant la classe Enemy en utilisant FindObjectsOfType() (cf docs)
    enemy = FindObjectOfType(typeof(Enemy)) as Enemy;
  }

  void Update()
  {
    if (Input.GetKeyDown(KeyCode.A))
      enemy.dealDamage(10);
  }
 }

Sachez que si vous voulez gérer une variable qui n’est présente qu’une seule fois dans votre jeu, par exemple le score, vous pouvez mettre cette variable en static. Le mot-clef static permet en effet d’avoir une variable appartenant à une classe, sans devoir récupérer l’objet contenant cette variable. Reprenons l’exemple du score :

public class Player
{
  private static int score;

  public static int getScore() // Pour pouvoir utiliser une variable static dans une fonction, il faut qu'elle ait le mot-clef static
  {
    return score;
  }

  public static void addScore(int nb)
  {
    if (nb > 0)
      score += nb;
  }
}

Si vous voulez afficher le score en utilisant un script placé sur votre objet de texte, vous n’aurez qu’à utiliser « Player.getScore() ». Si vous ajoutez 100 points à chaque fois qu’un objet est récupéré, il suffira de faire « Player.addScore(100) » juste avant de détruire votre objet avec « Destroy(this.gameObject) ».

N’hésitez pas à lire un peu la doc Unity au niveau des fonctions que j’utilise dans ce tuto. Les commentaires sont aussi là si vous avez des questions.

 

RSS
Facebook
Facebook

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Tu as aimé l'article? Partage le blog !