[Unity] 편집기에서 비트 작업(Bit) 편집
2985 단어 Unity
다음은 코드입니다.
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;
편집기에서 효과를 보세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
photonnetwork.instantiate에서 gamepobject 유형을 생성 한 다음 상태 및 값을 참조하는 방법주로 마지막 기사에서 일어난 일의 수정입니다. 지난번↓ 그럼 주제입니다. (타이틀이 정리되어 없어서 죄송합니다) 우선 전회의 Illegal view ID:0입니다만 photonnetwork.instantiate를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.