问题描述
我创建了一个 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 ();
}
但它在检查器中显示为这个
每个标有 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 [] { ' ' } ) );
}