Unity3D ReorderableList字段显示在框下方

时间:2015-03-13 04:39:26

标签: unity3d-editor

我正在尝试创建一个可重新排序的列表,但我正在使用EditorGUILayout来解决它。如果我使用EditorGUI它工作正常,但是字段的大小是静态的(除非我每次手动计算大小)。

这是我正在做的事情:

    list = new ReorderableList(serializedObject, serializedObject.FindProperty("groupSettings"), true, true, true, true);

    list.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => {
        SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index);

        EditorGUILayout.BeginHorizontal();
        {
            EditorGUILayout.PropertyField(element.FindPropertyRelative("poolGroupName"), GUIContent.none);
            EditorGUILayout.PropertyField(element.FindPropertyRelative("minPoolSize"), GUIContent.none);
            EditorGUILayout.PropertyField(element.FindPropertyRelative("maxPoolSize"), GUIContent.none);
            EditorGUILayout.PropertyField(element.FindPropertyRelative("prewarmCount"), GUIContent.none);
            EditorGUILayout.PropertyField(element.FindPropertyRelative("prewarmObject"), GUIContent.none);
        }
        EditorGUILayout.EndHorizontal();
    };

当我使用EditorGUILayout时,控件显示在可重新排序列表下方。我仍然可以交换订单,但内容总是显示在列表下方。

alt text

1 个答案:

答案 0 :(得分:1)

正如您在callback参数中看到的那样。 Rect参数是显示GUI元素的区域。您不能使用GUILayout或EditorGUILayout。你应该自己计算位置。

list.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) => {
    SerializedProperty element = list.serializedProperty.GetArrayElementAtIndex(index);

    float gap = 10f;
    float numColumns = 5f;
    float width = (rect.width - (numColumns - 1) * gap) / numColumns;
    rect.height = 16f;
    rect.width = width;

    EditorGUI.PropertyField(rect, property.FindPropertyRelative("poolGroupName"));
    rect.x += rect.width + gap;

    EditorGUI.PropertyField(rect, property.FindPropertyRelative("minPoolSize"));
    rect.x += rect.width + gap;

    EditorGUI.PropertyField(rect, property.FindPropertyRelative("maxPoolSize"));

    rect.x += rect.width + gap;
    EditorGUI.PropertyField(rect, property.FindPropertyRelative("prewarmCount"));

    rect.x += rect.width + gap;
    EditorGUI.PropertyField(rect, property.FindPropertyRelative("prewarmObject"));
};