自定義類(lèi)
[System.Serializable] public class Test { public string name; public int age; }
數(shù)據(jù)類(lèi)
using System.Collections.Generic; using UnityEngine; [CreateAssetMenu] public class TestSO : ScriptableObject { public List<Test> testList; }
顯示如下

修改數(shù)據(jù)類(lèi)顯示
數(shù)據(jù)元素內(nèi)容顯示為一行
注意:不能使用自動(dòng)布局api
using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(Test))] public class TestDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var spName = property.FindPropertyRelative("name"); var spAge = property.FindPropertyRelative("age"); var rect1 = position; var rect2 = position; var indentlevel = EditorGUI.indentLevel; var lableWidth = EditorGUIUtility.labelWidth; EditorGUI.indentLevel = 2; EditorGUIUtility.labelWidth = 60; rect1.width = position.width / 2; rect1.height = EditorGUIUtility.singleLineHeight; rect2.width = position.width / 2; rect2.height = EditorGUIUtility.singleLineHeight; rect2.x = position.width / 2+40; rect2.y = rect1.y; EditorGUI.PropertyField(rect1, spName, new GUIContent("名字")); EditorGUI.PropertyField(rect2, spAge, new GUIContent("年齡")); EditorGUI.indentLevel = indentlevel; EditorGUIUtility.labelWidth = lableWidth; //EditorGUI.DrawRect(rect1, Color.green); //EditorGUI.DrawRect(rect2, Color.gray); } //獲取屬性高度 public override float GetPropertyHeight(SerializedProperty property, GUIContent label) { return base.GetPropertyHeight(property, label); } }
修改后顯示效果如下

TestList修改為指定名稱(chēng);Element修改為指定名稱(chēng)
using UnityEngine; using UnityEditor; using UnityEditorInternal; [CustomEditor(typeof(TestSO))] public class TestSOEditor : Editor { SerializedProperty sPTestList; ReorderableList arrayList; private void OnEnable() { sPTestList = serializedObject.FindProperty("testList"); if (arrayList == null) { arrayList = new ReorderableList(serializedObject, sPTestList, true, true, true, true); //繪制Header arrayList.drawHeaderCallback += DrawHeader; //繪制數(shù)組元素 arrayList.drawElementCallback += DrawElement; //獲取數(shù)組的高度 arrayList.elementHeightCallback += DrawElementHeight; } } void DrawHeader(Rect rect) { EditorGUI.LabelField(rect, "測(cè)試列表"); } void DrawElement(Rect rect, int index, bool isActive, bool isFocused) { var element = sPTestList.GetArrayElementAtIndex(index); var arrowRect = rect; int indentLevel = EditorGUI.indentLevel; EditorGUI.indentLevel = 1; arrowRect.height = EditorGUIUtility.singleLineHeight; element.isExpanded = EditorGUI.Foldout(arrowRect, element.isExpanded, new GUIContent("元素" + index)); EditorGUI.indentLevel = indentLevel; //EditorGUI.DrawRect(rect, Color.red); //EditorGUI.DrawRect(arrowRect, Color.blue); if (element.isExpanded) { rect.y += arrowRect.height; EditorGUI.PropertyField(rect, element); } } float DrawElementHeight(int index) { var element = sPTestList.GetArrayElementAtIndex(index); var height = EditorGUIUtility.singleLineHeight;//折疊箭頭的高度 if (element.isExpanded)//如果元素展開(kāi) 獲取展開(kāi)內(nèi)容的高度和箭頭的高度之和 height += EditorGUI.GetPropertyHeight(element); return height; } public override void OnInspectorGUI() { serializedObject.Update(); arrayList.DoLayoutList(); serializedObject.ApplyModifiedProperties(); } }
修改后如下圖所示

以上內(nèi)容轉(zhuǎn)自https://blog.csdn.net/weixin_43796392/article/details/143320943
浙公網(wǎng)安備 33010602011771號(hào)