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

3.2.3 如何创建自定义PropertyDrawer

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

三步走

1.定义特性类 (PropertyAttribute)

csharp 复制代码
using System;
using UnityEngine;

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

2.创建 PropertyDrawer

csharp 复制代码
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

csharp 复制代码
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 显示​​,在保留标准精灵选择功能的基础上,添加了大型预览图和精灵名称显示功能。

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

1.扩展Color
2.扩展Sprite
相关推荐
万兴丶9 小时前
Google Play合规指南:您的应用所使用的原生库不支持 16 KB 内存页面大小.快速解决
unity·google
std787913 小时前
超越编辑器:IntelliJ IDEA,如何成为Java开发的智慧引擎
java·编辑器·intellij-idea
MediaTea13 小时前
Python 编辑器:PyCharm
开发语言·ide·python·pycharm·编辑器
SmalBox14 小时前
【光照】[PBR][法线分布]为何不选Beckmann
unity·渲染
MHJ_16 小时前
VSCODE使用指南
ide·vscode·编辑器
MediaTea18 小时前
Python 编辑器:Visual Studio Code
开发语言·ide·vscode·python·编辑器
猪猪侠|ZZXia20 小时前
# vim中给变量添加双引号
编辑器·vim·excel
一只一只2 天前
Unity 3D笔记——《B站阿发你好》
笔记·3d·unity
SmalBox2 天前
【光照】[PBR][法线分布]GGX实现方法对比
unity·渲染
UWA2 天前
游戏在高负载场景下,整机功耗控制在多少
游戏·unity·性能优化·游戏开发