- Home /
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! ^^'
Answer by LaireonGames · Aug 31, 2017 at 09:32 PM
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;
Answer by MilanGM · Jul 08, 2016 at 04:28 PM
You could probably try Editor.repaint, or something like that. http://docs.unity3d.com/ScriptReference/Editor.Repaint.html
Answer by Bunny83 · Jul 08, 2016 at 05:14 PM
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);
}