Develop

Gaze Grab Interactions

Updated: Sep 8, 2026

What Are Gaze Grab Interactions?

Gaze grab interactions let you target an object by looking at it and then grab, hold, and move it using a hand pinch. Use cases include picking up distant objects without a ray, staging props in front of you, and moving items between surfaces without walking closer.
In v207, gaze grab is a hands-only path. Controllers and controller-driven hands are not iterated when gaze mode subscribes to hand selection, so a pinch on a controller does not actuate a gaze grab.
Gaze grab uses the same UIsdkGrabbableComponent as hand and controller grab. There is no gaze-specific interactable to add to the object. Any actor that is already grabbable becomes a gaze-grab candidate the moment the pawn enters gaze mode, subject to that grabbable allowing RayGrab and to its own gaze policy (see Per-Object Gaze Policy).

Ray Grab Prerequisite

Gaze grab reuses the ray-grab pathway on the grabbable. UIsdkGrabbableComponent::AllowedGrabDetectorTypes defaults to HandGrab only, so a fresh grabbable is invisible to gaze until you enable RayGrab on it. A grabbable with RayGrab disallowed does not appear as a gaze-grab target, even while gaze is targeting it. For step-by-step setup, see Create a Gaze-Grabbable Object.
Details panel showing Allowed Grab Detector Types set to Hand Grab and Ray Grab on the grabbable component.

How Do Gaze Grab Interactions Work?

Gaze grab is implemented as a temporary reconfiguration of the pawn’s grabbers. When gaze mode turns on, the gaze rig reshapes each grabber to accept a single gaze-driven candidate. When gaze mode turns off, the original grabber configuration is restored.

Entering Gaze Mode

When gaze mode turns on, the gaze rig performs the following on each hand’s grabber:
  1. Caches the pawn’s grabbers so the exit path can address the same set.
  2. Snapshots which grab modes each grabber currently allows across HandGrab, RayGrab, and DistanceGrab so the exit path can restore them exactly.
  3. Injects a gaze-driven detector into the grabber’s ray-grab slot. This detector replaces the built-in ray detector for the duration of gaze mode without altering it, and it reports only the gaze-supplied candidate while supplying its own move-in-place motion.
  4. Sets RayGrab allowed and DistanceGrab disallowed on the grabber. HandGrab is left at its default, so near-hand grab continues to work alongside gaze.
Ordered flow of the four operations the gaze rig applies to each grabber when gaze mode turns on.
Every step is reversible: the snapshot taken in step 2 is read back and restored exactly when gaze mode turns off.

While Gaze Mode Is Active

Only one hand actuates a gaze selection at a time. For the far-UI selection driven from gaze, the first hand to begin a selection while gaze is hovering the target owns the interaction, and a begin from the other hand is ignored while that ownership is held.
The gaze rig exposes the current gaze target through UIsdkGazeTargetingComponent, which you reach from the pawn’s UIsdkGazeRigComponent via GetGazeTargeting(). Call GetCurrentGrabbable() for the current target and bind OnGazeGrabbableChanged to react to transitions, including transitions to and from nullptr. OnGazeGrabbableMove fires when the hit point on the same grabbable moves.
// In your Actor header, declare a UFUNCTION handler for AddDynamic.
UFUNCTION()
void HandleGazeGrabbableChanged(UIsdkGrabbableComponent* NewGrabbable);

// In your Actor's BeginPlay. The pawn owns the UIsdkGazeRigComponent.
void AMyGazeConsumer::BeginPlay()
{
    Super::BeginPlay();
    if (UIsdkGazeRigComponent* GazeRig = FindComponentByClass<UIsdkGazeRigComponent>())
    {
        if (UIsdkGazeTargetingComponent* Targeting = GazeRig->GetGazeTargeting())
        {
            Targeting->OnGazeGrabbableChanged.AddDynamic(
                this, &AMyGazeConsumer::HandleGazeGrabbableChanged);
            UIsdkGrabbableComponent* Current = Targeting->GetCurrentGrabbable();
            // Use Current for the initial state if a grabbable is already hovered at BeginPlay.
        }
    }
}
Chain from the pawn through the gaze rig and targeting component to the current grabbable, with two delegates branching off.
OnGazeGrabbableChanged fires on every transition, including to and from nullptr, and OnGazeGrabbableMove fires when the hit point moves.

Exiting Gaze Mode

When gaze mode turns off, the injected detector is removed from each grabber, the built-in ray detector resumes on the ray-grab slot, and the per-detector allowance mask captured on entry is restored exactly. The pawn’s grabbers return to their pre-gaze configuration.

Grab Interaction Behavior

GrabInteractionBehavior on UIsdkGazeRigComponent controls what happens to the gaze far-UI pointer, used for UI panels, while any hand is holding a grab. It does not gate the injected ray-grab detector on the grabber. The default is AllowNewHovers.
ValueEffect on Gaze Far UI While a Grab Is Held
AllowNewHovers
No extra suppression. New hovers and selects on the far-UI interactor are allowed.
BlockNewHovers
No new hover or select on the far-UI interactor. An already-active hover is left alone.
DropAllHovers
No new hover or select, and any active hover on the far-UI interactor is torn down for the duration of the held grab.

Per-Object Gaze Policy

UIsdkGrabbableComponent::GazePolicy is an EIsdkGazePolicy on the grabbable that opts an individual object in or out of gaze targeting. The default is UsePluginSetting, which defers to the plugin’s Allow Gaze By Default setting.
ValueDisplay NameBehavior
UsePluginSetting
Use Plugin Setting
Defers to the plugin’s Allow Gaze By Default setting.
Allow
Allow
The grabbable participates in gaze targeting regardless of the plugin default.
Disallow
Disallow
The grabbable is excluded from gaze targeting regardless of the plugin default.
Two-stage flow: gaze targeting reports every hovered grabbable, then the gaze policy filter runs at grabber hand-off.
No policy filter runs during reporting, so a Disallow object is still reported through OnGazeGrabbableChanged before the grabbers refuse it.
A Disallow grabbable is still reported through GetCurrentGrabbable() and still fires OnGazeGrabbableChanged. Gaze targeting does not filter by policy; the filter runs one step later, when the gaze rig hands a candidate to the grabbers. If you drive a hover highlight from OnGazeGrabbableChanged, expect a Disallow object to light up and then refuse to grab. Bind highlights to the grabber’s hover state, or read GazePolicy on the reported grabbable, if you want the highlight to match what is grabbable.

Learn more

Now that you know how gaze grab routes gaze targets into the pawn’s grabbers, continue on to the following guides: