CinemachineBlendDefinitionPropertyDrawer.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace Cinemachine.Editor
  4. {
  5. [CustomPropertyDrawer(typeof(CinemachineBlendDefinitionPropertyAttribute))]
  6. internal sealed class CinemachineBlendDefinitionPropertyDrawer : PropertyDrawer
  7. {
  8. CinemachineBlendDefinition myClass = new CinemachineBlendDefinition(); // to access name strings
  9. public override void OnGUI(Rect rect, SerializedProperty property, GUIContent label)
  10. {
  11. float vSpace = 0;
  12. float floatFieldWidth = EditorGUIUtility.singleLineHeight * 2.5f;
  13. SerializedProperty timeProp = property.FindPropertyRelative(() => myClass.m_Time);
  14. GUIContent timeText = new GUIContent(" s", timeProp.tooltip);
  15. var textDimensions = GUI.skin.label.CalcSize(timeText);
  16. rect = EditorGUI.PrefixLabel(rect, EditorGUI.BeginProperty(rect, label, property));
  17. rect.y += vSpace; rect.height = EditorGUIUtility.singleLineHeight;
  18. rect.width -= floatFieldWidth + textDimensions.x;
  19. SerializedProperty styleProp = property.FindPropertyRelative(() => myClass.m_Style);
  20. bool isCustom = styleProp.enumValueIndex == (int)CinemachineBlendDefinition.Style.Custom;
  21. var r = rect;
  22. if (isCustom)
  23. r.width -= 2 * r.height;
  24. EditorGUI.PropertyField(r, styleProp, GUIContent.none);
  25. if (isCustom)
  26. {
  27. SerializedProperty curveProp = property.FindPropertyRelative(() => myClass.m_CustomCurve);
  28. r.x += r.width;
  29. r.width = 2 * rect.height;
  30. EditorGUI.BeginChangeCheck();
  31. EditorGUI.PropertyField(r, curveProp, GUIContent.none);
  32. if (EditorGUI.EndChangeCheck())
  33. {
  34. curveProp.animationCurveValue = InspectorUtility.NormalizeCurve(curveProp.animationCurveValue);
  35. curveProp.serializedObject.ApplyModifiedProperties();
  36. }
  37. }
  38. if (styleProp.intValue != (int)CinemachineBlendDefinition.Style.Cut)
  39. {
  40. float oldWidth = EditorGUIUtility.labelWidth;
  41. EditorGUIUtility.labelWidth = textDimensions.x;
  42. rect.x += rect.width; rect.width = floatFieldWidth + EditorGUIUtility.labelWidth;
  43. EditorGUI.BeginChangeCheck();
  44. EditorGUI.PropertyField(rect, timeProp, timeText);
  45. if (EditorGUI.EndChangeCheck())
  46. timeProp.floatValue = Mathf.Max(timeProp.floatValue, 0);
  47. EditorGUIUtility.labelWidth = oldWidth;
  48. }
  49. }
  50. }
  51. }