Unity Animator Transitions Slow or Delayed? Fix Exit Time and Blending

Illustration: an animation state graph with glowing arrows between state boxes and a stopwatch

You press attack and the animation starts half a second later. Your character keeps running after stopping, or a jump animation finishes its whole loop before landing plays. Unity Animator transitions that are slow or delayed are almost always caused by a few transition settings that default to the wrong value for gameplay. This guide explains each setting, what it should be for responsive characters, and how to fix stuck triggers and Any State loops.

Has Exit Time: the Main Culprit

Every new transition you draw in the Animator has Has Exit Time ticked. With it on, the transition waits until the current state reaches its Exit Time (a normalized time, so 0.75 means 75 percent through the clip) before it even checks conditions. For a one-second run cycle, that’s up to 0.75 seconds of delay.

Rule of thumb:

  • Transitions triggered by player input or gameplay (Idle to Run, Run to Jump, any state to Hit): Has Exit Time off.
  • Transitions that should happen when an animation finishes (Attack back to Idle, Land back to Idle): Has Exit Time on with Exit Time near 1, and usually no conditions.

A transition with Has Exit Time off and no conditions is invalid. Unity warns about it and ignores it, so add at least one condition.

Transition Duration and Offset

Under the transition’s Settings foldout:

  • Transition Duration: how long the blend lasts. The default 0.25 is measured in normalized time of the current state unless Fixed Duration is ticked, then it’s seconds. For snappy gameplay, use Fixed Duration with 0.05 to 0.15 seconds. Long blends look smooth in the preview but feel laggy in play.
  • Transition Offset: where the next state starts (normalized). Useful for starting a run cycle on the matching foot.

Duration 0 gives an instant cut. That’s fine for 2D sprite animation, where blending between frames does nothing useful. For 2D, set all gameplay transitions to Has Exit Time off and duration 0. The 2D sprite animation guide uses exactly that setup.

Interruption Source

While a transition is blending, by default nothing can interrupt it. If you’re in a 0.25 second blend from Idle to Run and the player jumps, the jump waits until the blend finishes.

Interruption Source controls which other transitions can cut in:

  • None: no interruptions (default).
  • Current State: transitions leaving the state you’re coming from can interrupt.
  • Next State: transitions leaving the state you’re going to can interrupt. Usually the most useful for responsiveness.
  • Current State Then Next State / Next State Then Current State: both, checked in that order.

Ordered Interruption limits current-state interruptions to transitions above this one in the list. For responsive characters, set short blends and use Next State interruption on locomotion transitions.

Triggers That Fire Late or Twice

A trigger parameter stays set until a transition consumes it. That causes two classic bugs:

  • Delayed action. You set “Attack” while the character is mid-jump and no transition from Jump uses Attack. The trigger waits. When you land and return to Idle, the attack fires out of nowhere.
  • Double action. You set the trigger twice quickly. The first is consumed, the second is still waiting, and the attack plays twice.

Fixes:

  • Call animator.ResetTrigger("Attack") when the action is no longer valid, for example when the jump starts or the attack state ends.
  • Only set triggers when the action is actually allowed by your gameplay code.
  • For held states (crouching, blocking, grounded), use a bool instead. A bool always reflects current truth and never queues.

Any State Loops

A transition from Any State is checked from every state, including the destination itself. A transition Any State to Hit with condition IsHurt == true will keep restarting Hit every frame while the bool is true, so the animation seems frozen on its first frame.

Fixes:

  • Untick Can Transition To Self on Any State transitions. This is the most common fix.
  • Use a trigger for one-off reactions so the condition is consumed.
  • Use Any State sparingly. A few clean transitions are easier to debug than many Any State arrows.

Parameter Timing From Code

Use hashed parameter IDs and set parameters every frame from the current gameplay state:

using UnityEngine;

public class PlayerAnimation : MonoBehaviour
{
    static readonly int Speed    = Animator.StringToHash("Speed");
    static readonly int Grounded = Animator.StringToHash("Grounded");
    static readonly int Attack   = Animator.StringToHash("Attack");

    [SerializeField] Animator animator;
    [SerializeField] PlayerMotor motor;   // your movement script

    void Update()
    {
        animator.SetFloat(Speed, motor.HorizontalSpeed, 0.05f, Time.deltaTime); // small damping
        animator.SetBool(Grounded, motor.IsGrounded);
    }

    public void PlayAttack()
    {
        animator.ResetTrigger(Attack);
        animator.SetTrigger(Attack);
    }
}

Watch for threshold problems: a transition Run to Idle with Speed < 0.1 never fires if your speed decays slowly and sits at 0.15. Use thresholds that match your actual values, and log them if unsure. The damped SetFloat overload smooths blend tree input; keep the damp time small for responsive transitions.

Also check the Animator’s Update Mode. If your character moves in FixedUpdate, Animate Physics keeps animation in sync with physics. If the game pauses with timeScale 0 but you want UI animations to continue, use Unscaled Time on those Animators.

Watching the Animator Live

Select the character in Play Mode with the Animator window open. You’ll see the active state’s progress bar, transitions highlighted as they happen, and parameter values changing in the Parameters tab. This tells you instantly whether the problem is “the parameter never changes” (a code problem) or “the parameter changes but the transition waits” (a transition settings problem).

You can also click a transition and scrub the preview at the bottom of the Inspector to see the blend timing. If the animation itself doesn’t play at all, rather than playing late, the animation not playing guide covers missing controllers, avatars and layer weights.

🔧 Animation tools that help

Animation packs and controller templates can save you hours of Animator wiring. See the Asset Store tools we recommend.

Troubleshooting

Animation starts late after pressing a button

Has Exit Time is on. Turn it off and give the transition a condition.

Character keeps running after stopping

The Speed threshold is too low for your values, or the transition has exit time. Log the parameter and adjust the condition.

Attack plays twice or randomly later

The trigger stayed set. ResetTrigger before setting it and when the action becomes invalid.

Hit animation stuck on first frame

An Any State transition restarts it every frame. Untick Can Transition To Self.

“Transition does not have an exit time, and has no condition, it will be ignored”

Add a condition, or turn Has Exit Time back on if it should leave when the clip ends.

FAQ

Should Has Exit Time be off for all transitions?

No. Turn it off for input-driven transitions and keep it on for transitions that should happen when a clip finishes.

What transition duration should I use?

For 3D characters, 0.05 to 0.15 seconds fixed. For 2D sprites, 0.

Trigger or bool?

Triggers for one-off actions (attack, jump start). Bools for ongoing states (grounded, crouching).

Why does my transition preview look fine but play badly?

The preview ignores interruptions and parameter timing. Test in Play Mode with the Animator window open.

Can I skip transitions and play a state directly?

Yes, with animator.CrossFade or animator.Play. It’s handy for simple setups but bypasses your transition graph.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *