
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