Unity 3D: Перерисовываем инспектор - класс PropertyDrawer

Разработка редакторов - это просто!
Конечно, мы уже умеем перерисовывать инспектор с помощью класса Editor, но это далеко не единственный способ его изменения.
Если класс Editor порождал новый интерфейс для отдельного объекта, то класс PropertyDrawer, о котором пойдет речь - влияет на стандартное рисование объектов типа, подменяя его.
Например, вы можете изменить отображение всех стандартных полей int, описав его PropertyDrawer.
» Если не поняли разницу
На примере предыдущей главы:
CustomEditor класса Unit - это его кишки. Туда можно крепить превью, ссылаться на OnSceneGUI (рисование в сцене). Это происходит, когда объект непосредственно выбран.
PropertyDrawer класса Unit - это его обертка. Например, если какой-либо другой класс имеет поле типа Unit. То есть объект не выбран сам по себе, но отображается как часть чего-то другого.
Не будем бегать вокруг да около и изучим тело классов PropertyDrawer на примере:

Editor: IntDrawer.cs

using UnityEditor;
using UnityEngine;

[CustomPropertyDrawer(typeof(int))]
public class IntDrawer : PropertyDrawer
{
    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        
    }

    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        
    }
}
Такой класс во всех случаях должен:
  • наследоваться от PropertyDrawer
  • иметь атрибут [CustomPropertyEditor(typeof(<Наш класс, который будем перерисовывать>))]
Метод GetPropertyHeight позволяет вам изменить высоту элемента, если это необходимо. Однако, дописывать его вовсе не обязательно, зачастую хватает и стандартной "полоски".
Метод OnGUI, как вы могли догадаться - рисует элемент.
Значение напрямую использовать увы не получится, оно лежит в объекте property класса SerializedProperty. Данный класс позволяет хранить значение без указания конкретного типа и при этом его не "потерять".
Рассмотрим принцип действия на примере

Editor: пример IntDrawer.cs

using UnityEditor;
using UnityEngine;

[CustomPropertyDrawer(typeof(int))]
public class IntDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        property.intValue = EditorGUI.IntField(position, "Тестируем изменения", property.intValue);
    }
}
В результате для всех стандартных инспекторов тип int будет отображаться с лейблом "Тестируем изменения". Я конечно мастер практически бесполезных примеров, не правда ли?
Вот стандартный инспектор из старого примера с классом Unit:
Вот такая маленькая, но полезная фича (уж поверьте на слово!) предоставляется этим классом. Полезная она хотя бы потому, что в отличие от полей класса CustomEditor она так же позволяет работать с простыми классами, которые не наследуются от UnityEngine.Object.

Просмотров: 824

Комментарии пока отсутcтвуют