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

  1. 简介
  2. 自定义绘制Inspector
    1. 文件结构
    2. 组件脚本
    3. 绘制Inspector面板脚本(CustomEditor)
    4. 代码讲解

原文地址

简介

在使用unity的时候我们会经常使用到inspector面板来查看我们选中对象的信息,也会经常修改一些信息,但是,untiy默认的指挥显示我们组件上序列化的信息,也并不是所有的序列化的信息都显示,我们只需要添加**[HideInInspector]**标签就可以隐藏信息。但是这些并不能满足我们修改信息的需求,unity也为我们提供了自动绘制面板,这样我们不仅仅有修改字段的功能,还可以添加更多的功能了。

自定义绘制Inspector

笔者是以自己写的一个UI的动画控制器为例来讲解的。

文件结构

存放文件的目录如下

—Asset
——Scripts
———Editor
————UIAnimManagerEditor.cs
———Engine
————UIAnimManager.cs

组件脚本

首先我们先创建一个需要绘制的脚本:

/// <summary>
/// 动画播放状态
/// </summary>
public enum UIAnimPlayState
{
    Stop,                   //停止
    Playing,                //播放中
    Pause,                  //暂停
    Finish,                 //完成
}

/// <summary>
/// 动画播放控制器
/// </summary>
public class UIAnimManager : MonoBehaviour
{
    public float m_SumTime;                                                     //总时间
    public bool m_IsDefReversed;                                                //默认的是否倒放
    public bool m_IsDefLoop;                                                    //默认的是否循环
    public bool m_IsDefAutoPlay;                                                //默认的是否自动播放
    
    [NonSerialized]
    public float m_CurTime;                                                     //当前时间
    [NonSerialized]
    public UIAnimPlayState m_UIAnimPlayState = UIAnimPlayState.Stop;            //当前状态
}

下面我们来看看默认的inspector的面板显示:

不仅仅**[HideInInspector]标签会隐藏字段,[NonSerialized]**标记没有序列化的字段也不会显示出来。

绘制Inspector面板脚本(CustomEditor)

[CustomEditor(typeof(UIAnimManager))]
public class UIAnimManagerEditor : UnityEditor.Editor
{
    #region 字段

    private UIAnimManager m_UIAnimManager;                                      //面板的脚本
    
    private SerializedProperty m_IsDefReversed;                                 //是否倒放
    private SerializedProperty m_IsDefLoop;                                     //是否循环
    private SerializedProperty m_IsDefAutoPlay;                                 //是否自动播放

    #endregion
    
    #region 继承方法

    private void OnEnable()
    {
        m_UIAnimManager = (UIAnimManager) target;                               //获取绑定的脚本
        
        m_IsDefReversed = serializedObject.FindProperty("m_IsDefReversed");     //获取m_IsDefReversed字段
        m_IsDefLoop = serializedObject.FindProperty("m_IsDefLoop");             //获取m_IsDefLoop字段
        m_IsDefAutoPlay = serializedObject.FindProperty("m_IsDefAutoPlay");     //获取m_IsDefAutoPlay字段
    }

    /// <summary>
    /// 自定义绘制Inspector面板
    /// </summary>
    public override void OnInspectorGUI()
    {
        OnPropertyFieldGUI();
    }

    #endregion
    
    #region 自定义方法

    /// <summary>
    /// 绘制属性字段
    /// </summary>
    private void OnPropertyFieldGUI()
    {
        EditorGUI.BeginChangeCheck();                                       //监听面板是否发生变化
        {
            EditorGUILayout.PropertyField(m_IsDefReversed);                 //绘制m_IsDefReversed属性
            EditorGUILayout.PropertyField(m_IsDefLoop);                     //绘制m_IsDefLoop属性
            EditorGUILayout.PropertyField(m_IsDefAutoPlay);                    //绘制m_IsAutoPlay属性
        }
        if (EditorGUI.EndChangeCheck())                                     //如果发生变化为true
        {
            EditorUtility.SetDirty(target);                                 //标记用于触发保存
            serializedObject.ApplyModifiedProperties();                     //更新序列化的数据
        }
    }

    #endregion
}

如上述代码,编写脚本只需要类上面打上**[CustomEditor(typeof(UIAnimManager))]即可,中间的UIAnimManager换成需要绑定的类即可,然后在代码中继承OnInspectorGUI**方法,在这个方法里绘制自己想绘制的面板。
绘制样子如下:

代码讲解

首先开OnEnable函数里:

m_UIAnimManager = (UIAnimManager) target;获取当前绑定的脚本对象
serializedObject.FindProperty是获取脚本上的属性,是拿这些属性绘制的

OnInspectorGUI函数就是我们编写绘制Inspector面板的函数,在代码里我们可以编写untiy提供的编辑器代码,笔者这里只是通过EditorGUILayout.PropertyField来绘制属性,也可以使用其他unity的编辑器绘制代码,这里就不举例了。


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

×

喜欢就点赞,疼爱就打赏