当属性是列表时,如何在 PropertyDrawer 上实现 ReorderableList

问题描述

我创建了一个 ForceCaseAttribute,它计划处理字符串数组、字符串列表以及普通字符串,但是我似乎无法弄清楚如何正确显示我当前的 ReorderableList抽屉代码如下

public override void OnGUI ( Rect position,SerializedProperty property,GUIContent label ) {
    ForceCaseAttribute fca = attribute as ForceCaseAttribute;
    ReorderableList list = new ReorderableList ( property.serializedobject,property,true,true );
    list.drawHeaderCallback = ( Rect rect ) => {
        EditorGUI.LabelField ( rect,label );
    };
    list.drawElementCallback = ( Rect rect,int index,bool isActive,bool isFocused ) => {
        SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex ( index );
        string e = element.stringValue;
        e = EditorGUI.TextField ( rect,e );
        element.stringValue = fca.LetterCase == LetterCase.Lower ? e.ToLower () : fca.LetterCase == LetterCase.Upper ? e.toupper () : fca.LetterCase == LetterCase.Pascal ? Pascal ( e ) : Pascal ( e.Split ( new char [] { ' ' } ) );
    };
    list.DoLayoutList ();
}

但它在检查器中显示为这个

Each 'Element' of my initial list displays as a list that cannot be added to.

每个标有 Element # 的字段都不能添加到初始列表中,并且它们都以初始列表为父级,并且这些都不会引发任何错误。为了能够纠正这个问题,我是否遗漏了一些重要的步骤?

解决方法

短暂休息后,我回来尝试了一些不寻常的事情。事实证明,如果您将一个属性放在 List 或字符串数​​组之前,然后尝试为该属性创建一个属性抽屉,它会为单个元素创建一个属性抽屉并将其应用于每个元素。我不确定为什么会发生这种情况,但确实有效。

public override void OnGUI ( Rect position,SerializedProperty property,GUIContent label ) {
    ForceCaseAttribute fca = attribute as ForceCaseAttribute;
    string e = property.stringValue;
    e = EditorGUI.TextField ( position,label,e );
    property.stringValue = fca.LetterCase == LetterCase.Lower ? e.ToLower () : fca.LetterCase == LetterCase.Upper ? e.ToUpper () : fca.LetterCase == LetterCase.Pascal ? Pascal ( e ) : Pascal ( e.Split ( new char [] { ' ' } ) );
}