DiscreteScrollInputProvider scrolls a Unity UI ScrollRect in response to discrete directional scroll commands. The component is not tied to microgestures. It exposes ScrollUp, ScrollDown, ScrollLeft, and ScrollRight methods that any discrete input source can call, including thumb swipe microgestures, keyboard input, and on-screen buttons.DiscreteScrollInputProvider is bound to one interactor through its Interactor field, so scrolling is per-interactor rather than scene-wide. The component tracks the ScrollRect that its own interactor hovers, and applies scroll impulses to that panel. The interactor does not have to be a GazeInteractor: the field accepts any component that implements IInteractorView. Because the binding is one-to-one, a scroller stops applying scroll while its interactor is disabled, so a scroller bound to a hand interactor goes quiet while that hand is driving locomotion or holding a grabbed object. To support scrolling from more than one interactor, add one scroller to each. To follow whichever interactor is currently winning instead, assign an InteractorGroup to the Interactor field. InteractorGroup implements IInteractorView, so a single scroller then scrolls whatever the group’s active interactor hovers.MicrogestureScroll prefab packages the component together with the microgesture wiring, which is the setup this guide covers.
GazeInteractorcom.meta.xr.sdk.core) installed, which provides OVRMicrogestureEventSource and OVRHand. This is included as a dependency of the Interaction SDK OVR integration package.ScrollRect panels in the scenePointableCanvas component, and a PointableCanvasModule on the scene’s EventSystemMicrogestureScroll and select the MicrogestureScroll prefab, located in Packages > Meta XR Interaction SDK > Runtime > Prefabs > Microgestures.
GazeInteractor GameObject in the Hierarchy so that it becomes a child of that interactor. Dropping it onto the interactor is what lets the editor bind the two together, as described in the next section.
DiscreteScrollInputProvider: applies scroll impulses to the hovered ScrollRect.OVRMicrogestureEventSource: reports thumb swipe microgestures for one hand.
MicrogestureScroll GameObject and check the Interactor field on the DiscreteScrollInputProvider component in the Inspector. It should name the interactor you dropped the prefab onto.
IInteractorView and assigning the first one it finds. Two limits apply:Auto-wiring failed when no interactor is found in the parent chain, and an unassigned Interactor raises an assertion failure when you enter Play mode.OVRMicrogestureEventSourceHand field unset.MicrogestureScroll GameObject.OVRMicrogestureEventSource component and assign the OVRHand for the hand that drives scrolling for this interactor.
OVRMicrogestureEventSource and therefore listens to one hand. To accept swipes from both hands on the same interactor, add a second MicrogestureScroll under that interactor and assign the other OVRHand.Update.MicrogestureScroll GameObject to configure them.| Inspector event | Gesture | Method called by default |
|---|---|---|
When Swipe Up | Thumb swipe forward | ScrollUp |
When Swipe Down | Thumb swipe backward | ScrollDown |
When Swipe Left | Thumb swipe left | ScrollLeft |
When Swipe Right | Thumb swipe right | ScrollRight |
When Tap Center | Thumb tap | None |
DiscreteScrollInputProvider on the same GameObject.
ScrollDown and When Swipe Down to ScrollUp.ScrollUp moves the content up, and the other three methods follow the same convention.MicrogestureScroll GameObject and adjust the following properties on the DiscreteScrollInputProvider component.| Property | Default | Description |
|---|---|---|
Scroll Speed | 2 | The speed at which scrolling occurs. Multiplies viewport size to determine velocity. The field accepts any float value and enforces no range. |
Stop Momentum On Target Change | Cleared | When set, scrolling stops as soon as the interactor’s target changes. |

ScrollRect does not support the swiped axis, the component walks up the hierarchy and scrolls the first ancestor ScrollRect that does. This is what makes a vertical swipe over a horizontal-only child scroll its vertical parent.DiscreteScrollInputProvider offers no per-ScrollRect overrides. Tune each panel on its own Scroll Rect component instead. Clear Horizontal or Vertical to restrict the axes, set Movement Type to Elastic and adjust Elasticity to change the bounce at the ends, and use Inertia with Deceleration Rate to change how quickly the panel coasts to a stop. See Unity Canvas Integration for how ISDK pointers drive Unity UI.MicrogestureScrollProvider, paired with a MicrogestureScrollSettings component for per-panel overrides. Both are deprecated and neither drives scrolling any more.MicrogestureScrollProvider GameObject from your scene.MicrogestureScrollSettings component from your ScrollRect panels. DiscreteScrollInputProvider does not read them, so the strength overrides and axis gating they declare have no effect.Scroll Rect component itself. It already exposes Horizontal and Vertical for axis gating, Movement Type with Elasticity, and Inertia with Deceleration Rate.MicrogestureScroll prefab under each interactor that needs scrolling, following the sections above.ScrollRect panel and nothing moves.DiscreteScrollInputProvider names the interactor doing the hovering.OVRMicrogestureEventSource names the OVRHand you are swiping with.ScrollRect uses World Space render mode and has a PointableCanvas component, and the scene’s EventSystem has a PointableCanvasModule.ScrollRect content is larger than its viewport. Content that fits has nothing to scroll.Scroll Rect component, on the panel or on one of its ancestors.GazeInteractor.DiscreteScrollInputProvider serves exactly one interactor. Add a MicrogestureScroll prefab under each interactor that needs to scroll.GazeRayExample sample scene — located at Packages/com.oculus.integration.interaction.ovrintegration/Samples/Examples/OculusDevicePartner/GazeRayExample.unity