Develop

Controller Input and Tracking Troubleshooting

Updated: Apr 17, 2026

Overview

This topic describes common issues and solutions when implementing controller input and tracking in your Meta Quest project.

Why is my view offset and static?

In XR projects, the VR camera is typically attached directly to the Pawn root rather than through a Spring Arm component. If components on the Pawn have collision enabled and their bounds overlap the camera origin, the camera can be pushed to an unexpected position. Check the following:
  • UMotionControllerComponent, controller mesh visuals, and UOculusXRControllerComponent are common sources of collision overlap. Select the component in the Pawn Blueprint and open the Collision section in the Details panel.
  • Set Collision Presets to NoCollision for any component whose bounds overlap the camera origin.
  • Alternatively, adjust the collision bounds so they do not overlap the camera position at the tracking origin.

Why are my controllers not tracking?

The UMotionControllerComponent requires its MotionSource property to be set to Left or Right. If this value is empty or incorrect, the component does not receive tracking data. Also check the following:
  • Open Edit > Project Settings > Plugins > Meta XR and verify that Hand Tracking Support is set to Controllers Only or Controllers And Hands. If it is set to Hands Only, controller tracking is disabled.
  • Confirm the Meta XR Plugin is enabled in your project .uproject file or through Edit > Plugins.
  • Call UOculusXRFunctionLibrary::GetControllerType() at runtime to verify the system detects a controller. If it returns None or Unknown, the controller may not be paired with the headset.

Why are my input actions not firing?

When using Enhanced Input (recommended for UE 5.1+), verify the following:
  • An Input Mapping Context (IMC) is registered at runtime. Either add it in code during BeginPlay using UEnhancedInputLocalPlayerSubsystem::AddMappingContext(), or register it in DefaultInput.ini under [/Script/EnhancedInput.EnhancedInputDeveloperSettings] with +DefaultMappingContexts.
  • The Input Actions in the IMC are bound to the correct keys. All Meta Quest controller types (Touch, Touch Plus, and Touch Pro) share the same OculusTouch key prefix (for example, OculusTouch_Left_Thumbstick). Some keys are only available on specific controller types. See the Controller Input Mapping reference for the full key list.
  • DefaultInput.ini includes DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput and DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent.
  • You can call UOculusXRFunctionLibrary::GetControllerType() at runtime to determine which controller-specific inputs are available (for example, trigger force is only available on Touch Plus).

Why is haptic feedback not working?

Haptics require the controller to be connected, the Meta XR Plugin to be initialized, and the application to have VR focus. If haptics do not play, check the following:
  • Verify the controller is connected and detected by confirming UOculusXRFunctionLibrary::GetControllerType() does not return None.
  • Verify the app has VR focus. Haptics are paused when the system overlay is active. Use UOculusXRFunctionLibrary::HasInputFocus() to check.
  • When using UOculusXRInputFunctionLibrary::SetHapticsByValue(), the Frequency and Amplitude parameters must be in the range 0.0 to 1.0.
  • Localized haptics targeting Thumb or Index with EOculusXRHandHapticsLocation require a Meta Quest Touch Pro or Touch Plus controller. On standard Meta Quest Touch controllers, only the Hand location is supported.

Why is the controller model not appearing?

If you use UOculusXRControllerComponent to display the controller mesh, check the following:
  • Verify the SkeletonType property is set to the correct hand (Left or Right). A mismatch causes no mesh to load.
  • The component auto-selects the mesh based on the connected controller type. If UOculusXRFunctionLibrary::GetControllerType() returns None or Unknown (for example, when running in the editor without a headset), no mesh loads.
  • The mesh loads asynchronously. It may not appear on the first frame.
  • If using UXRDeviceVisualizationComponent instead, verify SetIsVisualizationActive(true) is called and the component is attached in the hierarchy under the UMotionControllerComponent (either directly or through a UOculusXRLegacyPoseTransformComponent).

Why are held objects at the wrong angle?

The Meta XR Plugin supports three controller pose conventions configured through Controller Pose Alignment in Edit > Project Settings > Plugins > Meta XR:
  • Default: The legacy Meta XR pose. Use this when working with assets designed for the Meta XR Plugin.
  • Grip: The OpenXR standard grip pose. Use this for cross-plugin compatibility.
  • Aim: The OpenXR standard aim pose. Use this for cross-plugin compatibility with assets designed for the aim pose convention.
If objects attach at the wrong angle, the pose alignment setting may not match the convention your assets expect. If migrating from Default to Grip (or vice versa), add a UOculusXRLegacyPoseTransformComponent to offset the transform difference.

Learn more

To learn more about using controllers in XR applications in Unreal Engine, see the following guides: