【第三章自定义检视面板_创建自定义编辑器_如何创建自定义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;}
效果图
实际上,书上在本小节还举了二个例子,一个是为 Unity 中的 Color 类型属性提供了增强版的 Inspector 界面,在保留标准颜色选择器的基础上,添加了十六进制颜色输入和透明度独立控制功能,另一个是为 Unity 中的 Sprite 类型属性提供了增强版的 Inspector 显示,在保留标准精灵选择功能的基础上,添加了大型预览图和精灵名称显示功能。
下面给出链接,有需要还可以看看