当属性是列表时,在PropertyDrawer上实现ReorderableList可以通过Unity的EditorGUILayout扩展来实现。下面是一个示例代码:
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
[CustomEditor(typeof(YourScript))]
public class YourScriptEditor : Editor
{
private ReorderableList list;
private void OnEnable()
{
list = new ReorderableList(serializedObject, serializedObject.FindProperty("yourListProperty"), true, true, true, true);
list.drawHeaderCallback = rect =>
{
EditorGUI.LabelField(rect, "Your List Property");
};
list.drawElementCallback = (rect, index, isActive, isFocused) =>
{
var element = list.serializedProperty.GetArrayElementAtIndex(index);
rect.y += 2;
EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element, GUIContent.none);
};
list.onAddCallback = list =>
{
var index = list.serializedProperty.arraySize;
list.serializedProperty.arraySize++;
list.index = index;
var element = list.serializedProperty.GetArrayElementAtIndex(index);
element.objectReferenceValue = null;
};
}
public override void OnInspectorGUI()
{
serializedObject.Update();
list.DoLayoutList();
serializedObject.ApplyModifiedProperties();
}
}
上述代码中,我们首先创建了一个ReorderableList对象,并设置了它的一些回调函数。在drawHeaderCallback回调中,我们绘制了列表的标题。在drawElementCallback回调中,我们绘制了列表中每个元素的GUI。在onAddCallback回调中,我们实现了添加新元素的逻辑。
然后,在自定义的Editor类中,我们重写了OnInspectorGUI方法,在该方法中调用了list.DoLayoutList()来绘制整个列表。
请注意,上述代码中的"YourScript"和"yourListProperty"需要替换为你自己的脚本和属性名称。
这样,当你在Inspector面板中选择一个拥有该列表属性的脚本时,你将能够在PropertyDrawer上实现可排序的列表。
领取专属 10元无门槛券
手把手带您无忧上云