تبسيط رسم التعداد الأعلام في الوحدة



في هذا المنشور ، سأحاول أن أتحدث بإيجاز عن نوع التعداد في C # ، واستخدامه كأعلام ، وكذلك كيفية تبسيط الرسم في مفتش Unity .

ما هو التعداد؟


تعد التعدادات نوعًا مهمًا في C # ، وتتألف من مجموعة من الثوابت. يتم استخدام التعداد الكلمة الأساسية لإعلان ذلك. كل العداد له قيمة عدد صحيح. يتم تعيين القيمة الافتراضية الأولى إلى صفر ، وتزيد القيم الافتراضية التالية بمقدار 1 .

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

يمكنك استخدام أدوات التهيئة لتجاوز القيم.

 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, // 2 ^ 0 Green = 2, // 2 ^ 1 Blue = 4 // 2 ^ 2 } 

باستخدام عملية bitwise OR ، يمكنك الجمع بين عناصر التعداد ، وباستخدام طريقة HasFlag (Enum) ، تحقق من وجود حقول البت في مثيل.

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

يمكنك أيضًا إجراء اختبارات باستخدام عملية AND .

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

التحويلات في الوحدة


على سبيل المثال ، خذ الكود أدناه.

 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 .

روابط ذات صلة


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


All Articles