프로퍼티들이 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를 오버라이딩하여 정할 수 있음