private void SaveAnim(RecordAnimation recordAnim) { AnimatorController ac = recordAnim.animator.runtimeAnimatorController as AnimatorController; string controllerPath = AssetDatabase.GetAssetPath(ac); string path = Path.Combine(Path.GetDirectoryName(controllerPath), string.Format("{0}.asset", recordAnim.filename)); var clip = new AnimationClip(); //float lastTime = 0f; //int lastIndex = 0; var numTransforms = recordAnim.transformsToTrack.Length; for (int i = 0; i < numTransforms; i++) { Keyframe[,] keyframes = new Keyframe[recordAnim.recorded, 7]; for (int j = 0; j < recordAnim.recorded; j++) { Quaternion rot = recordAnim.rotations[i][j]; Vector3 pos = recordAnim.positions[i][j]; float time = recordAnim.times[j]; for (int n = 0; n < 3; n++) { keyframes[j, n] = new Keyframe(time, pos[n]); } for (int n = 0; n < 4; n++) { keyframes[j, 3 + n] = new Keyframe(time, rot[n]); } } clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localPosition.x", new AnimationCurve(keyframes.GetCol(0))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localPosition.y", new AnimationCurve(keyframes.GetCol(1))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localPosition.z", new AnimationCurve(keyframes.GetCol(2))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localRotation.x", new AnimationCurve(keyframes.GetCol(3))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localRotation.y", new AnimationCurve(keyframes.GetCol(4))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localRotation.z", new AnimationCurve(keyframes.GetCol(5))); clip.SetCurve(recordAnim.paths[i], typeof(Transform), "localRotation.w", new AnimationCurve(keyframes.GetCol(6))); } clip.EnsureQuaternionContinuity(); var animPath = AssetDatabase.GenerateUniqueAssetPath(path); AssetDatabase.CreateAsset(clip, animPath); string stateName = Path.GetFileNameWithoutExtension(animPath); var state = ac.layers[0].stateMachine.AddState(stateName); state.motion = AssetDatabase.LoadAssetAtPath <AnimationClip>(animPath); }