Quick answer: Disable Can Transition To Self on any state with self-looping transitions, set Has Exit Time = false on instant transitions, and reorder transitions so the most specific condition is evaluated first. Triggers only fire on the highest-priority matching transition.

SetTrigger(“Jump”) returns. The animator does not jump. The Idle clip restarts, mid-animation, like a hiccup. Or the trigger fires twice and the player tries to jump twice. Every Unity dev hits this once; the cause is almost always the self-transition rule and one of two settings.

The Symptom

SetTrigger calls a state change that visibly does not happen. Or fires the wrong state. Or fires once after the right state already plays. Behavior depends on which animation frame the trigger lands on, which feels random.

What Causes This

Animator transitions are evaluated top-down within a state. A trigger condition that matches more than one outgoing transition consumes on the first match in list order. Subtle gotchas:

The Fix

Step 1: Disable Can Transition To Self everywhere. Click the state. In Inspector → State → Transitions, expand each transition and uncheck Can Transition To Self unless you specifically want a re-trigger to restart the same animation.

Step 2: Has Exit Time = false on instant transitions. Click the transition arrow. In the Settings panel uncheck Has Exit Time. The transition now fires the moment the trigger is set, regardless of clip progress.

Step 3: Set Transition Duration explicitly. A duration of 0.25 is reasonable for most humanoid moves; 0 for snappy responses (hit, parry). Default 0.25 is often fine but the field is in normalized time of the source clip if Fixed Duration is off — flip Fixed Duration on and the value is in seconds, which is what you almost always want.

Step 4: Reorder transitions. Specific conditions first, generic last.

// Idle state's transition list, in order:
1. Idle -> Hit       (Trigger: Hit)         // most specific, fires first
2. Idle -> Jump      (Trigger: Jump)
3. Idle -> Run       (bool: IsRunning)
4. Idle -> Idle      (none, default loop)  // last, never blocks others

Code Side

Set the trigger only when the animator is in a state where it can be consumed. ResetTrigger before a SetTrigger if you suspect a stale trigger:

public void Jump()
{
    animator.ResetTrigger("Jump");
    animator.SetTrigger("Jump");
}

Verifying

Open the Animator window with the player selected during Play. Trigger the action; the active state should jump to the target visibly. If the source state restarts instead, your self-transition is winning. If nothing changes, your trigger is being consumed silently — check the transition’s parameter conditions.

“Disable self-transitions. Exit time off for instant. Order transitions specific-first. Triggers land where you intended.”

Related Issues

For animation not playing at all, see animation not playing. For animator events not firing, see animation events.

Self-transition off. Exit time off. Specific first. The Animator obeys.