UI and feedback
UI, prompt, and notification behavior.
This chapter covers the presentation layer exposed by the plugin: focus prompt widgets, per-slot interaction rows, progress updates, notification widgets, distant indicators, and focused-target visual feedback.
Presentation layers
- Focus prompt widget shows the currently focused target and its display slots.
- Interaction rows represent individual slots, such as Tap, Hold, Mash, Multi-Hit, Damage, or Toggle actions.
- Distant indicator exposes interactables outside prompt range but still relevant to the player.
- Notification widget communicates result messages such as denied interaction, missing requirements, or custom gameplay feedback.
- Outline and focus feedback reinforces which actor or foliage instance is currently selected.
Recommended widget architecture
For custom prompt UI, the recommended path is to derive the main prompt widget from InteractionFocusWidgetBase
and each repeatable slot row from InteractionRowWidgetBase. This keeps Blueprint presentation flexible while letting
the plugin handle stable interactor binding, focus payload delivery, slot refresh, and progress routing by SlotID.
InteractionFocusWidgetBase
InteractionFocusWidgetBase is the base class for the shared interaction prompt shown by the local interactor. It implements
Interaction Focus Receiver, receives FInteractionFocusData, optionally resolves the owning pawn's
InteractorComponent, refreshes the focused slots, and updates registered row widgets when interaction progress changes.
| Function or property | Purpose |
|---|---|
ApplyFocusData | Applies the focus payload pushed by the interactor and fires the Blueprint focus events. |
GetCurrentFocusData | Returns the latest FInteractionFocusData received by the widget. |
HasValidFocusData | Returns whether the current focus payload represents a valid actor or foliage target. |
InitializeForInteractor | Explicitly assigns the interactor. Use this for custom-created widgets or world-space widget workflows. |
ResolveInteractorReference | Resolves the interactor from the owning player pawn. It does not rely on GetPlayerPawn(0). |
BindInteractorEvents / UnbindInteractorEvents | Binds or removes the progress and lifecycle delegates used by the base widget. |
RefreshCurrentSlots | Pulls display slots from the currently focused target through the interactor. |
GetCurrentSlots | Returns the latest slot list used by the UI. |
FindCurrentSlotByID | Finds a refreshed slot by gameplay SlotID. |
GetInitialProgressFromSlot | Calculates normalized starting progress for Hold, Multi-Hit, Toggle, and Button Mash rows. |
DiscoverInteractionRows | Scans the widget tree for child widgets derived from InteractionRowWidgetBase. |
RegisterInteractionRow / UnregisterInteractionRow | Manually manages row widgets when your UI creates or recycles rows at runtime. |
SetInteractionRows / ClearInteractionRows | Replaces or clears the complete registered row list. |
UpdateProgressForSlot | Finds the row with a matching SlotID and updates its normalized progress. |
Automation flags
The base widget is designed to work automatically for common Blueprint widgets, but the behavior can be disabled for advanced custom UI.
| Flag | Default behavior |
|---|---|
bAutoDiscoverRows | Scans the widget tree for InteractionRowWidgetBase children during initialization. |
bAutoResolveAndBindInteractor | Automatically resolves the local interactor and binds progress/lifecycle events. |
bAutoRefreshSlotsOnFocusData | Refreshes CurrentSlots before On Focus Data Applied. |
bAutoUpdateRegisteredRows | Automatically routes progress updates into registered rows by SlotID. |
bResetProgressOnInteractionCompleted | Resets the completed slot's row progress to zero when a confirmed completion arrives. |
bRefreshSlotsOnHitConfirmed | Refreshes slots after confirmed hits, then recalculates Multi-Hit/Damage progress from the latest slot state. |
Blueprint events on the focus widget
| Event | Use it for |
|---|---|
On Focus Data Applied | Rebuild or update the visible prompt after valid focus data is received. |
On Focus Data Cleared | Hide the prompt, clear rows, or play an unfocus animation. |
On Display Slots Refreshed | Create/update row widgets from the refreshed slot list. |
On Slot Progress Updated | React when progress changes, even if no registered row matched the SlotID. |
On Widget Interaction Completed | Play completion animation/sound after server-confirmed completion. |
On Widget Hit Confirmed | React to confirmed Multi-Hit/Damage hits and update visual damage progress. |
On Widget Button Mash Failed | Reset mash visuals or play a failure state. |
InteractionRowWidgetBase
InteractionRowWidgetBase is an optional base class for individual slot rows. Use it for reusable row Blueprints so the
focus widget can update the correct progress bar without knowing your project-specific widget class.
| Function or event | Purpose |
|---|---|
SetInteractionSlotID | Assigns the gameplay slot represented by this row. Call this when building the row from an FInteractionSlot. |
GetInteractionSlotID | Returns the represented slot id. |
ClearInteractionSlotID | Clears the row's represented slot. Useful when recycling rows. |
SetInteractionRowProgress | Sets normalized progress, clamped to 0..1, and fires the row Blueprint event. |
GetInteractionRowProgress | Returns the latest clamped progress value. |
On Interaction Row Progress Updated | Implement this in Blueprint to set the ProgressBar percent or update custom row visuals. |
Widget helper library
InteractionWidgetLibrary provides generic Blueprint helpers for row-based UI. Use Find Interaction Row By Slot ID
to locate a row, or Update Interaction Row Progress By Slot ID to locate and update a row in one call.
Typical multi-slot prompt workflow
InteractionFocusWidgetBase. Use this widget class on your interactable or foliage widget settings.
InteractionRowWidgetBase. The row should expose your text, glyph, hint, and progress bar visuals.
On Display Slots Refreshed, loop through the received slots, create or reuse one row per slot, then call
SetInteractionSlotID on each row using the slot's SlotID.
Display.Prompt, hint text from Display.Hint, and glyph/icon from the slot's
InputAction or the focus data's InputAction.
GetInitialProgressFromSlot for Hold, Mash, Toggle, Multi-Hit, or Damage rows, then call
SetInteractionRowProgress on the row.
UpdateProgressForSlot automatically.
Prompt data sources
| Field area | Source | Notes |
|---|---|---|
| Target metadata | InteractionTitle and InteractionDescription on the interactable, or foliage entry widget data | Use for actor-level or foliage-instance identity/context. |
| Action prompt | Display.Prompt inside the slot | Represents the actionable operation for the current slot. |
| Secondary hint | Display.Hint inside the slot | Optional supplemental text such as requirements or outcome notes. |
| Input action | Display.InputAction inside the slot, or InputAction on FInteractionFocusData | Preferred source for glyph resolution through the input glyph system. |
| Fallback input label | Display.KeyLabel inside the slot | Use as explicit text fallback when no input action or glyph is available. |
Focus data payload
FInteractionFocusData is the unified payload pushed into widgets for both actor and foliage focus. It includes display text,
InputAction, slot identity, interaction type, focus location, distance, and target-specific references.
FocusTypeidentifies actor focus, foliage focus, or no focus.Title,Description,Prompt,Hint, andKeyLabelprovide ready-to-display text.InputActioncan be sent directly to the glyph subsystem to resolve the current icon/text.SlotIDandInteractionTypeidentify which action the focus payload represents.InteractableandInteractableActorare valid for actor focus.FoliageComponent,FoliageInstanceIndex,FoliageInstanceId, andFoliageMeshare valid for foliage focus.
Input glyph integration
Widgets should prefer the input glyph system over hard-coded key names. Use the slot or focus InputAction to resolve a visual
through the glyph subsystem, then fall back to KeyLabel or text when no glyph exists. See
Input Device Glyphs for the complete glyph workflow.
Main prompt widget placement
The interactable controls prompt widget behavior through WidgetDisplayMode, WidgetClass,
WidgetDrawSize, WidgetRelativeOffset, and the placement fields for the selected display mode.
Interaction Widget Anchor Component,
projected widgets and distant indicators resolve from that component instead of the actor origin.
On-focus widget placement
WidgetRelativeOffset.
FixedScreenPosition plus the pixel offset stored in FixedScreenWidgetOffset.
FixedScreenPosition defines the normalized screen anchor and FixedScreenWidgetOffset applies the final pixel-space adjustment.
Interaction notifications
Notifications are runtime payloads sent from the interaction flow to the player's UI when the result needs a dedicated explanation, such as access denial, missing requirements, inventory errors, or other custom outcomes.
InteractionNotificationWidgetBase so the payload can be applied through the plugin's base notification path.
NotificationWidgetClass on the interactable when needed, then call NotifyInteractor or NotifyInteractorMessage.
OnInteractionNotificationReceived on the interactor component.
OnInteractionDenied on the interactable when the target actor should react locally to a denied attempt.
World indicators and outlines
DistantIndicatoron the interactable defines the icon shown before the main prompt widget takes over.IconDisplayRadius,MaxIconTargets, andbIconRequiresLineOfSighton the interactor define how nearby indicators are gathered and filtered.OutlineSettingson the interactable controls per-target outline behavior through per-component CustomDepth/Stencil state.- Legacy Material Parameter Collection outline fields on the interactor are deprecated and should not be used for new setups.
Debug checklist
InteractionRowWidgetBase, has a valid SlotID, and is registered or discoverable by the focus widget.
bUpdatedRow value from On Slot Progress Updated. If it is false, the registered row list does not contain the matching slot id.
InitializeForInteractor manually.
InputAction glyph resolution and keep KeyLabel as a fallback text path.