Develop
Develop
Select your platform

HandGrab Use Interactions

Updated: Nov 3, 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.

HandGrabUse lets you use an object with some fingers while grabbing it with hands or controller driven hands. For example, squeezing a ball or pressing a trigger. This interaction is typically used as a secondary-interaction with a normal HandGrab Interaction. To learn how to make an object be used only while grabbing it, read the SecondaryInteractions section. To learn about best practices when designing for hands, see Designing for Hands.

HandGrabUseInteractor

HandGrabUseInteractor calculates the strength of use of each finger via IFingerUseAPI. When you select an interactable, it passes the strength of the fingers for it to be transformed into the progress of the interaction.
This interactor can also take advantage of the HandGrabVisuals to drive a SyntheticHand, so the fingers are animated based on the progress of the action.

IFingerUseAPI

IFingerUseAPI specifies how strong is the use-pose for each finger. Typically this means how curled each finger is, but other approaches are possible such as indicating how close the thumb tip is to the index (for clicking a pen) or how pressed the triggers of a controller are.

HandGrabUseInteractable

The HandGrabUseInteractable defines which fingers can use the object and it also transforms the strength of pose to the actual progress of the action. This value is the UseProgress property that is read from the interactable.

HandGrabUseDelegate

Most times, you will want to customize how the strength is transformed into progress. For example: consider a trigger with some resistance, even if the fingers are fully curled, reporting max strength (1f) from the Interactor, the interactable might slowly animate this value towards one. This way the trigger will take longer to squeeze.
An optional IHandGrabUseDelegate can be provided to establish how this transformation is calculated, and also indicate when the interaction starts or ends. This allows directly writing the progress and results of the interaction in a single gameplay script, without even having to read the UseProgress variable from the Interactable. For example, in HandGrabUseExamples, the WaterSpray.cs script transforms the strength of the index and middle fingers into the progress of the action, moves the trigger accordingly and fires water as soon as the calculated progress reaches a threshold.
Use Fingers: the rules for each finger to perform the interaction: All Required fingers must be pressed to perform the interaction, if no required fingers are set, any of the Optional fingers can perform the usage interaction.
Strength Deadzone: establishes a threshold, fingers with a strength lower than the dead zone will not be considered to be “in use” at all and can still move freely.
Relaxed Hand Grab Pose: this is the HandGrabPose the visual hand will adopt at the minimum progress of use (past the dead zone). Typically this will be exactly the same HandGrabPose as the one being used by the HandGrabInteractable.
Tight Hand Grab Pose: this is the HandGrabPose the visual hand will adopt when the progress is at maximum level.
The interactor will read an interpolated pose between the Relaxed and Tight poses for each finger (that is not marked to Ignore by the UseFingers rules).

Learn more

Design guidelines

Hands

Core interactions

Did you find this page helpful?
Thumbs up icon
Thumbs down icon