
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,
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,
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);
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;
Ü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