From 047efd15559d7c62666f00392a987dccdc36d500 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 18 May 2021 22:37:34 +0800 Subject: +misc --- .../Editor/MinMaxSliderDrawer.cs | 118 +++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 UnityCollection/Assets/Tools/EditorGUIHelper/MinMaxSliderAttribute/Editor/MinMaxSliderDrawer.cs (limited to 'UnityCollection/Assets/Tools/EditorGUIHelper/MinMaxSliderAttribute/Editor/MinMaxSliderDrawer.cs') diff --git a/UnityCollection/Assets/Tools/EditorGUIHelper/MinMaxSliderAttribute/Editor/MinMaxSliderDrawer.cs b/UnityCollection/Assets/Tools/EditorGUIHelper/MinMaxSliderAttribute/Editor/MinMaxSliderDrawer.cs new file mode 100644 index 0000000..b5fc57c --- /dev/null +++ b/UnityCollection/Assets/Tools/EditorGUIHelper/MinMaxSliderAttribute/Editor/MinMaxSliderDrawer.cs @@ -0,0 +1,118 @@ +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; + + } + +} -- cgit v1.1-26-g67d0