3.2 PropertyDrawer
PropertyDrawer 是Unity编辑器扩展的核心工具,用于自定义序列化属性在Inspector中的显示方式。它通过重写属性的绘制逻辑,让属性显示可以自定义
3.2.1 内置的PropertyDrawer
Unity 内置了多种 PropertyDrawer,用于优化常用数据类型的 Inspector 显示效果。
Unity Inspector 属性 & PropertyDrawer 表
属性/类型 | 对应 PropertyDrawer | 功能描述 | 使用示例 | 适用类型 | UI 效果 |
---|---|---|---|---|---|
RangeAttribute | RangeDrawer | 将数值显示为滑动条 | [Range(0, 100)] public float health; | float , int | 带最小/最大值的滑动条 |
HeaderAttribute | HeaderDrawer | 添加分组标题 | [Header("Player Settings")] public string name; | 任意 | 灰色背景的分组标题 |
SpaceAttribute | SpaceDrawer | 添加垂直间距 | [Space(20)] public float bonus; | 任意 | 指定高度的空白区域 |
TooltipAttribute | TooltipDrawer | 添加悬停提示 | [Tooltip("Health points")] public int hp; | 任意 | 鼠标悬停时显示提示文本 |
ColorUsageAttribute | ColorUsageDrawer | 高级颜色选择器 | [ColorUsage(true)] public Color effectColor; | Color | 支持 HDR / Alpha 的颜色选择器 |
Enum | EnumDrawer | 枚举下拉菜单 | public PlayerClass playerClass; | 所有枚举 | 下拉选择框 |
LayerAttribute | LayerFieldDrawer | 层级选择器 | [Layer] public int targetLayer; | int | Unity 层级下拉菜单 |
TagAttribute | TagFieldDrawer | 标签选择器 | [Tag] public string targetTag; | string | Unity 标签下拉菜单 |
Gradient | GradientDrawer | 渐变编辑器 | public Gradient damageColor; | Gradient | 渐变编辑面板 |
AnimationCurve | CurveDrawer | 曲线编辑器 | public AnimationCurve moveCurve; | AnimationCurve | 曲线编辑面板 |
MultilineAttribute | MultilineDrawer | 多行文本输入 | [Multiline] public string description; | string | 多行文本区域 |
TextAreaAttribute | TextAreaDrawer | 可滚动文本区域 | [TextArea(3, 10)] public string bio; | string | 带滚动条的多行文本框 |
DelayedAttribute | DelayedDrawer | 延迟更新字段 | [Delayed] public float value; | int , float , string | 输入后需确认或失去焦点才更新 |
MinAttribute | MinDrawer | 最小值限制 | [Min(0)] public int score; | int , float | 输入值低于最小值时自动修正 |
ContextMenuItem | ContextMenuItemDrawer | 右键菜单选项 | [ContextMenuItem("Reset", "ResetValue")] public int value; | 任意 | 字段右键显示自定义菜单 |
SerializeReference | SerializeReferenceDrawer | 多态序列化 | [SerializeReference] public IWeapon weapon; | 接口 / 基类 | 显示具体类型选择下拉框 |
Vector Fields | VectorDrawer | 向量字段 | public Vector3 position; | Vector2 , Vector3 , Vector4 | 紧凑的多个浮点数字段 |
Rect | RectDrawer | 矩形编辑器 | public Rect area; | Rect | X / Y / 宽 / 高 四个字段 |
Bounds | BoundsDrawer | 边界编辑器 | public Bounds area; | Bounds | 中心点 + 尺寸编辑字段 |
Quaternion | QuaternionDrawer | 四元数编辑器 | public Quaternion rotation; | Quaternion | 欧拉角显示 (X / Y / Z) |
FixedBuffer | FixedBufferDrawer | 固定缓冲区 | public fixed float buffer[10]; | fixed buffer | 数组式字段显示 |
使用提示:所有特性均需在
using UnityEngine;
命名空间下使用,部分特性(如SerializeReference
)需配合System.Serializable
接口或基类使用。
举个栗子,代码如下
using UnityEngine;
public class PropertyDrawerExample : MonoBehaviour
{
//内置PropertyDrawer 示例
// 带范围限制的浮点数字段
[Range(4f, 10f)] // Inspector 显示滑块控制(4-10范围)
[SerializeField] private float radius = 5f;
// 带最小值限制的浮点数字段
[Min(4f)] // 自动限制输入最小值(可手动输入大于4的值)
[SerializeField] private float radius2 = 5f;
// 多行文本输入(固定高度)
[Multiline(5), SerializeField] // 显示5行高度的文本框(带滚动条)
private string text = "Hello World.\r\nToday is a good day.";
// 无限高度的文本区域
[TextArea, SerializeField] // 可自由拖拽调整高度的文本区
private string text2 = "Hello World.\r\nToday is a good day.\r\nThis is a TextArea with no line limit.";
// 高级颜色选择器
[ColorUsage(true, true), SerializeField] // 带HDR和Alpha控制的颜色选择器
private Color color = Color.white;
// 渐变编辑器(标准设置)
[GradientUsage(false, ColorSpace.Gamma), SerializeField]
private Gradient gradient; // 非HDR,Gamma色彩空间的渐变编辑器
}
效果图