
في هذا المنشور ، سأحاول أن أتحدث بإيجاز عن نوع التعداد في
C # ، واستخدامه كأعلام ، وكذلك كيفية تبسيط الرسم في مفتش
Unity .
ما هو التعداد؟
تعد التعدادات نوعًا مهمًا في
C # ، وتتألف من مجموعة من الثوابت.
يتم استخدام
التعداد الكلمة الأساسية لإعلان ذلك. كل العداد له قيمة عدد صحيح. يتم تعيين القيمة الافتراضية الأولى إلى
صفر ، وتزيد القيم الافتراضية التالية بمقدار
1 .
enum Color { Red,
يمكنك استخدام أدوات التهيئة لتجاوز القيم.
enum Color { Red = 1, Green = 2, Blue = 3 }
كل نوع من أنواع التعداد له نوع أساسي ، والذي يمكن أن يكون أي نوع صحيح ما عدا
الحرف (الافتراضي هو). ويمكن أيضا أن تكون محددة صراحة.
enum Color : byte { Red = 1, Green = 2, Blue = 3 }
الأعلام
في بعض الأحيان يصبح من الضروري تزويد كيان بعدد من الخصائص. يمكنك إعلان حقول متعددة أو إنشاء قائمة ، ولكن في بعض الأحيان تكون قائمة واحدة كافية. لاستخدام التعداد كعلامات ، أضف السمة الخاصة
System.FlagsAttribute . يتطلب ذلك تهيئة واضحة للقيم ، يتم رفع كل منها إلى قوة.
[System.FlagsAttribute] enum Color : byte { None = 0, Red = 1,
باستخدام عملية bitwise
OR ، يمكنك الجمع بين عناصر التعداد ، وباستخدام طريقة
HasFlag (Enum) ، تحقق من وجود حقول البت في مثيل.
var color = Color.Red | Color.Green | Color.Blue; var hasFlag = color.HasFlag(Color.Red | Color.Green);
يمكنك أيضًا إجراء اختبارات باستخدام عملية
AND .
var aColor = Color.Red | Color.Green; var bColor = Color.Green | Color.Blue;
التحويلات في الوحدة
على سبيل المثال ، خذ الكود أدناه.
using UnityEngine; public enum Color { Red, Green, Blue } public class Example : MonoBehaviour { public Color Color; }
تتيح لك أدوات
الوحدة المدمجة عرض التعدادات في قائمة منسدلة.

لسوء الحظ ، لا يمكن للمحرر رسم التعدادات تلقائيًا في صورة أعلام. لهذه الأغراض ، يجب إعادة تعريف المفتش ، وهو أمر غير مناسب دائمًا. ولكن يمكنك أن تذهب للخدعة وإعادة تعريف تعدادات الرسم على مستوى العالم. أولاً ، قم بتعديل المثال.
using System; using UnityEngine; [Flags] public enum Color { Red = 1, Green = 2, Blue = 4 } public class Example : MonoBehaviour { public Color Color; }
بعد ذلك ، تحتاج إلى تطبيق
PropertyDrawer الخاص بك. إذا كانت الخاصية
القابلة للتسلسل تحتوي على السمة
Flags ،
فبالنسبة للرسم ،
سنستخدم أسلوب
EditorGUI.MaskField ، وإلا فإن طريقة
EditorGUI.PropertyField القياسية. لاحظ أيضًا أن الخاصية يمكن أن تكون عنصرًا في صفيف. يجب وضع الكود أدناه في مجلد يسمى
المحرر .
[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); } } }
الآن يتم عرض الحقل بشكل صحيح في المفتش لأي نوع
التعداد .

بالإضافة إلى بعض قيم التعداد ، يضيف المحرر اثنين آخرين:
- لا شيء - له قيمة عددية 0 ؛
- كل شيء - له قيمة عددية -1 .
روابط ذات صلة