É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.
Défi
FacileFais en sorte qu’une porte nécessite plusieurs cartes-clés et que le trousseau puisse en contenir plusieurs.
- Dans
KeyRing.cs, place[System.Flags]au-dessus deAccesset attribue-lui les valeursNone = 0, Red = 1, Blue = 2, Green = 4. Add(Access card)conserve les cartes déjà présentes :cards |= card;.Opens(Access needs)renvoie true uniquement lorsque le trousseau contient toutes les cartes deneeds.
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
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtreEntraînez-vous par vous-même : Playground Unity