Simplifiez le dessin des drapeaux Enum dans Unity



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, // 0 Green, // 1 Blue // 2 } 

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, // 2 ^ 0 Green = 2, // 2 ^ 1 Blue = 4 // 2 ^ 2 } 

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); // True 

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; //     var contains = (aColor & bColor) == bColor; // False //     var overlaps = (aColor & bColor) != 0; // True 

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


Source: https://habr.com/ru/post/fr456852/


All Articles