Quick answer: Check if the state’s Speed Multiplier “Parameter” checkbox is on and the parameter is bound. Animator playback rate is the product of Animator.speed * state speed * speed multiplier parameter * blend tree child speed — all four layers multiply.

Here is how to fix Unity Animator speed parameter not affecting rate. You want your character’s walk animation to speed up with movement speed. You add a float parameter “WalkSpeed” and set it to 1.5. Animation plays at normal speed. You raise to 3.0. Still normal. Mecanim has four multiplicative speed layers and picking the wrong one (or none) is silent.

The Symptom

Changing an Animator speed-related value produces no visible change in playback rate:

What Causes This

Speed Multiplier not bound to parameter. On a state, the Speed section has a Multiplier field. There is a “Parameter” checkbox next to it. If unchecked, the Multiplier uses the static value in the field. If checked, it binds to a float parameter you select. Most developers miss the checkbox.

State speed overrides. Each state has a Speed value (default 1). Blend tree children have per-child speed. These stack multiplicatively. If a state has Speed 0.5, even Animator.speed = 2 plays at 1x.

Animator.speed is global. Setting animator.speed = 0.5 in code slows every animation on that animator. If you wanted only one state slowed, this is the wrong knob.

Time.timeScale multiplier. Animator playback rate is further multiplied by Time.timeScale (unless the animator is set to Update Mode = Unscaled Time). timeScale = 2 doubles animation speed, fighting against your slow-motion code.

The Fix

Step 1: Bind Speed Multiplier to a parameter. Select the state. In the Inspector:

  1. Locate the Speed section
  2. Set Multiplier to 1 (neutral)
  3. Check the “Parameter” checkbox next to Multiplier
  4. Select your float parameter (e.g. “WalkSpeed”) from the dropdown

Now the state’s effective speed = Speed * Multiplier parameter. Set the parameter in code:

animator.SetFloat("WalkSpeed", velocity.magnitude / 3f);

At velocity 3, parameter = 1 (normal). At velocity 6, parameter = 2 (double speed). Animation matches movement speed smoothly.

Step 2: Understand the multiplication stack.

// Final animation rate =
// Animator.speed * state.Speed * stateSpeedMultiplier * blendTreeChildSpeed * Time.timeScale

// Example: character running at variable speed
animator.speed = 1f;              // default
// state.Speed = 1 (set in Inspector)
// WalkSpeed parameter = 1.5 (set at runtime based on movement)
// Time.timeScale = 1 (default)
// Result: 1 * 1 * 1.5 * 1 * 1 = 1.5x playback

Step 3: Use Unscaled Time for pause-immune animations. If your UI animator should not slow with Time.timeScale, set Update Mode = Unscaled Time on the Animator component. Now Time.timeScale has no effect.

Step 4: Check blend tree child speeds. Open the blend tree in Animator window. Each child has a Speed column. Differing speeds can cause visual desync. For a locomotion blend tree (walk-run), set walk clip to 1.0 and run clip to 1.0, not 0.5/1.0 — Mecanim handles playback rate via the blend tree’s threshold math.

Debugging Speed

Log the effective playback rate:

AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0);
Debug.Log($"State: {info.IsName(...)}, speed: {info.speed}, " +
    $"speedMult: {info.speedMultiplier}, " +
    $"animator.speed: {animator.speed}");

Prints the three multiplicative components. Product + Time.timeScale should match the visible playback rate.

“Mecanim speed is a product of four numbers. Change the right one, and only the right one, for predictable results.”

Related Issues

For layer blending issues, see Mecanim Layer Weight Not Blending. For time scale interactions, TimeScale Affecting Audio Pitch.

Check the Parameter checkbox on the state. Bind the float. Four multipliers, know where each lives.