簡介
上次筆者講解了如何自定義Inspector面板的顯示骤菠,但是這里還有一個(gè)問題汞贸,就是對于支持的字段我們可以繪制對應(yīng)的屬性盲链,但是有些字段我們并不支持繪制妈拌,比如一些類定義的變量,我們又改如何繪制狭园?下面筆者介紹一下如何繪制一些本身不支持的字段读处。
自定義繪制Inspector
筆者依舊拿筆者寫的動(dòng)畫編輯器作為案例來進(jìn)行講解。
文件結(jié)構(gòu)
存放文件的目錄如下
---Asset
------Scripts
---------Editor
------------UIAnimManagerEditor.cs
------------<font color=#00FF00>UIAnimTransformInfoEditor.cs</font>
---------Engine
------------UIAnimManager.cs
------------<font color=#00FF00>UIAnimInfoBase.cs</font>
------------<font color=#00FF00>UIAnimTransformInfo.cs</font>
創(chuàng)建一個(gè)Transform的信息的類(UIAnimTransformInfo)
為了方便我們可以繪制動(dòng)畫信息在Inspector面板上唱矛,我們需要在信息類上加上[Serializable]標(biāo)簽方便我們序列化
[Serializable]
public class UIAnimTransformInfo
{
public Transform m_Transform;
}
然后我們在UIAnimManager上添加我們的信息就可以了
public class UIAnimManager : MonoBehaviour
{
public float m_SumTime; //總時(shí)間
public bool m_IsDefReversed; //默認(rèn)的是否倒放
public bool m_IsDefLoop; //默認(rèn)的是否循環(huán)
public bool m_IsDefAutoPlay; //默認(rèn)的是否自動(dòng)播放
public UIAnimTransformInfo m_UIAnimTransformInfo; //Transform動(dòng)畫信息
[NonSerialized]
public float m_CurTime; //當(dāng)前時(shí)間
[NonSerialized]
public UIAnimPlayState m_UIAnimPlayState = UIAnimPlayState.Stop; //當(dāng)前狀態(tài)
}
默認(rèn)繪制類中類對象的Inspector面板
我們可以通過繪制屬性的方式直接繪制我們的變量罚舱,代碼如下:
EditorGUILayout.PropertyField(m_UIAnimTransformInfo);
效果如下:
這個(gè)繪制是unity默認(rèn)的繪制。
自定義繪制類中類對象的Inspector面板
如果我們類中的對象不想使用自定義的繪制绎谦,我們可以采用CustomPropertyDrawer這個(gè)屬性標(biāo)簽來綁定我們類的繪制編輯器類管闷。
代碼如下
[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函數(shù)是用來設(shè)置繪制面板的高度的窃肠,然后OnGUI的函數(shù)是寫自定義的繪制的包个。
<font size=5 color=FF0000>
提示:
在GetPropertyHeight函數(shù)離,如果類比較復(fù)雜冤留,通過EditorGUI.GetPropertyHeight(property)獲取的高度會出錯(cuò)碧囊,最好把屬性里的需要繪制的字段分別獲取高度再加一起返回。
在OnGUI函數(shù)里繪制的時(shí)候不能采用GUILayout和EditorGuiLayout的繪制方式纤怒,因?yàn)檫@個(gè)是給Rect進(jìn)行繪制的糯而,每次繪制的時(shí)候只需要計(jì)算寬度,然后繪制后坐標(biāo)再自己移動(dòng)繪制下一個(gè)泊窘。舉例代碼如下:
</font>
/// <summary>
/// 繪制單個(gè)可滑動(dòng)的列表
/// </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;
}