
Dalam publikasi ini, saya akan mencoba secara singkat berbicara tentang jenis enumerasi dalam 
C # , penggunaannya sebagai bendera, serta bagaimana menyederhanakan gambar mereka di inspektur 
Persatuan . 
Apa itu Enum?
Enumerasi adalah tipe signifikan dalam 
C # , yang terdiri dari seperangkat konstanta. Kata kunci 
enum digunakan untuk mendeklarasikannya. Setiap enumerator memiliki nilai integer. Yang pertama default ke 
0 , dan yang berikutnya bertambah 
1 .
enum Color { Red,  
Anda dapat menggunakan inisialisasi untuk mengganti nilai.
 enum Color { Red = 1, Green = 2, Blue = 3 } 
Setiap jenis enumerasi memiliki tipe dasar, yang dapat berupa tipe integer apa pun kecuali 
karakter (defaultnya adalah 
int ). Itu juga dapat ditentukan secara eksplisit.
 enum Color : byte { Red = 1, Green = 2, Blue = 3 } 
Bendera
Kadang-kadang menjadi perlu untuk memberkahi entitas dengan sejumlah properti. Anda dapat mendeklarasikan beberapa bidang atau membuat daftar, tetapi terkadang satu daftar saja sudah cukup. Untuk menggunakan enumerasi sebagai flag, tambahkan atribut 
System.FlagsAttribute atribut khusus. Ini membutuhkan inisialisasi eksplisit nilai-nilai, yang masing-masing dinaikkan menjadi kekuatan.
 [System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,  
Menggunakan operasi bitwise 
ATAU , Anda dapat menggabungkan elemen enumerasi, dan menggunakan metode 
HasFlag (Enum) , periksa keberadaan bidang bit dalam sebuah instance.
 var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);  
Anda juga dapat melakukan pemeriksaan menggunakan operasi 
AND bitwise.
 var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;  
Transfer dalam Persatuan
Misalnya, ambil kode di bawah ini.
 using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; } 
Alat 
Unity bawaan memungkinkan Anda untuk menampilkan enumerasi dalam bentuk daftar drop-down.

Sayangnya, editor tidak dapat secara otomatis menggambar enumerasi dalam bentuk bendera. Untuk tujuan ini, redefinisi inspektur diperlukan, yang jauh dari nyaman. Tapi Anda bisa menggunakan trik dan mendefinisikan ulang enumerasi menggambar secara global. Pertama, modifikasi contohnya.
 using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; } 
Selanjutnya, Anda perlu mengimplementasikan 
PropertyDrawer Anda. Jika properti serializable memiliki atribut 
Flags , maka kita akan menggunakan metode 
EditorGUI.MaskField untuk menggambar, dan sebaliknya metode 
EditorGUI.PropertyField standar. Perhatikan juga bahwa properti dapat menjadi elemen array. Kode di bawah ini harus ditempatkan dalam folder bernama 
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); } } } 
Sekarang bidang ditampilkan dengan benar di inspektur untuk semua jenis 
Enum .

Selain nilai enumerasi tertentu, editor menambahkan dua lagi:
- Tidak ada - memiliki nilai integer 0 ;
- Semuanya - memiliki nilai integer -1 .
Tautan Terkait