Quick answer: Cache transform.position & rotation before Animator.Rebind(), restore after. Rebind resets the animator’s internal root-motion delta.

A character respawn calls Animator.Rebind() to reset animation state. The character teleports to the world origin — root motion accumulation was zeroed.

Save/Restore Transform

void ResetAnimator()
{
    Vector3 pos = transform.position;
    Quaternion rot = transform.rotation;

    animator.Rebind();
    animator.Update(0f);   // apply rebound state

    transform.position = pos;
    transform.rotation = rot;
}

Rebind + Update(0) resets state; restoring the transform after keeps the character in place.

Why It Happens

With Apply Root Motion enabled, the Animator drives the transform. Rebind zeroes the internal root-motion accumulator; on the next frame, the delta from “zero” can snap the object.

Alternative: Play() Instead of Rebind

animator.Play("Idle", 0, 0f);

If you just need to reset to a specific state (not the whole animator), Play() with normalizedTime 0 is gentler — no root-motion reset.

OnAnimatorMove Discipline

If you handle root motion manually in OnAnimatorMove, also reset your own accumulator when you Rebind — otherwise your code and the animator disagree.

Verifying

Reset animator mid-level. Character stays in place, animation state fresh. Root motion continues correctly afterward.

“Rebind is a full reset, including root motion. Save the transform around it.”

For pooled enemies reused across spawns, prefer Play() over Rebind() — cheaper and avoids the teleport entirely.