// Curve editor changes curves, but we are in charge of saving them into the clip private void SaveChangedCurvesFromCurveEditor() { m_State.SaveKeySelection(AnimationWindowState.kEditCurveUndoLabel); var curvesToUpdate = new Dictionary <AnimationClip, ChangedCurvesPerClip>(); var changedCurves = new ChangedCurvesPerClip(); for (int i = 0; i < m_CurveEditor.animationCurves.Length; ++i) { CurveWrapper curveWrapper = m_CurveEditor.animationCurves[i]; if (curveWrapper.changed) { if (!curveWrapper.animationIsEditable) { Debug.LogError("Curve is not editable and shouldn't be saved."); } if (curveWrapper.animationClip != null) { if (curvesToUpdate.TryGetValue(curveWrapper.animationClip, out changedCurves)) { changedCurves.bindings.Add(curveWrapper.binding); changedCurves.curves.Add(curveWrapper.curve.length > 0 ? curveWrapper.curve : null); } else { changedCurves.bindings = new List <EditorCurveBinding>(); changedCurves.curves = new List <AnimationCurve>(); changedCurves.bindings.Add(curveWrapper.binding); changedCurves.curves.Add(curveWrapper.curve.length > 0 ? curveWrapper.curve : null); curvesToUpdate.Add(curveWrapper.animationClip, changedCurves); } } curveWrapper.changed = false; } } if (curvesToUpdate.Count > 0) { foreach (var kvp in curvesToUpdate) { Undo.RegisterCompleteObjectUndo(kvp.Key, AnimationWindowState.kEditCurveUndoLabel); AnimationWindowUtility.SaveCurves(kvp.Key, kvp.Value.bindings, kvp.Value.curves); } m_State.ResampleAnimation(); } }