Конечно, мы уже умеем перерисовывать инспектор с помощью класса Editor, но это далеко не единственный способ его изменения.
Если класс 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:
Вот такая маленькая, но полезная фича (уж поверьте на слово!) предоставляется этим классом. Полезная она хотя бы потому, что в отличие от полей класса CustomEditor она так же позволяет работать с простыми классами, которые не наследуются от UnityEngine.Object.
Смотрите также:
Комментарии
Здесь еще никто не оставил комментарий
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]