AnimationCurve not refreshed in inspector

Hi everybody!

I have a MonoBehavior with a public curve attribute:

public class Sample : MonoBehavior
{
   public AnimationCurve curve;
}

With the associated editor class:

public class SampleEditor : Editor
{
   public override void OnInspectorGUI()
   {
      DrawDefaultInspector();

      serializedObject.Update();

      if (GUILayout.Button("Do something"))
      {
         // Change anything in the curve, like, add, remove, move a keyframe
         ((Sample)target).RemoveKey(0);
      }
   }
}

This works perfectly but the problem is that the preview of the AnimationCurve is not refreshed.
If I change the inspector size by dragging the mouse, the curve representation is refreshed (although I’ve noticed that if I go back to exactly the same inspector size, the old curve preview came back).
So I suspected a cache problem, but I now have tried everything I knew without any success, like:

  • serializedObject.SetIsDifferentCacheDirty();
  • serializedObject.Update();
  • serializedObject.ApplyModifiedProperties();
  • EditorUtility.SetDirty(target);
  • Repaint();
  • Re create my own Property, etc…

And I can’t see anything public in SerializedProperty or AnimationCurve to refresh the preview or tell to do it.
However, the curve editing window do it very well…

Any ideas are welcome! ^^’

You could probably try Editor.repaint, or something like that.
Unity - Scripting API: Editor.Repaint

You did not tell Unity to save the changes. You should use Undo.RecordObject

Sample obj = (Sample)target;

if (GUILayout.Button("Do something"))
{
    Undo.RecordObject(obj, "Removed Key");
    obj.RemoveKey(0);
}

A very old one but it seems to be a common question. I figured out an answer today. It involved reading the value from the class directly and then putting the updated value into your property:

 EditorGUI.BeginChangeCheck();

yourClass.yourCurve = EditorGUILayout.CurveField(yourClass.yourCurve);

if(EditorGUI.EndChangeCheck())
      yourCurvesProperty.animationCurveValue = yourClass.yourCurve;