Custom property drawer

ㅋㅋ·2022년 9월 7일
0

프로퍼티들이 EditorGUILayout.PropertyField 함수를 통해 그려지는 것을 재정의할 수 있음

[CustomPropertyDrawer(typeof(PlayerData))]
public class PlayerDataDrawer : PropertyDrawer
{
    ...
}

PropertyDrawer를 상속받는 클래스 생성

어트리뷰트로 CustomPropertyDrawer에 데이터의 타입을 입력


public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
    GUI.Box(position, GUIContent.none, GUI.skin.window);

    EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
    {
        EditorGUI.indentLevel++;

        float height = GUIStyle.none.CalcSize(label).y;

        var rect = new Rect(position.x, position.y + height + 1, position.width, height);

        foreach (SerializedProperty item in property)
        {
            GUI.color = new Color(Random.value, Random.value, Random.value);
            EditorGUI.PropertyField(rect, item);
            rect.y += (height + 1);
        }

        GUI.color = Color.white;

        EditorGUI.indentLevel--;
    }
}

어떻게 그려질지를 OnGUI를 오버라이딩하여 구현

PropertyDrawer의 OnGUI에서는 레이아웃 클래스를 사용할 수 없다.

position에는 그려질 UI의 전체 Rect가 설정되고

property에는 표시하려는 데이터 클래스의 내부 프로퍼티들까지 모두 담겨져 있다.


public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
    int count = 0;
    foreach (var item in property)
    {
        count++;
    }

    return EditorGUIUtility.singleLineHeight * (count + 1) + 10;
}

위에서 그려질때 사용하는 position의 높이를 (데이터를 표시할 UI의 높이)

GetPropertyHeight를 오버라이딩하여 정할 수 있음

0개의 댓글