用于派生自定义装饰器绘制器的基类。
DecoratorDrawer 类似于 PropertyDrawer,但它不绘制属性,而是纯粹基于从其对应的 PropertyAttribute 中获取的数据来绘制装饰元素。
Unity 对 SpaceAttribute 和 HeaderAttribute 使用内置的 DecoratorDrawer。您还可以使用匹配的 PropertyAttribute 创建您自己的 DecoratorDrawer。
尽管 DecoratorDrawer 从概念上讲并不意味着要与特定字段相关联,但其属性仍需放在脚本中的字段上。然而,与 PropertyDrawer 属性不同,同一字段上可以有多个 DecoratorDrawer 属性。同样与 PropertyDrawer 不同,如果 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; } }
这里的第二个脚本是指使用上面定义的 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"; }
attribute | 装饰器的 PropertyAttribute。(只读) |
CanCacheInspectorGUI | 重写此方法,以确定您的装饰器的检视面板 GUI 是否可以缓存。 |
CreatePropertyGUI | Override this method to make your own GUI for the property based on UIElements. |
GetHeight | 重写此方法,以指定此装饰器的 GUI 的高度(单位:像素)。 |
OnGUI | 重写此方法,以针对该装饰器构建您自己的 GUI。 请参阅 DecoratorDrawer,了解如何使用此方法的示例。 |
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.