Develop

Interaction SDK Best Practices

Updated: Apr 15, 2026

Overview

This page covers best practices for configuring Interaction SDK (ISDK) interactions in Unreal Engine, including poke, ray, grab, and widget interactables. Consult this guide when setting up new interactable components or troubleshooting unexpected interaction behavior. Each interaction type follows the standard ISDK lifecycle, transitioning between Normal, Hover, and Select states as the user engages with interactable surfaces.

Avoid overlapping pointable surfaces with poke and ray interactables

In general, you should use a single interactable component and pointable surface when setting up poke interactables or ray interactables. It is possible to add multiple interactable and pointable plane components to a single Actor. If your use case requires multiple interactables, avoid having the pointable surfaces overlap.
The IsdkPokeInteractor uses a distance-based ranking algorithm to select the best surface candidate. It ranks surfaces by normal distance first, then applies a tiebreaker score when candidates fall within an equal-distance threshold, and finally considers tangent distance. When surfaces overlap with near-identical normal distances, this ranking becomes non-deterministic, causing the interactor to switch unpredictably between surfaces.
If surfaces must overlap, in practice, an offset of approximately 1.0 Unreal unit between surfaces has been sufficient to differentiate them during interaction detection. The exact threshold depends on internal SDK values and may vary between versions.

Add poke config data asset for each type or group of poke interactions

The config asset for the IsdkPokeInteractable component is a shared UDataAsset. The default config asset is IsdkPokeInteractablePanelConfig, located at /OculusInteraction/Configurations/. Because it is a UDataAsset, changes to the default asset apply globally to all IsdkPokeInteractable components that reference it.
To customize behavior for a specific poke interaction or group of interactions, create a new Data Asset using the ISDK Poke Interactable Config Data Asset class and assign it to the IsdkPokeInteractable component’s Config Asset property.
The config asset contains four sub-sections:
  • MinThresholdsConfig: Determines when to enter a hover state.
  • PositionPinningConfig: Creates a sense of friction on the touch point.
  • DragThresholdsConfig: Distinguishes between dragging and pressing motions.
  • RecoilAssistConfig: Adjusts the criteria for ending and restarting a selection.
By default, PositionPinning and RecoilAssist are enabled. DragThresholds and MinThresholds are disabled.
For per-instance fine-tuning without creating a new asset, use the Config Offsets properties (NormalOffset and TangentOffset) on the IsdkPokeInteractable component. These values apply additively to all hover and cancel thresholds from the config asset.

Size the pointable plane correctly for ray interactables

The IsdkPointablePlane component’s Size property represents the distance from the center point to the edge (half-extents). The total bounding area is double the Size value in each dimension.
Assign the IsdkPointablePlane to the IsdkRayInteractable component’s Pointable Plane property so the ray interactor can detect the surface boundaries.
For Widget Blueprints, use the IsdkInteractableWidget actor instead. It pre-configures the pointable plane and interaction components for UMG widget use.

Configure grab detection carefully

The IsdkGrabbableComponent defaults to FindStaticMesh collider mode, which uses the first static mesh component’s collision shape. For precise grab zones, consider using Sphere or Box collider modes with explicit radius or extent values.
By default, only the HandGrab detector type is enabled with Palm and Pinch input methods. To support distance grab or ray grab, enable the corresponding detector types in the Allowed Grab Detector Types bitmask.
For multi-grab scenarios, choose the appropriate Multi Grab Behavior:
  • SingleGrabFirstRetained: The first hand to grab retains control.
  • SingleGrabTransferToSecond: Control transfers to the second hand.
  • MultiGrab: Both hands can grab simultaneously (default).
Each grab transformer constrains motion differently:
  • IsdkGrabFreeTransformer: Unconstrained movement and rotation.
  • IsdkOneGrabRotateTransformer: Constrains to rotation only.
  • IsdkOneGrabTranslateTransformer: Constrains to translation only.
Select the transformer that matches your interaction design.

Use IsdkInteractableWidget for UMG widget interactions

The IsdkInteractableWidgetComponent creates both poke and ray interactables by default. Disable the interaction type you do not need via the bCreatePokeInteractable or bCreateRayInteractable flags.
The component creates separate IsdkPointablePlane instances for poke and ray, so each interaction type can have different surface boundaries.
Assign a custom poke config asset via the Default Poke Interactable Config Asset property. Use the Normal Offset and Tangent Offset properties for per-widget tuning of hover and cancel thresholds.

Learn more

To learn more about setting up and configuring interactions, see the following guides: