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.