简介
上次笔者讲解了如何自定义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