You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
3.9 KiB
108 lines
3.9 KiB
using UnityEditor; |
|
using UnityEngine; |
|
|
|
namespace NaughtyAttributes.Editor |
|
{ |
|
[CustomPropertyDrawer(typeof(MinMaxSliderAttribute))] |
|
public class MinMaxSliderPropertyDrawer : PropertyDrawerBase |
|
{ |
|
protected override float GetPropertyHeight_Internal(SerializedProperty property, GUIContent label) |
|
{ |
|
return (property.propertyType == SerializedPropertyType.Vector2 || property.propertyType == SerializedPropertyType.Vector2Int) |
|
? GetPropertyHeight(property) |
|
: GetPropertyHeight(property) + GetHelpBoxHeight(); |
|
} |
|
|
|
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 || property.propertyType == SerializedPropertyType.Vector2Int) |
|
{ |
|
EditorGUI.BeginProperty(rect, label, property); |
|
|
|
float indentLength = NaughtyEditorGUI.GetIndentLength(rect); |
|
float labelWidth = EditorGUIUtility.labelWidth + NaughtyEditorGUI.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(); |
|
|
|
if (property.propertyType == SerializedPropertyType.Vector2) |
|
{ |
|
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; |
|
} |
|
} |
|
else if (property.propertyType == SerializedPropertyType.Vector2Int) |
|
{ |
|
Vector2Int sliderValue = property.vector2IntValue; |
|
float xValue = sliderValue.x; |
|
float yValue = sliderValue.y; |
|
EditorGUI.MinMaxSlider(sliderRect, ref xValue, ref yValue, minMaxSliderAttribute.MinValue, minMaxSliderAttribute.MaxValue); |
|
|
|
sliderValue.x = EditorGUI.IntField(minFloatFieldRect, (int)xValue); |
|
sliderValue.x = (int)Mathf.Clamp(sliderValue.x, minMaxSliderAttribute.MinValue, Mathf.Min(minMaxSliderAttribute.MaxValue, sliderValue.y)); |
|
|
|
sliderValue.y = EditorGUI.IntField(maxFloatFieldRect, (int)yValue); |
|
sliderValue.y = (int)Mathf.Clamp(sliderValue.y, Mathf.Max(minMaxSliderAttribute.MinValue, sliderValue.x), minMaxSliderAttribute.MaxValue); |
|
|
|
if (EditorGUI.EndChangeCheck()) |
|
{ |
|
property.vector2IntValue = sliderValue; |
|
} |
|
} |
|
|
|
EditorGUI.EndProperty(); |
|
} |
|
else |
|
{ |
|
string message = minMaxSliderAttribute.GetType().Name + " can be used only on Vector2 or Vector2Int fields"; |
|
DrawDefaultPropertyAndHelpBox(rect, property, message, MessageType.Warning); |
|
} |
|
|
|
EditorGUI.EndProperty(); |
|
} |
|
} |
|
} |