Unity杂文——扩展Inspector面板(二)

原文地址

简介

上次笔者讲解了如何自定义Inspector面板的显示,但是这里还有一个问题,就是对于支持的字段我们可以绘制对应的属性,但是有些字段我们并不支持绘制,比如一些类定义的变量,我们又改如何绘制?下面笔者介绍一下如何绘制一些本身不支持的字段。

自定义绘制Inspector

笔者依旧拿笔者写的动画编辑器作为案例来进行讲解。

文件结构

存放文件的目录如下

—Asset
——Scripts
———Editor
————UIAnimManagerEditor.cs
————UIAnimTransformInfoEditor.cs
———Engine
————UIAnimManager.cs
————UIAnimInfoBase.cs
————UIAnimTransformInfo.cs

创建一个Transform的信息的类(UIAnimTransformInfo)

为了方便我们可以绘制动画信息在Inspector面板上,我们需要在信息类上加上**[Serializable]**标签方便我们序列化

[Serializable]
public class UIAnimTransformInfo
{
    
    public Transform m_Transform;

}

然后我们在UIAnimManager上添加我们的信息就可以了

public class UIAnimManager : MonoBehaviour
{
    public float m_SumTime;                                                     //总时间
    public bool m_IsDefReversed;                                                //默认的是否倒放
    public bool m_IsDefLoop;                                                    //默认的是否循环
    public bool m_IsDefAutoPlay;                                                //默认的是否自动播放

    public UIAnimTransformInfo m_UIAnimTransformInfo;                           //Transform动画信息
    
    [NonSerialized]
    public float m_CurTime;                                                     //当前时间
    [NonSerialized]
    public UIAnimPlayState m_UIAnimPlayState = UIAnimPlayState.Stop;            //当前状态
    
}

默认绘制类中类对象的Inspector面板

我们可以通过绘制属性的方式直接绘制我们的变量,代码如下:

EditorGUILayout.PropertyField(m_UIAnimTransformInfo);

效果如下:

这个绘制是unity默认的绘制。

自定义绘制类中类对象的Inspector面板

如果我们类中的对象不想使用自定义的绘制,我们可以采用CustomPropertyDrawer这个属性标签来绑定我们类的绘制编辑器类。
代码如下

[CustomPropertyDrawer(typeof(UIAnimTransformInfo))]
public class UIAnimTransformInfoEditor : PropertyDrawer
{
    /// <summary>
    /// 获取属性绘制的高度
    /// </summary>
    /// <param name="property"></param>
    /// <param name="label"></param>
    /// <returns></returns>
    public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
    {
        return EditorGUI.GetPropertyHeight(property);
    }

    /// <summary>
    /// 绘制自定义的面板
    /// </summary>
    /// <param name="position"></param>
    /// <param name="property"></param>
    /// <param name="label"></param>
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        
    }
}

上述代码中,GetPropertyHeight函数是用来设置绘制面板的高度的,然后OnGUI的函数是写自定义的绘制的。

提示: 在GetPropertyHeight函数离,如果类比较复杂,通过EditorGUI.GetPropertyHeight(property)获取的高度会出错,最好把属性里的需要绘制的字段分别获取高度再加一起返回。 在OnGUI函数里绘制的时候不能采用GUILayout和EditorGuiLayout的绘制方式,因为这个是给Rect进行绘制的,每次绘制的时候只需要计算宽度,然后绘制后坐标再自己移动绘制下一个。举例代码如下:
/// <summary>
/// 绘制单个可滑动的列表
/// </summary>
/// <param name="position"></param>
/// <param name="property"></param>
/// <param name="uiReorderableList"></param>
public static void OnReorderableListPropertyItemGUI(ref Rect position, SerializedProperty property,ReorderableList uiReorderableList)
{
    position.height = GetReorderableListHeight(property);
    uiReorderableList.DoList(position);
    position.y += position.height;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 841774407@qq.com

×

喜欢就点赞,疼爱就打赏