using UnityEngine; using UnityEditor; [CustomPropertyDrawer(typeof(MinMaxSliderAttribute))] public class MinMaxSliderDrawer : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { var minMaxAttribute = (MinMaxSliderAttribute)attribute; var propertyType = property.propertyType; label.tooltip = minMaxAttribute.min.ToString("F2") + " to " + minMaxAttribute.max.ToString("F2"); Rect controlRect = EditorGUI.PrefixLabel(position, label); Rect[] splittedRect = SplitRect(controlRect, 3); if (propertyType == SerializedPropertyType.Vector2) { EditorGUI.BeginChangeCheck(); Vector2 vector = property.vector2Value; float minVal = vector.x; float maxVal = vector.y; minVal = float.Parse(GUI.TextField(splittedRect[0], minVal.ToString("F2"))); maxVal = float.Parse(GUI.TextField(splittedRect[2], maxVal.ToString("F2"))); Rect sliderRect = new Rect(splittedRect[0].x + 10, splittedRect[0].y, splittedRect[2].x - splittedRect[0].x - 15, splittedRect[0].height); EditorGUI.MinMaxSlider(sliderRect, ref minVal, ref maxVal, minMaxAttribute.min, minMaxAttribute.max); if (minVal < minMaxAttribute.min) { minVal = minMaxAttribute.min; } if (maxVal > minMaxAttribute.max) { maxVal = minMaxAttribute.max; } vector = new Vector2(minVal > maxVal ? maxVal : minVal, maxVal); if (EditorGUI.EndChangeCheck()) { property.vector2Value = vector; } } else if (propertyType == SerializedPropertyType.Vector2Int) { EditorGUI.BeginChangeCheck(); Vector2Int vector = property.vector2IntValue; float minVal = vector.x; float maxVal = vector.y; minVal = EditorGUI.FloatField(splittedRect[0], minVal); maxVal = EditorGUI.FloatField(splittedRect[2], maxVal); EditorGUI.MinMaxSlider(splittedRect[1], ref minVal, ref maxVal, minMaxAttribute.min, minMaxAttribute.max); if (minVal < minMaxAttribute.min) { maxVal = minMaxAttribute.min; } if (minVal > minMaxAttribute.max) { maxVal = minMaxAttribute.max; } vector = new Vector2Int(Mathf.FloorToInt(minVal > maxVal ? maxVal : minVal), Mathf.FloorToInt(maxVal)); if (EditorGUI.EndChangeCheck()) { property.vector2IntValue = vector; } } } Rect[] SplitRect(Rect rectToSplit, int n) { Rect[] rects = new Rect[n]; for (int i = 0; i < n; i++) { rects[i] = new Rect(rectToSplit.position.x + (i * rectToSplit.width / n), rectToSplit.position.y, rectToSplit.width / n, rectToSplit.height); } int padding = (int)rects[0].width - 40; int space = 5; rects[0].width -= padding + space; rects[2].width -= padding + space; rects[1].x -= padding; rects[1].width += padding * 2; rects[2].x += padding + space; return rects; } }