Skip to main content

Troubleshooting

Common issues organized by symptom. Each entry lists the symptom, likely cause, and fix.

Awareness / Perception

SymptomCauseFix
No candidates detected at allSampler trace channel doesn't match the actor's collision channelSet the actor's collision object type to one that responds to your sampler's TraceChannel (e.g., Visibility or a custom channel)
Candidate detected but wrong actor winsScorer weights or ResolverPolicy are misconfiguredCheck that ResolverPolicy matches your intent (LowestScore = closest wins with DistanceScorer) and adjust Weight values on each scorer
Candidate flickers between two actorsStickyBias is too low for closely-spaced candidatesIncrease StickyBias on the FERPChannelPipeline (e.g., 0.2 or higher) to add hysteresis
Candidate lost when looking awayA ConeFilter or LineOfSightFilter is too restrictiveWiden the ConeFilter angle or remove filters that are too aggressive for your use case
Candidate never updatesPerceptionTickInterval is set very high or bEvaluateOnlyForLocalController is true on a dedicated serverLower the tick interval; on dedicated servers, set bEvaluateOnlyForLocalController to false if server-side perception is needed
OnChannelCandidateAcquired never firesNo pipeline is configured for the channel, or the ChannelId is misspelledVerify that ChannelPipelines on ERPAwarenessComponent has an entry whose ChannelId exactly matches your domain component's ChannelId

Interaction

SymptomCauseFix
No interaction prompt appearsThe interactable actor doesn't pass pipeline filtersEnsure the actor has collision on the correct trace channel, and that ERPInteractableFilter is in the pipeline's Filters array
Prompt appears but pressing the key does nothingThe Actions array in the descriptor is emptyAdd at least one FERPInteractionAction with a valid InputAction to DefaultDescriptor.Actions
Prompt appears, key is pressed, still nothingThe InputAction passed to StartInteractionAttempt doesn't match any action in the descriptorUse the exact same UInputAction asset in both the descriptor and your input binding
"Too far" failure in Output LogServer-side distance check rejected the interactionIncrease MaxInteractionDistance on ERPInteractionComponent, or ensure the player is close enough
"Execution failed" in Output LogCanBeInteractedWith returned false, or an interaction Rule failedCheck your CanInteractCheck delegate and all Rules on the interaction component
Interaction works once then stopsActor state changed after the first interaction, making CanBeInteractedWith return falseVerify your interactable doesn't inadvertently block re-interaction after the first use
Challenge (hold/mash) never completesStopInteractionAttempt is called immediately (input binding fires Completed on the same frame)Bind StartInteractionAttempt to the Started trigger and StopInteractionAttempt to Completed (not Triggered)
Hold challenge resets mid-holdStopInteractionAttempt fires when the key is still physically heldCheck that your Enhanced Input action has the correct trigger (Hold trigger on the IA itself can conflict; use a simple Press trigger and let the challenge handle timing)
Wheel doesn't openMultiActionMode is set to DirectKeys instead of WheelSet DefaultDescriptor.MultiActionMode to Wheel
Wheel opens but selecting does nothingSubmitWheelSelection is called with the wrong UInputActionPass the InputAction from the selected FERPInteractionAction, not a different asset

Targeting

SymptomCauseFix
No lock-on / no soft targetNo targeting pipeline configured, or the target actor doesn't implement IERPTargetableAdd a pipeline with ChannelId matching ERPTargetingComponent.ChannelId, and ensure the target passes ERPTargetableFilter
Wrong target selectedScorer combination favors the wrong candidateTune scorer weights; add a ConeScorer or ViewportEllipseScorer to prefer on-screen targets
Target sticks too long when looking awayStickyBias is too highLower StickyBias on the targeting pipeline (0.0 disables hysteresis entirely)
Lock-on snaps to a dead enemyCanBeTargetedBy still returns true on deathReturn false from CanBeTargetedBy when the target is dead or despawning
Reticle widget doesn't appear on the targetERPTargetableComponent is missing or the widget class is not setAdd ERPTargetableComponent to the target actor and assign a ReticleWidgetClass

Instanced Interaction

SymptomCauseFix
No proxy actor spawns near ISMC instancesMeshConfigTable is null or the mesh in the DataTable doesn't match the ISMC meshAssign the DataTable to ERPInstancedInteractionComponent.MeshConfigTable and verify the Mesh soft reference matches exactly
Proxy spawns but has no visible meshThe current state step has Mesh set to nullSet a valid UStaticMesh on the active FERPInstanceStateStep.Mesh
Proxy spawns at the wrong locationThe ISMC instance transform includes an unexpected component-space offsetVerify the ISMC component's own transform; the proxy uses the instance's world transform
State doesn't persist after leaving and returningERPInstanceSwapSubsystem state was purged or never writtenEnsure the proxy calls SetInstanceState on the subsystem; check that PurgeStaleStates isn't clearing it too aggressively
ISMC instance reappears after proxy despawnsThe distant stand-in mesh is not configuredSet FERPInstanceStateStep.DistantMesh to the mesh that should remain visible at distance
Proxy is interactable in a state where it shouldn't beThe state step has actions in its descriptorClear the Actions array in the FERPInstanceStateStep.Descriptor for non-interactable states

Widgets

SymptomCauseFix
Widget doesn't show when looking at interactableSingleActionWidgetClass (or the relevant widget class) is not set on ERPInteractableComponentAssign a widget Blueprint class to the appropriate slot (SingleActionWidgetClass, MultiActionWidgetClass, etc.)
Widget shows but displays "?" instead of the keyThe InputAction on the action doesn't have a key binding in the current InputMappingContextAdd the InputAction to your InputMappingContext with a key mapping
Widget doesn't hide when walking awayThe widget's OnFocusChanged is overridden but doesn't call the parent or toggle visibilityEnsure your override calls Super or manually sets visibility to Collapsed when bFocused is false
Widget appears at the actor's feetWidgetOffset is (0,0,0) and no ERP_WidgetAnchor tagged component existsSet WidgetOffset to something like (0, 0, 150) or add a SceneComponent with tag ERP_WidgetAnchor
Widget shows stale data after the actor changes stateThe descriptor changed but the widget wasn't notifiedCall ForceRefreshDescriptor() on the interaction component after changing the interactable's state
Challenge sub-widget doesn't update progressOnActionProgress in your interaction widget doesn't forward to the challenge sub-widgetOverride OnActionProgress and call SetChallengeProgress(Progress) on the matching UERPChallengeWidgetBase

Performance

SymptomCauseFix
High tick cost from perceptionPerceptionTickInterval is 0 (every frame) with many candidatesIncrease PerceptionTickInterval (e.g., 0.1 = 10 Hz) to reduce evaluation frequency
Sphere overlap is expensiveSampling range is very large (e.g., 5000+) in a dense worldReduce DefaultSamplingRange to the minimum needed; use separate channels with different ranges for interaction (short) vs. targeting (long)
Too many candidates scored each tickNo filters are configured, so every overlapped actor goes through scoringAdd filters (ERPDistanceFilter, ERPConeFilter, ERPLineOfSightFilter) before scorers to cull early
Instanced interaction causes hitchesMany proxies spawning/despawning simultaneouslyIncrease ScanInterval on ERPInstancedInteractionComponent and reduce SwapRadius to limit concurrent proxies
Widget components cause draw call spikesMany world-space widgets rendering simultaneouslyUse AmbientWidgetClass sparingly; consider screen-space HUD widgets driven from OnDomainCandidateChanged instead

General Tips

  • Enable debug logging: Set bDebugPerception = true on ERPAwarenessComponent to see candidate evaluation in the Output Log. Filter by LogElysAwareness.
  • Check channel IDs: The most common silent failure is a ChannelId mismatch between the pipeline and the domain component. They must match exactly (case-sensitive).
  • Verify collision setup: Perception samplers use physics traces. If an actor has no collision or is on the wrong channel, it will never be detected.
  • Test in standalone first: Multiplayer adds server-side validation. Get interactions working in standalone PIE before testing client-server.