Menu
CoddyTech

Énumérations dans l’Inspecteur

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 20 sur 64.

Un champ d’énumération apparaît dans l’Inspector sous forme de liste déroulante, ce qui en fait un moyen pratique de configurer des objets qui partagent le même script. Un prefab Pickup sert pour les pièces, les cœurs et les boucliers : chaque copie dans le niveau reçoit son type depuis la liste déroulante, et le script effectue un branchement selon ce type :

public enum PickupKind { Coin, Heart, Shield }

public class Pickup : MonoBehaviour
{
    public PickupKind kind;
    public int amount = 1;

    void OnTriggerEnter(Collider other)
    {
        if (!other.TryGetComponent(out PlayerStats stats)) return;
        switch (kind)
        {
            case PickupKind.Coin: stats.coins += amount; break;
            case PickupKind.Heart: stats.hp += amount; break;
            case PickupKind.Shield: stats.shielded = true; break;
        }
        Destroy(gameObject);
    }
}

La scène enregistre chaque choix sous forme de valeur numérique : Coin vaut 0, Heart 1 et Shield 2. Ajouter une valeur à la fin ne présente aucun risque. En insérer une au début, comme dans { Gem, Coin, Heart, Shield }, décale tous les nombres, et chaque objet à ramasser dans chaque scène change de type. Renommer une valeur ne présente aucun risque, puisque son nombre reste le même. Écrire les nombres explicitement, Coin = 0, Heart = 1, Shield = 2, permet de réordonner les noms plus tard sans déplacer aucun choix enregistré.

Une énumération [System.Flags] contient plusieurs valeurs à la fois. Sa liste déroulante affiche une case à cocher pour chaque valeur, ainsi que Nothing et Everything. Chaque valeur doit avoir son propre bit, les nombres sont donc des puissances de deux :

[System.Flags]
public enum Element { None = 0, Fire = 1, Ice = 2, Poison = 4 }

public Element immuneTo;   // cochés dans l’Inspector : Fire et Poison

public void Hit(int damage, Element element)
{
    if (immuneTo.HasFlag(element)) return;
    hp -= damage;
}

| combine les valeurs : Element.Fire | Element.Poison vaut 5. HasFlag(x) renvoie true lorsque toutes les valeurs de x sont définies, et ToString() répertorie les valeurs définies, sous la forme Fire, Poison.

challenge icon

Défi

Facile

Fais en sorte qu’une porte nécessite plusieurs cartes-clés et que le trousseau puisse en contenir plusieurs.

  1. Dans KeyRing.cs, place [System.Flags] au-dessus de Access et attribue-lui les valeurs None = 0, Red = 1, Blue = 2, Green = 4.
  2. Add(Access card) conserve les cartes déjà présentes : cards |= card;.
  3. Opens(Access needs) renvoie true uniquement lorsque le trousseau contient toutes les cartes de needs.

Clique sur « Jouer » et ramasse les deux cartes : le coffre-fort s’ouvre. Puis clique sur « Vérifier ».

Essayez vous-même

using UnityEngine;

public enum Access { None, Red, Blue, Green }

public class KeyRing : MonoBehaviour
{
    public Access cards;

    public void Add(Access card)
    {
        // ajouter la carte au trousseau en conservant les cartes déjà présentes
    }

    public bool Opens(Access needs)
    {
        // vrai si le trousseau contient toutes les cartes indiquées dans needs
        return false;
    }
}

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity