135 lines
5.4 KiB
Markdown
135 lines
5.4 KiB
Markdown
# WBP_InteractionPromptDisplay — Widget (Interaction Prompt Display)
|
|
|
|
**Parent Class:** `UUserWidget` (created via Widget Blueprint)
|
|
**Dependencies:** `BPC_InteractionDetector`, `I_Interactable`
|
|
**File:** `WBP_InteractionPromptDisplay`
|
|
|
|
---
|
|
|
|
## Purpose
|
|
|
|
Displays a context-sensitive interaction prompt at the center of the screen (or offset near the interactable world-location). Shows the interaction action name, hold-to-interact progress bar, and platform-specific input key icon.
|
|
|
|
---
|
|
|
|
## Responsibilities
|
|
|
|
- Listen to `BPC_InteractionDetector.OnFocusGained` and `OnFocusLost` dispatchers
|
|
- When focus gained: fade in prompt text ("Press E to Open", "Hold F to Pull Lever")
|
|
- When hold interaction required: display a circular progress fill ring around the prompt
|
|
- When focus lost: fade out prompt immediately or animate out
|
|
- Display _context tags_ from the interactable (e.g. [Safe], [Dangerous], [Locked])
|
|
- Avoid overlapping with other HUD elements — offset from world-location if `bUseWorldOffset` is true
|
|
- Support a "look-at" mode (interaction prompt tracks the world location of the interactable)
|
|
|
|
---
|
|
|
|
## Variables
|
|
|
|
| Name | Type | Description |
|
|
|------|------|-------------|
|
|
| `OwningDetector` | `BPC_InteractionDetector` | Cached reference (set on Construct) |
|
|
| `CurrentInteractable` | `I_Interactable` | Object currently in focus |
|
|
| `PromptText` | `TextBlock` | "Open Door", "Pick Up Note", etc. |
|
|
| `ActionKeyIcon` | `Image` | Platform-specific key icon |
|
|
| `HoldProgressRing` | `Image` | Circular fill ring for hold interactions |
|
|
| `ContextTagsContainer` | `HorizontalBox` | Row of context tag labels |
|
|
| `bIsVisible` | Bool | Current visibility state |
|
|
| `bUseWorldOffset` | Bool | If true, offset prompt to world location |
|
|
| `AnimFadeIn` | `WidgetAnimation` | Fade in animation |
|
|
| `AnimFadeOut` | `WidgetAnimation` | Fade out animation |
|
|
| `AnimHoldProgress` | `WidgetAnimation` | Hold fill progress animation |
|
|
| `PromptYOffset` | Float | Vertical offset from screen center (pixels) |
|
|
|
|
---
|
|
|
|
## Functions / Events
|
|
|
|
| Name | Inputs | Outputs | Description |
|
|
|------|--------|---------|-------------|
|
|
| `Construct` | — | — | Cache detector, bind dispatchers, set to hidden |
|
|
| `OnInteractionFocusGained` | Interactable: `I_Interactable`, InteractionInfo: `S_InteractionInfo` | — | Update prompt text/icon, play fade in |
|
|
| `OnInteractionFocusLost` | Interactable: `I_Interactable` | — | Play fade out, clear state |
|
|
| `UpdatePrompt` | Info: `S_InteractionInfo` | — | Set PromptText, ActionKeyIcon, hold duration |
|
|
| `SetHoldProgress` | Progress: Float (0-1) | — | Update HoldProgressRing fill amount |
|
|
| `OnHoldStarted` | Duration: Float | — | Play hold progress animation over Duration |
|
|
| `OnHoldCancelled` | — | — | Stop hold animation, reset ring to 0 |
|
|
| `OnHoldCompleted` | — | — | Ring fills to 1 at end of hold |
|
|
| `SetContextTags` | Tags: Array of Text | — | Add context tag labels to ContextTagsContainer |
|
|
| `UpdateScreenPosition` | — | — | Tick: if bUseWorldOffset, project world location to screen |
|
|
|
|
---
|
|
|
|
## Structs
|
|
|
|
```cpp
|
|
// Consumed from BPC_InteractionDetector
|
|
S_InteractionInfo
|
|
{
|
|
FText ActionLabel; // "Open", "Pick Up", etc
|
|
FText ObjectName; // "Wooden Door", "Old Note"
|
|
bool bRequiresHold;
|
|
float HoldDuration; // seconds
|
|
UTexture2D* ActionKeyIcon; // platform-specific input icon
|
|
TArray<FText> ContextTags; // "Safe", "Locked", "Hold"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Blueprint Flow — Focus Gained
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Player as Player
|
|
participant Detector as BPC_InteractionDetector
|
|
participant UI as WBP_InteractionPromptDisplay
|
|
participant Interactable as I_Interactable
|
|
|
|
Player->>Detector: Look at interactable
|
|
Detector->>Interactable: GetInteractionInfo()
|
|
Interactable-->>Detector: S_InteractionInfo
|
|
Detector-->>UI: OnFocusGained Interactable, Info
|
|
UI->>UI: UpdatePrompt Info
|
|
UI->>UI: SetVisibility Visible
|
|
UI->>UI: PlayAnimation FadeIn
|
|
Note over UI: Hold required?
|
|
alt Hold interaction
|
|
UI->>UI: OnHoldStarted Duration
|
|
loop Each tick
|
|
UI->>UI: SetHoldProgress elapsed/Duration
|
|
end
|
|
UI->>UI: OnHoldCompleted
|
|
else Tap interaction
|
|
UI->>UI: OnHoldCompleted instantly
|
|
end
|
|
```
|
|
|
|
---
|
|
|
|
## Event Dispatchers
|
|
|
|
| Name | Parameters | Fired When |
|
|
|------|-----------|------------|
|
|
| `OnPromptShown` | — | Prompt becomes visible |
|
|
| `OnPromptHidden` | — | Prompt becomes hidden |
|
|
| `OnHoldComplete` | — | Hold-fill reaches 100% |
|
|
|
|
---
|
|
|
|
## Communications With
|
|
|
|
| Target System | Method | Why |
|
|
|--------------|--------|-----|
|
|
| [`BPC_InteractionDetector`](../03-interaction/16_BPC_InteractionDetector.md) | Dispatchers | Receive focus gain/loss, hold progress |
|
|
| [`WBP_HUDController`](WBP_HUDController.md) | Parent reference | Positioning coordination |
|
|
| [`I_Interactable`](../01-core/03_I_InterfaceLibrary.md) | Function call | GetInteractionInfo for prompt data |
|
|
|
|
---
|
|
|
|
## Reuse Notes
|
|
|
|
The prompt rendering pattern is used in both first-person and third-person contexts. The `bUseWorldOffset` flag lets this widget serve both diegetic HUD skins (watch screen show prompts) and traditional screen-center prompt systems. Context tags are optional — if the array is empty, the container collapses.
|
|
|
|
- Renamed from `WBP_InteractionUI` to `WBP_InteractionPromptDisplay` per Master naming convention.
|
|
- Cross-references updated: `WBP_HUD` → `WBP_HUDController`. |