Menu
CoddyTech

Énumérations dans l’inspecteur

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

Un champ enum s’affiche sous forme de menu déroulant dans l’Inspector, ce qui en fait un moyen pratique de configurer des objets qui partagent un même script. Un prefab Pickup sert pour les pièces, les cœurs et les boucliers : chaque copie dans le niveau tire son type du menu déroulant, et le script effectue un switch sur cette valeur :

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 numéro : Coin vaut 0, Heart 1, Shield 2. Ajouter une valeur à la fin est sans risque. En insérer une au début, comme dans { Gem, Coin, Heart, Shield }, décale tous les numéros, et chaque pickup de chaque scène change de type. Renommer une valeur est sans risque, car son numéro reste le même. Écrire les numéros explicitement, Coin = 0, Heart = 1, Shield = 2, permet de réordonner les noms plus tard sans modifier les choix enregistrés.

Un enum [System.Flags] contient plusieurs valeurs à la fois. Son menu déroulant comporte une case à cocher par valeur, ainsi que Rien et Tout. 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 des valeurs : Element.Fire | Element.Poison vaut 5. HasFlag(x) vaut true lorsque toutes les valeurs de x sont définies, et ToString() liste les valeurs qui sont définies, sous la forme Fire, Poison.

challenge icon

Défi

Facile

La base a trois portes : le local de stockage nécessite la carte-clé rouge, le laboratoire la bleue et le coffre-fort les deux. Le needs de chaque porte et le card de chaque carte sont définis dans l’Inspector avec l’énumération Access, et Door.cs et Keycard.cs sont prêts. Les flèches déplacent le Player, dont le KeyRing contient les cartes ramassées. Termine KeyRing.cs :

  • Fais de Access une énumération dont les valeurs peuvent être combinées, afin qu’une porte puisse nécessiter plusieurs cartes et que l’anneau puisse en contenir plusieurs. Garde ses quatre noms : None, Red, Blue et Green.
  • Add(Access card) ajoute une carte à l’anneau, en conservant celles qui s’y trouvent déjà.
  • Opens(Access needs) renvoie true lorsque l’anneau contient toutes les cartes de needs.

Appuie sur Jouer, essaie les portes, ramasse les cartes, puis appuie 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)
    {
        // ajoute la carte au trousseau sans retirer celles qui s’y trouvent déjà
    }

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

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity