[Unity] 편집기에서 비트 작업(Bit) 편집

2985 단어 Unity
어떤 때는 데이터를 효율적으로 이용하려고 int(32비트)를 32개의bool값으로 쪼개기도 한다.그러면 편집기에 이런 플러그인 지원이 있습니까?
다음은 코드입니다.
 
using UnityEngine;
using UnityEditor;
using System;
using System.Collections;
using System.Reflection;
 
public enum MyEnum
{
	Enum1 = 1,
	Enum2 = 2,
}
 
public class MyEnumFieldName
{
	public const string Enum1 = @"   ";
	public const string Enum2 = @"   ";
}
 
public class BitMaskAttribute : PropertyAttribute
{
	public BitMaskAttribute()
	{
	}
}
 
[CustomPropertyDrawer(typeof(BitMaskAttribute))]
public class BitMaskDrawer : PropertyDrawer
{
    private float extraHeight = 20.0f;
    private static bool showValues = true;
    private bool hasError = false;
 
    public string GetFieldName(string enumName)
    {
        string className = string.Format("{0}FieldName", this.fieldInfo.FieldType.Name);
        Type classType = Type.GetType(className);
        if (classType != null)
        {
            FieldInfo fi = classType.GetField(enumName);
            if (fi != null)
            {
                return fi.GetValue(null).ToString();
            }
        }
 
        return enumName;
    }
 
    public override void OnGUI(Rect position, SerializedProperty prop, GUIContent label)
    {
        if (CheckInvalid(position, prop, label))
        {
            return;
        }
 
        showValues = EditorGUI.Foldout(new Rect(position.x, position.y, position.width, extraHeight), showValues, label);
 
        if (!showValues)
        {
            return;
        }
 
        EditorGUI.indentLevel++;
 
        for (int i = 0; i < prop.enumNames.Length; i++)
        {
            bool toggleValue = (prop.intValue & (1 << i)) == (1 << i);
 
            Rect rect = new Rect(position.x, position.y + ((i + 1) * extraHeight), position.width, extraHeight);
            string enumTitle = GetFieldName(prop.enumNames [i]);
            if (EditorGUI.Toggle(rect, enumTitle, toggleValue))
            {
                prop.intValue |= 1 << i;
            } else
            {
                prop.intValue &= ~(1 << i);
            }
        }
    }
 
    private bool CheckInvalid(Rect position, SerializedProperty prop, GUIContent label)
    {
        if (prop.propertyType != SerializedPropertyType.Enum)
        {
            showValues = false;
            hasError = true;
            return true;
        }
 
        return false;
    }
 
    public override float GetPropertyHeight(SerializedProperty prop, GUIContent label)
    {
        if (!showValues)
        {
            if (!hasError)
            {
                return base.GetPropertyHeight(prop, label);
            } else
            {
                return base.GetPropertyHeight(prop, label) + extraHeight;
            }
        }
        return base.GetPropertyHeight(prop, label) * (prop.enumNames.Length + 3);
    }
}

사용할 때는 간단하다. 한마디만 하면 된다.
[BitMask] public MyEnum enumData;
편집기에서 효과를 보세요.

좋은 웹페이지 즐겨찾기