unity编辑器扩展

Unity 编辑器扩展七 Property Attributes

2021-12-11  本文已影响0人  合肥黑

参考
Unity Editor 基础篇(七):Property Attributes

一、示例
    [ReadOnly]
    public string myString = "Liction";

我们可以对ReadOnly这种标签在面板上的显示做自定义,对比效果如下:


image.png
1.自定义标签

在Scripts文件夹中创建两个C#脚本,分别命名为:“ReadOnlyAttribute.cs”和“TestPropertyAttr.cs”

//TestPropertyAttr.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TestPropertyAttr : MonoBehaviour
{
    [ReadOnly]
    public string myString = "Liction";

    [ReadOnly]
    public int myInt = 22;

    [ReadOnly]
    public Color myColor = Color.green;

    [ReadOnly]
    public Vector3 myVector = Vector3.one;

    [ReadOnly]
    public Rect myRect = new Rect(1, 1, 1, 1);
}

//ReadOnlyAttribute.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ReadOnlyAttribute : PropertyAttribute
{
    public ReadOnlyAttribute()
    {

    }
}

继承PropertyAttribute这个类,就能用一个自定义的PropertyDrawer类去控制继承PropertyAttribute类的变量在Inspector面板中的显示。在IDE中,按下CTRL,再点击TestPropertyAttr 中的[ReadOnly]标签,会发现跳到了ReadOnlyAttribute.cs中。可以理解为,我们继承PropertyAttribute这个类,实现了自己定义一个标签。

2.重绘

在Editor文件夹中创建一个名为“ReadOnlyAttributeDrawer.cs”的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;

[CustomPropertyDrawer(typeof(ReadOnlyAttribute))]
public class ReadOnlyAttributeDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        //base.OnGUI(position, property, label);
        string value;
        switch (property.propertyType)
        {
            case SerializedPropertyType.Integer:
                value = property.intValue.ToString();
                break;
            case SerializedPropertyType.String:
                value = property.stringValue;
                break;
            case SerializedPropertyType.Color:
                value = property.colorValue.ToString();
                break;
            case SerializedPropertyType.Vector3:
                value = property.vector3Value.ToString();
                break;
            case SerializedPropertyType.Rect:
                value = property.rectValue.ToString();
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
        EditorGUI.LabelField(position, property.name + "\t\t:\t" + value);
    }

    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        return base.GetPropertyHeight(property, label);
    }
}
3.带参数
public class TestPropertyAttr : MonoBehaviour
{
    [ReadOnly(1f, 0f, 0f)]
    public string myString = "Liction";

    [ReadOnly(1, 0, 0, 0.5f)]
    public int myInt = 22;

    [ReadOnly]
    public Color myColor = Color.green;

    [ReadOnly]
    public Vector3 myVector = Vector3.one;

    [ReadOnly]
    public Rect myRect = new Rect(1, 1, 1, 1);
}

//ReadOnlyAttributeDrawer.cs
...
        //EditorGUI.LabelField(position, property.name + "\t\t:\t" + value);

        ReadOnlyAttribute myAttribute = (ReadOnlyAttribute)attribute;
        Debug.Log(attribute.GetType().Name);
        GUI.color = myAttribute.textColor;
        Debug.Log(property.name + ":" + myAttribute.textColor);
        GUI.Label(position, property.displayName + "\t\t:\t" + value);
        //GUI.color = Color.white;
image.png
image.png

MyString的颜色未生效

上一篇下一篇

猜你喜欢

热点阅读