UIsdkGazeRigComponent::WireHandInteractorGazeGate() builds a UIsdkConditionalGroupNone (a NOR) around the internal gaze mode boolean. That gate resolves true exactly when gaze mode is off, and it is added to each ray rig’s enabled conditional group, which is a logical AND. A ray interactor is therefore enabled only while gaze mode is off.
WireHandInteractorGazeGate() calls Owner->GetComponents() for UIsdkRayInteractionRigComponent with no filter on hand versus controller. Because UIsdkControllerRigComponent derives from UIsdkRigComponent and hosts ray interactors the same way a hand rig does, the controller’s ray interactor is gated off in gaze mode alongside the hand ray.
SubscribeHandSelectDelegates() iterates the owner’s UIsdkHandRigComponent collection to bind hand select and unselect events that drive gaze selection. UIsdkControllerRigComponent is not a UIsdkHandRigComponent, so no controller input path binds into HandleHandSelect or HandleHandUnselect. A user holding a controller in gaze mode therefore has the controller’s ray disabled and no path to actuate a gaze selection from the controller.

ApplyGazeModeToGrabbers() deliberately preserves near hand grab. It marks RayGrab as allowed on the grabbers and DistanceGrab as disallowed, and the source notes that direct or hand grab is left at its default so near hand grab stays available.ActuatingHand, a TWeakObjectPtr<UIsdkRigComponent>. The first hand to begin a selection owns the interaction, and the other hand’s begin event is ignored until the owning hand releases. A single region interactor, UIsdkRegionInteractionRigComponent, is shared by both hands.
SetGazeMode() applies on the next tick during reconciliation.| Entry Point | Signature | Availability |
|---|---|---|
Rig method | UIsdkGazeRigComponent::SetGazeMode(bool), ToggleGazeMode(), GetGazeMode() | C++ and Blueprint |
Function library | UIsdkGazeFunctionLibrary::SetGazeMode(UObject*, bool), ToggleGazeMode(UObject*), GetGazeState(UObject*) | Blueprint, callable from any world context |
Console command | Meta.InteractionSDK.ToggleGazeMode | Console |

GetGazeMode() returns the applied state, not any pending request. To react to transitions, bind the OnGazeModeChanged multicast delegate, which passes a single bool bIsGazeMode. The following example binds the delegate and toggles gaze mode from an actor.// MyPlayerActor.h
#include "Rig/IsdkGazeRigComponent.h"
UPROPERTY() UIsdkGazeRigComponent* GazeRig;
UFUNCTION() void HandleGazeModeChanged(bool bIsGazeMode);
// MyPlayerActor.cpp
void AMyPlayerActor::BeginPlay()
{
Super::BeginPlay();
GazeRig->OnGazeModeChanged.AddDynamic(this, &AMyPlayerActor::HandleGazeModeChanged);
GazeRig->SetGazeMode(true); // applies on the next tick during reconciliation
}
void AMyPlayerActor::HandleGazeModeChanged(bool bIsGazeMode)
{
// React to the applied transition (e.g., swap reticle, adjust UI).
}
SetInjectedRayGrabDetector(nullptr) on each grabber, which reinstates the built-in ray detector. The allowance bitmask that was snapshotted into SavedGrabDetectorAllowances when gaze mode was entered is written back to each grabber and then cleared. CachedGrabbers is emptied. Nothing on the grabbers remains mutated by the gaze session.