Vereinfachen Sie das Zeichnen von Enum Flags in Unity



In dieser Veröffentlichung werde ich versuchen, kurz auf die Art der Aufzählung in C # , ihre Verwendung als Flags sowie auf die Vereinfachung ihrer Zeichnung im Unity- Inspektor einzugehen.

Was ist Enum?


Aufzählungen sind ein wichtiger Typ in C # , der aus einer Reihe von Konstanten besteht. Das Schlüsselwort enum wird verwendet, um es zu deklarieren. Jeder Enumerator hat einen ganzzahligen Wert. Der erste ist standardmäßig 0 und die nachfolgenden erhöhen sich um 1 .

enum Color { Red, // 0 Green, // 1 Blue // 2 } 

Sie können Initialisierer verwenden, um Werte zu überschreiben.

 enum Color { Red = 1, Green = 2, Blue = 3 } 

Jeder Aufzählungstyp hat einen Basistyp, der ein beliebiger ganzzahliger Typ außer char sein kann (der Standardwert ist int ). Es kann auch explizit angegeben werden.

 enum Color : byte { Red = 1, Green = 2, Blue = 3 } 

Flaggen


Manchmal ist es erforderlich, eine Entität mit einer Reihe von Eigenschaften auszustatten. Sie können mehrere Felder deklarieren oder eine Liste erstellen, aber manchmal reicht eine einzige Liste aus. Um die Aufzählung als Flags zu verwenden, fügen Sie das spezielle Attribut System.FlagsAttribute hinzu . Dies erfordert eine explizite Initialisierung von Werten, von denen jeder zu einer Potenz erhoben wird.

 [System.FlagsAttribute] enum Color : byte { None = 0, Red = 1, // 2 ^ 0 Green = 2, // 2 ^ 1 Blue = 4 // 2 ^ 2 } 

Mit der bitweisen ODER- Verknüpfung können Sie Aufzählungselemente kombinieren und mithilfe der HasFlag- Methode (Enum) prüfen, ob in einer Instanz Bitfelder vorhanden sind.

 var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green); // True 

Sie können Überprüfungen auch mit der bitweisen UND- Operation durchführen.

 var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue; //     var contains = (aColor & bColor) == bColor; // False //     var overlaps = (aColor & bColor) != 0; // True 

Übertragungen in Einheit


Nehmen Sie zum Beispiel den folgenden Code.

 using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; } 

Mit den integrierten Unity- Tools können Sie Aufzählungen in einer Dropdown-Liste anzeigen.



Leider kann der Editor keine Aufzählungen in Form von Flags automatisch zeichnen. Zu diesem Zweck ist eine Neudefinition des Inspektors erforderlich, was bei weitem nicht immer zweckmäßig ist. Sie können sich jedoch für den Trick entscheiden und Zeichnungsaufzählungen global neu definieren. Ändern Sie zunächst das Beispiel.

 using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; } 

Als Nächstes müssen Sie Ihren PropertyDrawer implementieren. Wenn die serialisierbare Eigenschaft das Flags- Attribut hat, verwenden wir die EditorGUI.MaskField- Methode zum Zeichnen und ansonsten die Standard- EditorGUI.PropertyField- Methode. Beachten Sie auch, dass eine Eigenschaft ein Element eines Arrays sein kann. Der folgende Code sollte in einem Ordner namens Editor abgelegt werden.

 [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); } } } 

Jetzt wird das Feld im Inspektor für jeden Aufzählungstyp korrekt angezeigt.



Zusätzlich zu bestimmten Aufzählungswerten fügt der Editor zwei weitere hinzu:

  • Nichts - hat einen ganzzahligen Wert von 0 ;
  • Alles - hat einen ganzzahligen Wert von -1 .

Verwandte Links


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


All Articles