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:
- lock one tracking origin mode across startup and scene transitions
- align XR and interaction update phases to a single authoritative pose-read point
- 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:
- set tracking origin explicitly at startup
- avoid repeated runtime recenter calls unless user-triggered and logged
- verify the applied origin mode after load and after first scene transition
- 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:
- identify where hand pose is sampled for interaction
- ensure smoothing/interpolation runs after the authoritative sample, not before
- remove duplicate pose writes from late update hooks and helper scripts
- 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:
- map active action maps for gameplay, menu, and modal states
- enforce one owning map per state
- ensure focus transitions disable previous owner before enabling next
- 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:
- test scene load, pause/resume, and app focus regain
- delay interaction enable until tracking source is confirmed ready
- clear stale anchor caches on transition boundaries
- 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:
- launch build and run 2 minutes of baseline interaction
- open/close UI overlays three times while moving hands
- trigger one scene or mode transition
- re-run original interaction sequence
- 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
- Unity Android Predictive Back Gesture Intercepts Game Input - Activity Callback and Input Route Fix
- OpenXR Hand Tracking Works in Editor but Fails on Quest Build - Feature Group and Manifest Capability Fix
- Godot ENet Connection Timeout After Match Found - NAT Relay and Heartbeat Interval Fix
- How to Build a Quest Release Preflight Checklist in Unity - A No-Miss Flow for Small Teams 2026
If this resolved your issue, share it with your team and keep it as part of your Quest release checklist.