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 显示,在保留标准精灵选择功能的基础上,添加了大型预览图和精灵名称显示功能。
下面给出链接,有需要还可以看看