
Dans cette publication, je vais essayer de parler brièvement du type d'énumération en
C # , de son utilisation comme indicateurs, ainsi que de la façon de simplifier leur dessin dans l'inspecteur
Unity .
Qu'est-ce que Enum?
Les énumérations sont un type significatif en
C # , consistant en un ensemble de constantes. Le mot clé
enum est utilisé pour le déclarer. Chaque énumérateur a une valeur entière. La première valeur par défaut est
0 et les suivantes augmentent de
1 .
enum Color { Red,
Vous pouvez utiliser des initialiseurs pour remplacer des valeurs.
enum Color { Red = 1, Green = 2, Blue = 3 }
Chaque type d'énumération a un type de base, qui peut être n'importe quel type entier sauf
char (la valeur par défaut est
int ). Il peut également être spécifié explicitement.
enum Color : byte { Red = 1, Green = 2, Blue = 3 }
Drapeaux
Parfois, il devient nécessaire de doter une entité d'un certain nombre de propriétés. Vous pouvez déclarer plusieurs champs ou créer une liste, mais parfois une seule liste suffit. Pour utiliser l'énumération comme indicateurs, ajoutez l'attribut spécial
System.FlagsAttribute . Cela nécessite une initialisation explicite des valeurs, chacune étant élevée à une puissance.
[System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,
En utilisant l'opération
OR au niveau du bit, vous pouvez combiner des éléments d'énumération et en utilisant la
méthode HasFlag (Enum) , vérifier la présence de champs de bits dans une instance.
var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);
Vous pouvez également effectuer des vérifications à l'aide de l'opération
ET au niveau du bit.
var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;
Transferts dans Unity
Par exemple, prenez le code ci-dessous.
using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; }
Les outils
Unity intégrés vous permettent d'afficher les énumérations sous la forme d'une liste déroulante.

Malheureusement, l'éditeur ne peut pas dessiner automatiquement des énumérations sous forme de drapeaux. À ces fins, une redéfinition de l'inspecteur est nécessaire, ce qui est loin d'être toujours pratique. Mais vous pouvez opter pour l'astuce et redéfinir les énumérations de dessin à l'échelle mondiale. Tout d'abord, modifiez l'exemple.
using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; }
Ensuite, vous devez implémenter votre
PropertyDrawer . Si la propriété sérialisable a l'attribut
Flags , nous utiliserons la méthode
EditorGUI.MaskField pour le dessin, ou sinon la méthode
EditorGUI.PropertyField standard. Notez également qu'une propriété peut être un élément d'un tableau. Le code ci-dessous doit être placé dans un dossier appelé
Editor .
[CustomPropertyDrawer(typeof(Enum), true)] public sealed class EnumPropertyDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { using (new EditorGUI.PropertyScope(position, label, property)) { if (HasEnumFlagsAttribute()) { var intValue = EditorGUI.MaskField(position, label, property.intValue, property.enumDisplayNames); if (property.intValue != intValue) { property.intValue = intValue; } } else { EditorGUI.PropertyField(position, property, label); } } bool HasEnumFlagsAttribute() { var fieldType = fieldInfo.FieldType; if (fieldType.IsArray) { var elementType = fieldType.GetElementType(); return elementType.IsDefined(typeof(FlagsAttribute), false); } return fieldType.IsDefined(typeof(FlagsAttribute), false); } } }
Le champ s'affiche désormais correctement dans l'inspecteur pour tout type d'
énumération .

En plus de certaines valeurs d'énumération, l'éditeur en ajoute deux autres:
- Rien - a une valeur entière de 0 ;
- Tout - a une valeur entière de -1 .
Liens connexes