Конечно, мы уже умеем перерисовывать инспектор с помощью класса Editor, но это далеко не единственный способ его изменения.
Если класс Editor порождал новый интерфейс для отдельного объекта, то класс PropertyDrawer, о котором пойдет речь - влияет на стандартное рисование объектов типа, подменяя его.
Например, вы можете изменить отображение всех стандартных полей int, описав его PropertyDrawer.
Если класс Editor порождал новый интерфейс для отдельного объекта, то класс PropertyDrawer, о котором пойдет речь - влияет на стандартное рисование объектов типа, подменяя его.
Например, вы можете изменить отображение всех стандартных полей int, описав его PropertyDrawer.
Если не поняли разницу
На примере предыдущей главы:
CustomEditor класса Unit - это его кишки. Туда можно крепить превью, ссылаться на OnSceneGUI (рисование в сцене). Это происходит, когда объект непосредственно выбран.
PropertyDrawer класса Unit - это его обертка. Например, если какой-либо другой класс имеет поле типа Unit. То есть объект не выбран сам по себе, но отображается как часть чего-то другого.
Не будем бегать вокруг да около и изучим тело классов PropertyDrawer на примере:
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. Данный класс позволяет хранить значение без указания конкретного типа и при этом его не "потерять".
Рассмотрим принцип действия на примере
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:
Вот стандартный инспектор из старого примера с классом Unit:
Вот такая маленькая, но полезная фича (уж поверьте на слово!) предоставляется этим классом. Полезная она хотя бы потому, что в отличие от полей класса CustomEditor она так же позволяет работать с простыми классами, которые не наследуются от UnityEngine.Object.