private void DrawElementCallback(Rect rect, int index, bool isActive, bool isFocused) { rect.width = EditorGUIUtility.currentViewWidth - GUI.skin.verticalScrollbar.fixedWidth - 32; float oldY = rect.y; rect.y += EditorGUIUtility.standardVerticalSpacing * 2; SerializedProperty element = reorderableList.serializedProperty.GetArrayElementAtIndex(index); SerializedProperty elementTarget = element.FindPropertyRelative("Target"); EditorGUI.BeginChangeCheck(); EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width + 4, EditorGUIUtility.singleLineHeight), elementTarget, GUIContent.none); if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); data.ValidateData(index); } UnityEngine.Object elementTypeObj = element.FindPropertyRelative("Type").objectReferenceValue; if (elementTypeObj != null) { // Create foldout SerializedProperty showFoldout = element.FindPropertyRelative("Foldout"); rect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing * 4; showFoldout.boolValue = EditorGUI.Foldout(new Rect(rect.x, rect.y, EditorGUIUtility.currentViewWidth - GUI.skin.verticalScrollbar.fixedWidth, EditorGUIUtility.singleLineHeight), showFoldout.boolValue, ""); if (showFoldout.boolValue) { PlatformLabel platformLabel = new PlatformLabel(); platformLabel.OnGUI(rect, null, null); SerializedObject elementType = new SerializedObject(elementTypeObj); SerializedProperty elementTypeIterator = elementType.GetIterator(); elementTypeIterator.NextVisible(true); while (elementTypeIterator.NextVisible(false)) { elementTypeIterator.serializedObject.Update(); rect.y += EditorGUI.GetPropertyHeight(elementTypeIterator, false) * 1.5f; EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), elementTypeIterator, true); if (elementTypeIterator.isArray && elementTypeIterator.isExpanded && elementTypeIterator.arraySize != 0) { for (int i = 0; i < elementTypeIterator.arraySize; i++) { rect.y += EditorGUI.GetPropertyHeight(elementTypeIterator.GetArrayElementAtIndex(i), true) * 1.5f; } } elementTypeIterator.serializedObject.ApplyModifiedProperties(); } } } rect.x = 0; rect.y = oldY + ElementHeightCallback(index) - EditorGUIUtility.standardVerticalSpacing; rect.width = EditorGUIUtility.currentViewWidth; rect.height = 1; EditorGUI.DrawRect(rect, Color.grey); }