Troubleshoot gaze attention
Diagnose and fix gaze attention issues — objects not highlighting, attention never promoting, cursor not appearing, and component-scoped gaze not matching.
Use this page to diagnose and fix the most common gaze attention problems. Each entry follows a symptom / cause / fix / verify structure.
If you have not completed the baseline setup yet, start with Gaze attention quick start and return here only when a specific symptom persists.
Objects do not highlight when gazed at
Symptom: The player looks directly at a world actor but no silhouette or wireframe appears.
Cause (most likely): One of these conditions:
The actor does not have a
UConvaiObjectComponent.bEnableGazeAttentionisfalseon the player component.bGazeableisfalseon the object'sUConvaiObjectComponent(under Convai | Object | Gaze).
Fix:
Select the actor in the level. In the Details panel, confirm a
UConvaiObjectComponentis listed under Components.On that object component, expand Convai | Object | Gaze and confirm Gazeable (
bGazeable) is checked.Select
UConvaiPlayerComponenton the player pawn. Under Convai | Gaze Attention, confirm Enable Gaze Attention is checked.If the actor uses a custom mesh with No Collision set on the primitive, the line trace will pass through it. Set the collision channel to at least Visibility and confirm the trace channel on
UConvaiPlayerComponentmatches (GazeTraceChannel, defaultECC_Visibility).If the actor is outside the trace range, increase
GazeMaxDistance(default 5000 cm).
Verify: Enter Play mode. Point the crosshair at the actor. A highlight should appear immediately (pale-yellow overlay on UE 5.3+, wireframe box on UE 5.0–5.2), and the cursor dot should turn white.
Object highlights but attention is never promoted
Symptom: The silhouette appears when looking at the object, but OnAttentionGained never fires on UConvaiPlayerComponent.
Cause: One of three conditions:
The player is not holding gaze on the same actor/primitive long enough to reach
GazeAttentionDelay.GazeAttentionDelayis set higher than expected.The Blueprint event is bound to a different
UConvaiPlayerComponentthan the one running gaze attention.
Fix:
Keep the crosshair on the same highlighted object until the full
GazeAttentionDelayduration elapses.Confirm that
GazeAttentionDelayis not set to an unexpectedly high value.Bind the diagnostic print to
OnAttentionGainedon the sameUConvaiPlayerComponentthat has Enable Gaze Attention checked.
Verify: Add a Blueprint bind to OnAttentionGained on UConvaiPlayerComponent and print a screen message. Enter Play mode and hold gaze on the object for GazeAttentionDelay seconds. The message should appear.
Attention is promoted but the character does not speak
Symptom: OnAttentionGained fires (verified via Blueprint print), but the character is silent.
Cause: One of these conditions:
GazeShouldRespond is Never
Attention updates silently; no LLM reply is requested. Default on a fresh player component.
Enable Actions is off
SetObjectInAttention and gaze fan-out have no effect on the chatbot.
AttentionSource is Explicit (Blueprint/C++)
A direct SetObjectInAttention call holds the slot; gaze updates are rejected.
Session is not active
Local attention state may update but no request reaches Convai.
Fix:
Set
GazeShouldRespondtoAlwaysonUConvaiPlayerComponent.Fill in
GazeAttentionTextwith a descriptive sentence. Without text, the attention event carries no narrative context and Convai may not generate a meaningful response even whenShouldRespondisAlways.On the chatbot, expand Convai | Actions → Environment and confirm Enable Actions (
EnvironmentData.bEnableActions) is checked.During Play mode, read
AttentionSourceonUConvaiChatbotComponent(under Convai | Actions). If it showsExplicit (Blueprint/C++), find the Blueprint call that setSetObjectInAttentionand clear the slot with an emptyFConvaiObjectEntry.Confirm the chatbot session is connected. See Session lifecycle for connection diagnostics.
Verify: Set GazeShouldRespond to Always, enter Play mode, and look at the object for GazeAttentionDelay seconds. The character should begin speaking.
Cursor does not appear
Symptom: No center-of-screen dot is visible when gaze tracking is on.
Cause: bShowGazeCursor is false, or the cursor widget class reference is invalid, or the cursor IdleColor alpha is 0 and gaze is not currently on a Convai object.
Fix:
Confirm Show Gaze Cursor (
bShowGazeCursor) istrueonUConvaiPlayerComponent.In Play mode, aim the crosshair directly at a tagged Convai object. The cursor switches to
GazeCursorActiveColor(default white). If it appears only when aimed at a Convai object, it is working correctly — the idle state is transparent by design.To make the cursor always visible, set Always Show Gaze Cursor (
bAlwaysShowGazeCursor) totrue.If the cursor still does not appear, check that
GazeCursorWidgetClasshas not been set to a class that was deleted or renamed.
Verify: Set bAlwaysShowGazeCursor to true, enter Play mode. A white dot should be visible at screen centre at all times.
Highlight color does not match the configured value
Symptom: The silhouette appears but is white or a different color than set in GazeHighlightColor.
Cause (UE 5.3+): A custom GazeOverlayMaterial does not expose an EmissiveColor vector parameter, so the color cannot be applied.
Cause (UE 5.0–5.2): The wireframe fallback (DrawDebugBox) uses GazeHighlightColor, but it does not use GazeOverlayMaterial or GazeHighlightEmissiveIntensity. Material-only changes have no effect on the fallback path.
Fix:
If using a custom
GazeOverlayMaterial, confirm the material exposes a vector parameter namedEmissiveColor. Only this parameter name is driven by the highlight system.On UE 5.0–5.2, set
GazeHighlightColordirectly because the highlight appearance is limited to a wireframe box. Upgrade to UE 5.3 or later to use the overlay material system.If
GazeOverlayMaterialis unset and the UE 5.3+ silhouette is white (not pale yellow), the plugin asset/ConvAI/Highlights/M_ConvaiGazeOverlaymay have been stripped from a cooked build. The fallback material/Engine/EngineMaterials/EmissiveMeshMaterialhas no parameters. Re-package the plugin content.
Verify: Set GazeHighlightColor to a saturated red (1.0, 0.0, 0.0, 1.0) and enter Play mode. The silhouette should appear red when looking at a tagged object.
Gaze engages objects behind thin walls
Symptom: Objects on the other side of a wall or floor are highlighted when the player looks in that direction.
Cause: The world geometry does not block the GazeTraceChannel — typically because the mesh uses No Collision or a channel set to Ignore.
Fix:
Select the wall or floor mesh. In the Details panel under Collision, confirm that the
GazeTraceChannel(defaultECC_Visibility) is set to Block.Alternatively, change
GazeTraceChannelonUConvaiPlayerComponentto a custom channel that only your interactable objects and blocking geometry respond to.
Verify: Enter Play mode and look at the wall. Objects on the other side should no longer highlight.
Angle tolerance causes wrong object to be highlighted
Symptom: The player looks at one object but a nearby object is highlighted instead.
Cause: GazeAngleTolerance is set too high, causing the dot-product fallback to prefer a larger or differently placed object that better aligns with the view direction.
Fix: Reduce GazeAngleTolerance (default 5 degrees, advanced display). If the objects require precise aiming, set GazeAngleTolerance to 0 to disable the fallback entirely and require a direct line-trace hit.
Verify: Set GazeAngleTolerance to 0 and enter Play mode. Objects should only highlight when the crosshair is directly over them.
Component-scoped highlight appears on the wrong sub-mesh or the whole actor
Symptom: A UConvaiObjectComponent with ObjectEntry.ComponentName set highlights the entire actor instead of only the named sub-mesh, or the highlight does not appear at all when looking at the intended part.
Cause: One of four conditions:
ObjectEntry.MoveTargetModeis stillActor as goal(the default). Gaze ignoresComponentNameuntil Move Target Mode isComponent as goal.The
ComponentNamevalue does not match any component on the actor (typo, renamed component, or substring mismatch).The component tree changed at runtime and the cached resolve is stale.
The target sub-mesh has no collision on
GazeTraceChannel, so the line trace never hits it.
Fix:
On the
UConvaiObjectComponent, expand Object Entry and set Move Target Mode toComponent as goal.In Play mode, call
GetResolvedComponent(true)on theUConvaiObjectComponentfrom Blueprint and print the return value. Anullptrresult means the name did not resolve — check the exact component name in the Details panel hierarchy.Confirm that
ObjectEntry.ComponentNameis a substring of the target component's label as shown in the Components panel (for example,"Handle"matchesSM_DoorHandlebut notSM_Knob).If the actor's component tree is built at runtime (procedural generation, dynamic attachment), call
GetResolvedComponent(true)after the tree is fully constructed rather than relying on the cached result from load time.Confirm the target component has collision enabled on the
GazeTraceChannel. A component with no collision will never be hit by the line trace, so the scoped match cannot fire even if the name resolves correctly.
Verify: After correcting Move Target Mode and ComponentName, enter Play mode and aim the crosshair at the specific sub-mesh. Only that mesh should highlight; other parts of the actor should remain unaffected. GetResolvedComponent(false) should return the correct component reference.
Next steps
Gaze attention quick startHow gaze attention worksGaze attention referenceGaze attention usage examplesLast updated
Was this helpful?