How can I record mecanim animations with value changes on animator.speed?

I need to record animations on mecanim and want also record the animator.speed changes to playback slow motion moments as well.

The animator.speed value is not supported for recording in unity, however you can workaround this by using a separated Animator to record the speed values in a float parameter and then playback both animators
and make a correction on the playbackTime by using the recorded value on the speed parameter from the other animator.

Like this :

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class RecordingManager : MonoBehaviour {
	
	public Animator mainAnimator;
	public Animator animatorSpeedRecorder;
	public Button playBackButton;
	public Button recordButton;
	public Text speedLabel;
	public Slider speedSlider;
	private bool isPlayingBack = false;
	private bool isRecording = false;

	void Start () 
	{
		animatorSpeedRecorder.SetFloat ("speed", 1.0f);
		speedSlider.value = 1.0f;
		speedLabel.text  = "Speed: "+mainAnimator.speed +"x";
	}

	void Update () 
	{
		if(isPlayingBack)
		{
			float time = animatorSpeedRecorder.playbackTime + animatorSpeedRecorder.GetFloat ("speed") * Time.deltaTime;

			while(time > animatorSpeedRecorder.recorderStopTime)
				time -= (animatorSpeedRecorder.recorderStopTime - animatorSpeedRecorder.recorderStartTime);
			
			animatorSpeedRecorder.playbackTime = time;
			mainAnimator.playbackTime = time;
		}
	}

	public void OnSpeedValueChanged()
	{
		if (mainAnimator && animatorSpeedRecorder) 
		{
			mainAnimator.speed = speedSlider.value;
			animatorSpeedRecorder.speed = speedSlider.value;
			animatorSpeedRecorder.SetFloat ("speed", mainAnimator.speed);
			speedLabel.text  = "Speed: "+mainAnimator.speed +"x";
		}
	}

	public void OnClickRecordingButton()
	{
		if (isRecording) 
		{
			StopRecording ();
		} else 
		{  
			StartRecording ();
		}
	}

	public void StartRecording ()
	{
		if (mainAnimator && animatorSpeedRecorder) 
		{
			isRecording = true;
			playBackButton.enabled = false;
			mainAnimator.StartRecording (-1);
			animatorSpeedRecorder.StartRecording (-1);
			recordButton.image.color = Color.red;
			playBackButton.image.color = Color.gray;
		}
	}
	
	public void StopRecording ()
	{
		if (mainAnimator && animatorSpeedRecorder) 
		{
			isRecording = false;
			playBackButton.enabled = true;
			mainAnimator.StopRecording();
			animatorSpeedRecorder.StopRecording();
			recordButton.image.color = Color.white;
			playBackButton.image.color = Color.white;
		}
	}

	public void OnClickPlayBack()
	{
		if (isPlayingBack) 
		{
			StopPlayback ();
		} else 
		{
			StartPlayback ();
		}
	}

	public void StopPlayback ()
	{
		if (mainAnimator && animatorSpeedRecorder && isPlayingBack) 
		{
			isPlayingBack = false;
			recordButton.enabled = true;
			mainAnimator.StopPlayback ();
			animatorSpeedRecorder.StopPlayback ();
			recordButton.image.color = Color.white;
			playBackButton.image.color = Color.white;
		}
	}

	public void StartPlayback (){

		if (mainAnimator.recorderStopTime <= 0)
			return;

		if (mainAnimator && animatorSpeedRecorder && !isPlayingBack ) 
		{
			mainAnimator.Rebind();
			animatorSpeedRecorder.Rebind();
			recordButton.enabled = false;
			mainAnimator.StartPlayback ();
			animatorSpeedRecorder.StartPlayback ();
			mainAnimator.playbackTime = mainAnimator.recorderStartTime;
			isPlayingBack = true;
			recordButton.image.color = Color.gray;
			playBackButton.image.color = Color.green;
		}
	}
}

Here is the example project: RecordingExample.7z

https://oc.unity3d.com/public.php?service=files&t=05eb07a5c9862dab9315f0d2df35cd84