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 = ExternalCustomEditorGUI.GetIndentLength(rect); float labelWidth = EditorGUIUtility.labelWidth - indentLength + ExternalCustomEditorGUI.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(); }
public override void OnGUI(Rect rect) { InfoBoxAttribute infoBoxAttribute = (InfoBoxAttribute)attribute; float indentLength = ExternalCustomEditorGUI.GetIndentLength(rect); Rect infoBoxRect = new Rect( rect.x + indentLength, rect.y, rect.width - indentLength, GetHelpBoxHeight()); DrawInfoBox(infoBoxRect, infoBoxAttribute.Text, infoBoxAttribute.Type); }
public void DrawDefaultPropertyAndHelpBox(Rect rect, SerializedProperty property, string message, MessageType messageType) { float indentLength = ExternalCustomEditorGUI.GetIndentLength(rect); Rect helpBoxRect = new Rect( rect.x + indentLength, rect.y, rect.width - indentLength, GetHelpBoxHeight()); ExternalCustomEditorGUI.HelpBox(helpBoxRect, message, MessageType.Warning, context: property.serializedObject.targetObject); Rect propertyRect = new Rect( rect.x, rect.y + GetHelpBoxHeight(), rect.width, GetPropertyHeight(property)); EditorGUI.PropertyField(propertyRect, property, true); }
protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) { if (!IsNumber(property)) { string message = string.Format("Field {0} is not a number", property.name); DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); return; } ProgressBarAttribute progressBarAttribute = PropertyUtility.GetAttribute <ProgressBarAttribute>(property); var value = property.propertyType == SerializedPropertyType.Integer ? property.intValue : property.floatValue; var valueFormatted = property.propertyType == SerializedPropertyType.Integer ? value.ToString() : string.Format("{0:0.00}", value); var maxValue = GetMaxValue(property, progressBarAttribute); if (maxValue != null && maxValue is float) { var fillPercentage = value / (float)maxValue; var barLabel = (!string.IsNullOrEmpty(progressBarAttribute.Name) ? "[" + progressBarAttribute.Name + "] " : "") + valueFormatted + "/" + maxValue; var barColor = progressBarAttribute.Color.GetColor(); var labelColor = Color.white; var indentLength = ExternalCustomEditorGUI.GetIndentLength(rect); Rect barRect = new Rect() { x = rect.x + indentLength, y = rect.y, width = rect.width - indentLength, height = EditorGUIUtility.singleLineHeight }; DrawBar(barRect, Mathf.Clamp01(fillPercentage), barLabel, barColor, labelColor); } else { string message = string.Format( "The provided dynamic max value for the progress bar is not correct. Please check if the '{0}' is correct, or the return type is float", nameof(progressBarAttribute.MaxValueName)); DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); } }
protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(rect, label, property); if (property.propertyType == SerializedPropertyType.ObjectReference) { Rect propertyRect = new Rect() { x = rect.x, y = rect.y, width = rect.width, height = EditorGUIUtility.singleLineHeight }; EditorGUI.PropertyField(propertyRect, property, label); Texture2D previewTexture = GetAssetPreview(property); if (previewTexture != null) { Rect previewRect = new Rect() { x = rect.x + ExternalCustomEditorGUI.GetIndentLength(rect), y = rect.y + EditorGUIUtility.singleLineHeight, width = rect.width, height = GetAssetPreviewSize(property).y }; GUI.Label(previewRect, previewTexture); } } else { string message = property.name + " doesn't have an asset preview"; DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); } EditorGUI.EndProperty(); }
protected override void OnGUI_Internal(Rect rect, SerializedProperty property, GUIContent label) { EditorGUI.BeginProperty(rect, label, property); MinMaxSliderAttribute minMaxSliderAttribute = (MinMaxSliderAttribute)attribute; if (property.propertyType == SerializedPropertyType.Vector2) { EditorGUI.BeginProperty(rect, label, property); float indentLength = ExternalCustomEditorGUI.GetIndentLength(rect); float labelWidth = EditorGUIUtility.labelWidth + ExternalCustomEditorGUI.HorizontalSpacing; float floatFieldWidth = EditorGUIUtility.fieldWidth; float sliderWidth = rect.width - labelWidth - 2.0f * floatFieldWidth; float sliderPadding = 5.0f; Rect labelRect = new Rect( rect.x, rect.y, labelWidth, rect.height); Rect sliderRect = new Rect( rect.x + labelWidth + floatFieldWidth + sliderPadding - indentLength, rect.y, sliderWidth - 2.0f * sliderPadding + indentLength, rect.height); Rect minFloatFieldRect = new Rect( rect.x + labelWidth - indentLength, rect.y, floatFieldWidth + indentLength, rect.height); Rect maxFloatFieldRect = new Rect( rect.x + labelWidth + floatFieldWidth + sliderWidth - indentLength, rect.y, floatFieldWidth + indentLength, rect.height); // Draw the label EditorGUI.LabelField(labelRect, label.text); // Draw the slider EditorGUI.BeginChangeCheck(); Vector2 sliderValue = property.vector2Value; EditorGUI.MinMaxSlider(sliderRect, ref sliderValue.x, ref sliderValue.y, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); sliderValue.x = EditorGUI.FloatField(minFloatFieldRect, sliderValue.x); sliderValue.x = Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); sliderValue.y = EditorGUI.FloatField(maxFloatFieldRect, sliderValue.y); sliderValue.y = Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); if (EditorGUI.EndChangeCheck()) { property.vector2Value = sliderValue; } EditorGUI.EndProperty(); } else { string message = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 fields"; DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); } EditorGUI.EndProperty(); }