简介
在使用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