> 技术文档 > 【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】

【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】


3.2.3 如何创建自定义PropertyDrawer

上面二个unity给我们提供的,我们可以自定义Attrbute去实现自己想要的效果。这里举一个自定义PropertyDrawer的例子。假设我们有一个属性用于表示时间(以秒为单位)
三步走

1.定义特性类 (PropertyAttribute)

using System;using UnityEngine;/* 命名机制:XXXAttribute 类 → [XXX] 标记Unity 自动完成后缀匹配 */[AttributeUsage(AttributeTargets.Field)]public class TimeAttribute : PropertyAttribute{ }

2.创建 PropertyDrawer

using UnityEditor;using UnityEngine;using System;[CustomPropertyDrawer(typeof(TimeAttribute))]public class TimePropertyDrawer : PropertyDrawer{ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { if (property.propertyType == SerializedPropertyType.Float) { property.floatValue = EditorGUI.FloatField(new Rect(position.x, position.y, position.width * 0.6f, position.height), label, property.floatValue); EditorGUI.LabelField(new Rect(position.x + position.width * 0.6f, position.y, position.width * 0.4f, position.height), GetTimeFormat(property.floatValue)); } } private string GetTimeFormat(float time) { //取整获得总共的秒数 int l = Convert.ToInt32(time); //计算小时、分钟、秒 int hour = l / 3600; int minute = (l % 3600) / 60; int second = l % 3600 %60; return string.Format(\"{0:D2}:{1:D2}:{2:D2}\", hour, minute, second); }}

3. 使用自定义 PropertyDrawer

using UnityEngine;public class PropertyDrawerExample : MonoBehaviour{ //时间字段(自定义特性),这里是为什么是Time,请看第一步 [Time, SerializeField] private float duration = 596f; [Time, SerializeField] private int delay = 2;}

效果图
【第三章自定义检视面板_创建自定义编辑器_如何创建自定义PropertyDrawer(9/9)】

实际上,书上在本小节还举了二个例子,一个是为 Unity 中的 Color 类型属性提供了​​增强版的 Inspector 界面​​,在保留标准颜色选择器的基础上,添加了十六进制颜色输入和透明度独立控制功能,另一个是为 Unity 中的 Sprite 类型属性提供了​​增强版的 Inspector 显示​​,在保留标准精灵选择功能的基础上,添加了大型预览图和精灵名称显示功能。

下面给出链接,有需要还可以看看

1.扩展Color
2.扩展Sprite