Описание
Базовый класс, из которого создаются настраиваемые ящики декоратора.
DecoratorDrawer похож на PropertyDrawer, за исключением того, что он рисует не свойство, а декоративные элементы исключительно на основе данных, которые он получает от соответствующего Атрибут свойства.
Unity использует встроенные DecoratorDrawers для SpaceAttribute и HeaderAttribute. Вы также можете создать свои собственные DecoratorDrawers с соответствующими атрибутами PropertyAttributes.
Хотя концептуально DecoratorDrawer не предназначен для связи с конкретным полем, его атрибут все же необходимо разместить над полем в скрипте. Однако, в отличие от атрибутов PropertyDrawer, над одним и тем же полем может быть несколько атрибутов DecoratorDrawers. Кроме того, в отличие от PropertyDrawers, если атрибут DecoratorDrawer размещен над полем, которое является списком или массивом, декоратор будет отображаться только один раз перед массивом; не для каждого элемента массива.
Нижеприведенный пример состоит из двух скриптов.
Первый скрипт определяет атрибут примера под названием "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
// (using the built in white pixel texture, tinted with GUI.color)
Color oldGuiColor = GUI.color;
GUI.color = colorSpacer.lineColor;
EditorGUI.DrawPreviewTexture(new Rect(lineX, lineY, lineWidth, lineHeight), Texture2D.whiteTexture);
GUI.color = oldGuiColor;
}
}
И этот второй скрипт использует атрибут ColorSpace, определенный выше:
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";
}
Свойства
attribute | PropertyAttribute для декоратора. (Только чтение) |
Публичные Методы
CanCacheInspectorGUI | Переопределите этот метод, чтобы определить, можно ли кэшировать графический интерфейс инспектора для вашего декоратора. |
GetHeight | Переопределите этот метод, чтобы указать высоту графического интерфейса для этого декоратора в пикселях. |
OnGUI | Переопределите этот метод, чтобы создать собственный графический интерфейс для декоратора. См. DecoratorDrawer для примера того, как это использовать. |