рдПрдХрддрд╛ рдореЗрдВ рдбреНрд░рд╛рдЗрдВрдЧ рдПрдирдо рдЭрдВрдбреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВ



рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ, рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ C # рдореЗрдВ рдПрдиреНрдпреВрдорд░реЗрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░, рдЭрдВрдбреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдпреВрдирд┐рдЯреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ рдЙрдирдХреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

Enum рдХреНрдпрд╛ рд╣реИ?


рдЧрдгрдирд╛ # рд╕реА рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреАрд╡рд░реНрдб рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдЧрдгрдХ рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдкрд╣рд▓реЗ 0 рдореЗрдВ рдЪреВрдХ рд╣реЛрддреА рд╣реИ, рдФрд░ рдмрд╛рдж рдореЗрдВ 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 } 

рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдпрд╛ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдиреНрдпреВрдорд░реЗрд╢рди рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд┐рдЯ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╣реИрд╕рдлрд╝реНрд▓реИрдЧ (рдПрдирдо) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 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; } 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреНрд░реЙрдкрд░реНрдЯреАрд╡реЗрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реАрд░рд┐рдпрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЭрдВрдбреЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП 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); } } } 

рдЕрдм рдХрд┐рд╕реА рднреА Enum рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдирд┐рд░реАрдХреНрд╖рдХ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



рдХреБрдЫ рдЧрдгрдирд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдкрд╛рджрдХ рджреЛ рдФрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:

  • рдХреБрдЫ рдирд╣реАрдВ - 0 рдХрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╣реИ;
  • рд╕рдм рдХреБрдЫ - рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди -1 рд╣реИ ред

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ


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


All Articles