【第三章自定义检视面板_创建自定义编辑器_如何创建自定义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
相关推荐
郝学胜-神的一滴8 小时前
[简化版 GAMES 101] 计算机图形学 16:纹理走样、Mipmap、三线性插值、各向异性过滤原理全解
unity·游戏引擎·godot·图形渲染·three.js·opengl·unreal
星云_byto8 小时前
五分钟从零配置好VSCode + Claude Code + DeepSeek V4 Pro
ide·vscode·编辑器·cursor·codex·claude code·deepseekv4
吴梓穆1 天前
untiy TextMeshPro (TMP) text 操作 中文字符集 字体材质操作(添加纹理 添加描边 添加阴影)
unity
林熙蕾LXL1 天前
VSCode调试
ide·vscode·编辑器
2501_942389551 天前
小米寥寥几家车企设计汽车顶棚
华为·编辑器·时序数据库·harmonyos
想你依然心痛1 天前
嵌入式单元测试:Unity/CMock框架与硬件在环测试——测试驱动、桩函数
unity·单元测试·游戏引擎
xcLeigh1 天前
Unity基础:Game视图详解——游戏预览、分辨率模拟与性能显示
游戏·unity·游戏引擎·音频·视频·game·play模式
xcLeigh2 天前
Unity基础:Scene视图操作完全指南——视角控制、物体选择与场景导航
unity·游戏引擎·scene·试图·场景导航
mxwin2 天前
Unity Shader exp 函数的算法与渲染应用
算法·unity·游戏引擎·shader
mxwin2 天前
Unity URP Exposure曝光原理与实战应用
unity·游戏引擎