protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(rect, label, property); System.Type propertyType = PropertyUtility.GetPropertyType(property); if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) { ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; if (scriptableObject == null) { EditorGUI.PropertyField(rect, property, label, false); } else { // Draw a foldout Rect foldoutRect = new Rect() { x = rect.x, y = rect.y, width = EditorGUIUtility.labelWidth, height = EditorGUIUtility.singleLineHeight }; property.isExpanded = EditorGUI.Foldout(foldoutRect, property.isExpanded, label, toggleOnLabelClick: true); // Draw the scriptable object field float indentLength = NaughtyEditorGUI.GetIndentLength(rect); float labelWidth = EditorGUIUtility.labelWidth - indentLength + NaughtyEditorGUI.HorizontalSpacing; Rect propertyRect = new Rect() { x = rect.x + labelWidth, y = rect.y, width = rect.width - labelWidth, height = EditorGUIUtility.singleLineHeight }; EditorGUI.BeginChangeCheck(); property.objectReferenceValue = EditorGUI.ObjectField(propertyRect, GUIContent.none, property.objectReferenceValue, propertyType, false); if (EditorGUI.EndChangeCheck()) { property.serializedObject.ApplyModifiedProperties(); } // Draw the child properties if (property.isExpanded) { DrawChildProperties(rect, property); } } } else { string message = $"{typeof(ExpandableAttribute).Name} can only be used on scriptable objects"; DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); } EditorGUI.EndProperty(); }
protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) { System.Type propertyType = PropertyUtility.GetPropertyType(property); if (typeof(ScriptableObject).IsAssignableFrom(propertyType)) { ScriptableObject scriptableObject = property.objectReferenceValue as ScriptableObject; if (scriptableObject == null) { return(GetPropertyHeight(property)); } if (property.isExpanded) { using (SerializedObject serializedObject = new SerializedObject(scriptableObject)) { float totalHeight = EditorGUIUtility.singleLineHeight; using (var iterator = serializedObject.GetIterator()) { if (iterator.NextVisible(true)) { do { SerializedProperty childProperty = serializedObject.FindProperty(iterator.name); if (childProperty.name.Equals("m_Script", System.StringComparison.Ordinal)) { continue; } bool visible = PropertyUtility.IsVisible(childProperty); if (!visible) { continue; } float height = GetPropertyHeight(childProperty); totalHeight += height; }while (iterator.NextVisible(false)); } } totalHeight += EditorGUIUtility.standardVerticalSpacing; return(totalHeight); } } else { return(GetPropertyHeight(property)); } } else { return(GetPropertyHeight(property) + GetHelpBoxHeight()); } }
private Object GetAssignableObject(Object obj, ReorderableList list) { System.Type listType = PropertyUtility.GetPropertyType(list.serializedProperty); System.Type elementType = ReflectionUtility.GetListElementType(listType); if (elementType == null) { return(null); } System.Type objType = obj.GetType(); if (elementType.IsAssignableFrom(objType)) { return(obj); } if (objType == typeof(GameObject)) { if (typeof(Transform).IsAssignableFrom(elementType)) { Transform transform = ((GameObject)obj).transform; if (elementType == typeof(RectTransform)) { RectTransform rectTransform = transform as RectTransform; return(rectTransform); } else { return(transform); } } else if (typeof(MonoBehaviour).IsAssignableFrom(elementType)) { return(((GameObject)obj).GetComponent(elementType)); } } return(null); }