DecoratorDrawer
класс в UnityEditor
Наследуется от:GUIDrawer
Описание
Базовый класс, от которого наследуются пользовательские отрисовщики декораторов.
DecoratorDrawer похожа на PropertyDrawer, за исключением того, что он не рисует свойства, а рисует декоративные элементы, основанные исключительно на данных, которые он получает от соответствующих PropertyAttribute.
Unity использует встроенный DecoratorDrawers для SpaceAttribute и HeaderAttribute. Вы также можете создать свой собственный DecoratorDrawers с соответствующим PropertyAttributes.
Несмотря на то, что DecoratorDrawer концептуально не предназначен для ассоциации с конкретным полем, его атрибут все равно должен быть помещён над полем в скрипте. Однако, в отличие от атрибутов PropertyDrawer, над одним и тем же полем может быть несколько атрибутов DecoratorDrawers. Также в отличие от PropertyDrawers, если атрибут DecoratorDrawer помещен над полем, которое является List или массивом, декоратор появится только один раз перед массивом; не для каждого элемента массива.
Примечание: Если вам нужно, чтобы ящик декоратора выполнял задачи очистки, такие как отделение от событий редактора, вы можете реализовать IDisposable интерфейс. Он позволяет определить метод, который вызывается при уничтожении редактора, что даёт возможность выполнить необходимую очистку.
Приведенный ниже пример состоит из двух скриптов.
Первый скрипт определяет атрибут примера под названием "ColorSpacer", а затем определяет DecoratorDrawer, который определяет, как он должен быть отображен в инспекторе.
Второй скрипт — пример MonoBehaviour, который с помощью атрибута ColorSpacer визуально разделяет в инспекторе две группы открытых свойств.
// Name this script "ColorSpacerExample"
using UnityEngine; using System.Collections; using UnityEditor;
// This class defines the ColorSpacer attribute, so that // it can be used in your regular MonoBehaviour scripts:
public class ColorSpacer : PropertyAttribute { public float spaceHeight; public float lineHeight; public float lineWidth; public Color lineColor = Color.red;
public ColorSpacer(float spaceHeight, float lineHeight, float lineWidth, float r, float g, float b) { this.spaceHeight = spaceHeight; this.lineHeight = lineHeight; this.lineWidth = lineWidth;
// unfortunately we can't pass a color through as a Color object // so we pass as 3 floats and make the object here this.lineColor = new Color(r, g, b); } }
// This defines how the ColorSpacer should be drawn // in the inspector, when inspecting a GameObject with // a MonoBehaviour which uses the ColorSpacer attribute
[CustomPropertyDrawer(typeof(ColorSpacer))] public class ColorSpacerDrawer : DecoratorDrawer { ColorSpacer colorSpacer { get { return ((ColorSpacer)attribute); } }
public override float GetHeight() { return base.GetHeight() + colorSpacer.spaceHeight; }
public override void OnGUI(Rect position) { // calculate the rect values for where to draw the line in the inspector float lineX = (position.x + (position.width / 2)) - colorSpacer.lineWidth / 2; float lineY = position.y + (colorSpacer.spaceHeight / 2); float lineWidth = colorSpacer.lineWidth; float lineHeight = colorSpacer.lineHeight;
// Draw the line in the calculated place in the inspector EditorGUI.DrawRect(new Rect(lineX, lineY, lineWidth, lineHeight), colorSpacer.lineColor); } }
И этот второй скрипт является тем, который использует атрибут ColorSpacer, определенный выше:
using UnityEngine; using System.Collections;
public class ShowDecoratorDrawerExample : MonoBehaviour { public int a = 1; public int b = 2; public int c = 3;
// this shows our custom Decorator Drawer between the groups of properties [ColorSpacer(30, 3, 100, 1, 0, 0)]
public string d = "d"; public string e = "e"; public string f = "f"; }
На следующем скриншоте показано, как это выглядит в окне Inspector:
Свойства
| Свойство | Описание |
|---|---|
| attribute | PropertyAttribute для декоратора. (только для чтения) |
Открытые методы
| Метод | Описание |
|---|---|
| CreatePropertyGUI | Переопределите этот метод, чтобы создать свой собственный GUI для свойства, основанного на UIElements. |
| GetHeight | Переопределите этот метод, чтобы указать высоту GUI для этого декоратора в пикселях. |
| OnGUI | Переопределите этот метод, чтобы создать свой собственный GUI для декоратора. См. DecoratorDrawer для примера того, как это использовать. |