Unity XR Hands Jitter or Teleport in Quest Build - Tracking Origin and Update Phase Alignment Fix

If your hand anchors look stable in Editor but jitter, jump, or briefly teleport in Quest builds, you are usually dealing with an update-order mismatch rather than bad controller data. The most common cause is misalignment between tracking-origin assumptions, interaction update phases, and frame ownership of pose reads.

This guide gives you the fastest safe fix first, then deeper checks for teams that still see drift after the basic patch.

Who this affects and fastest path

You are likely affected if:

  • Unity XR Interaction Toolkit input is stable in Play Mode but unstable on Quest device
  • hands jitter when UI overlays open or close
  • grab/select rays snap or jump after scene transitions
  • hand offsets vary between sessions without code changes

Fastest safe path:

  1. lock one tracking origin mode across startup and scene transitions
  2. align XR and interaction update phases to a single authoritative pose-read point
  3. verify action-map ownership so UI and gameplay do not dual-consume hand intent

You should be able to confirm improvement in one deterministic 5-minute replay route.

Why this happens

In most affected projects, at least one of these is true:

  • tracking origin mode changes silently between scenes or recenter calls
  • hand pose is read in one phase, then overridden in another phase same frame
  • locomotion, interaction, and UI routes each apply transforms in different timing windows
  • state transitions (pause/menu/load) briefly run two active action maps

Quest runtime timing exposes these mismatches more aggressively than desktop testing.

Step 1 - Lock tracking origin mode once and verify on startup

Pick one mode for your project route (typically Floor for standing-scale interaction or Device for seated/relative workflows) and apply it once during XR bootstrap.

Checklist:

  1. set tracking origin explicitly at startup
  2. avoid repeated runtime recenter calls unless user-triggered and logged
  3. verify the applied origin mode after load and after first scene transition
  4. keep origin assumptions identical in gameplay and menu scenes

If your mode changes between scenes, hand offsets can appear as random teleports.

Step 2 - Align pose reads to one update phase

Decide where pose authority lives for interaction logic and keep it there. Do not read controller/hand pose in multiple phases for the same gameplay decision.

Checklist:

  1. identify where hand pose is sampled for interaction
  2. ensure smoothing/interpolation runs after the authoritative sample, not before
  3. remove duplicate pose writes from late update hooks and helper scripts
  4. test one frame-step capture to confirm one consistent read-write order

Success signal:

  • no same-frame pose overwrite chain in logs for the same hand anchor

Step 3 - Verify action-map ownership across UI and gameplay

Hand jitter often gets worse when UI focus and gameplay interaction are both active.

Checklist:

  1. map active action maps for gameplay, menu, and modal states
  2. enforce one owning map per state
  3. ensure focus transitions disable previous owner before enabling next
  4. replay menu open/close during motion and verify no dual-consume

If this is misconfigured, the same intent can be interpreted twice with competing transforms.

Step 4 - Stabilize scene transition and resume behavior

Most "teleport once every few minutes" reports come from transition windows.

Checklist:

  1. test scene load, pause/resume, and app focus regain
  2. delay interaction enable until tracking source is confirmed ready
  3. clear stale anchor caches on transition boundaries
  4. verify one deterministic route before and after each transition

Do not mask this with arbitrary frame delays. Fix route ownership and readiness gating instead.

Step 5 - Run deterministic Quest verification

Use one repeatable route and log outcomes:

  1. launch build and run 2 minutes of baseline interaction
  2. open/close UI overlays three times while moving hands
  3. trigger one scene or mode transition
  4. re-run original interaction sequence
  5. compare before/after jitter count and teleport incidents

Pass criteria:

  • no unexplained hand-anchor jumps
  • no visible jitter spikes during normal interaction
  • stable behavior across two consecutive runs

Verification checklist

Use this after every fix:

  • tracking origin mode remains unchanged through the full route
  • pose authority stays in one update phase
  • action-map ownership is singular per state
  • transition resume does not reintroduce offset drift
  • on-device Quest behavior matches expected route outcomes

Alternative fixes for edge cases

If primary steps did not clear the issue, check:

  • third-party scripts that also modify hand anchor transforms
  • mixed controller-plus-hand fallback paths with conflicting offsets
  • late-loaded calibration assets applied after interaction starts
  • project-specific smoothing values that amplify tiny runtime timing differences

Fix one variable at a time and rerun the same route after each change.

Prevention tips

  • keep one XR bootstrap owner for origin and interaction startup
  • treat phase alignment as a release checklist item, not an ad-hoc debug step
  • include one Quest device parity route in every pre-release packet
  • log state ownership transitions whenever input maps swap

Bookmark this fix and repeat the verification route whenever you update Unity, OpenXR, or XR Interaction Toolkit packages.

Related fixes and next steps

If this resolved your issue, share it with your team and keep it as part of your Quest release checklist.