派生自定义装饰器绘制器的基类。
DecoratorDrawer 类似于 PropertyDrawer,但它不绘制属性,而是根据其对应 PropertyAttribute 获取的数据绘制装饰元素。
Unity 使用内置的 DecoratorDrawer 来处理 SpaceAttribute 和 HeaderAttribute。您还可以创建自己的 DecoratorDrawer,并与匹配的 PropertyAttribute 配合使用。
虽然从概念上讲,DecoratorDrawer 不应与特定字段相关联,但其属性仍然需要放置在脚本中的字段上方。但是,与 PropertyDrawer 属性不同,可以在同一字段上方放置多个 DecoratorDrawers 属性。此外,与 PropertyDrawer 不同,如果在 List 或数组字段上方放置 DecoratorDrawer 属性,则装饰器只会显示在数组之前一次;而不是每个数组元素都显示。
注意:如果需要您的装饰器绘制器执行清理任务,例如从编辑器事件中分离自身,则可以实现 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"; }
属性 | 装饰器的 PropertyAttribute。(只读) |
CreatePropertyGUI | 重写此方法以根据 UIElements 为属性创建自己的 GUI。 |
GetHeight | 重写此方法以指定此装饰器的 GUI 高度(以像素为单位)。 |
OnGUI | 重写此方法以创建装饰器的自定义 GUI。请参阅 DecoratorDrawer,了解如何使用此方法的示例。 |