Poke Interactions
Updated: Nov 4, 2025
Design Guidelines: Providing a comfortable hand tracking experience is essential for creating immersive and enjoyable apps. Refer to the
Design Guidelines at the bottom of the page to learn about best practices and to minimize risks of user discomfort.
Poke interactions let you interact with surfaces via direct touch using hands, controller driven hands, and controllers.
Note: If you are just getting started with this Meta XR feature, we recommend that you use
Building Blocks, a Unity extension for Meta XR SDKs, to quickly add features to your project.
A
PokeInteractor scores the best
PokeInteractable to hover over by computing the closest
PokeInteractable by distance, as defined by an
ISurfacePatch.
Additionally, a PokeInteractor determines that a selection should occur when the point transform across two consecutive frames intersects the ISurface of the PokeInteractable in the direction of the surface normal. This way it can handle both fast presses as well as require that presses originate only from above a surface.
A
PokeInteractable represents a pokeable surface, like a button or a user interface. It uses
MinThresholdsConfig to determine when to enter a hover. You can adjust unselection and reselection criteria using
RecoilAssistConfig. Pokeable surfaces use
DragThresholdsConfig to distinguish between dragging and pressing, and to suppress move pointer events when a poke interactor follows a pressing motion. During a drag, you can create a sense of friction using
PositionPinningConfig.
In this example from the PokeExamples scene, number 1 (the white plane) is the surface of the button, and number 2 (the blue line) is the normal.
Poke Interactions with Hands
For hands, we recommend using a
HandJoint component for specifying the transform point of a
PokeInteractor.
HandBone defines the point transform to be used for computing both hovering and selection via
ISurface. This component computes a transform that’s relative to a given hand joint on an
IHand. For direct touch, it’s best to use the index finger.
Poke Touch Limiting with Hands
To enable Touch Limiting with Poke Interactions, two additional components are required.
A
SyntheticHand is required for overriding the wrist position of hand data based on the poke interaction.
A
HandPokeLimiterVisual component will lock a
SyntheticHand’s wrist to a constrained mode when a
PokeInteractor defines the point transform to be used for computing both hovering and selection via
ISurface is selecting.
An example of Poke Touch Limiting can be seen in the PokeExamples sample scene.
Note: If you want a button to move as you poke it as showcased in the PokeExamples scene, add the
PokeInteractableVisual component, which takes a reference to the
PokeInteractable and the trigger plane. The trigger plane acts as the poke limiting plane, or the “stopping point” of button travel. The transform on which this
HandPokeLimiterVisual is placed will move as it’s pressed, stopping at the trigger plane, after which Poke Limiting will begin.
Poke Interaction with Unity Canvas