Interaction NUG
Overview
The Interaction NUG handles how the player finds, views, and triggers interactable objects in the world.
Use it for doors, pickups, switches, NPCs, signs, power-ups, terminals, chests, and any actor that needs player-triggered behaviour.
Core Assets
AC_InteractBPI_InteractableWBP_InteractPrompt
What The System Does
- Finds interactable actors
- Checks whether actors implement the interaction interface
- Stores the current interactable target
- Shows or hides an interaction prompt
- Sends interaction input to the target actor
- Keeps player interaction logic separate from the object being used
Quick Setup
Use this section to test one interactable object.
- Add
AC_Interactto the player character. - Add
BPI_Interactableto the actor that should be interacted with. - Set the trace distance or detection range.
- Set the object types the system should detect.
- Assign the prompt widget.
- Press Play.
- Look at or move near the interactable actor.
- Check that the prompt appears.
- Press the interact input.
- Confirm the actor runs its interaction logic.
Runtime Flow
- The player looks for interactable actors using the interaction component.
- The component checks whether the detected actor implements
BPI_Interactable. - If valid, the actor becomes the current interactable.
- The prompt widget appears.
- The player presses the interact input.
AC_Interactcalls the interaction event on the target actor.- The target actor decides what happens next.
Why This Is Modular
The Interaction NUG does not need to know what the target actor is.
A door can open.
A chest can reveal a reward.
A sign can show text.
A power-up can activate.
An NPC can start dialogue.
The interaction component only finds the actor and calls the interface. The actor owns the result.
Blueprint Tutorial
Goal
Create one working interactable actor that shows a prompt and reacts when the player presses the interact input.
Before You Start
Create or confirm these assets exist:
AC_InteractBPI_InteractableWBP_InteractPrompt- A player character Blueprint
- A test actor Blueprint
Step 1, Add The Interaction Component
- Open the player character Blueprint.
- Add
AC_Interactas an Actor Component. - Set the trace or detection distance.
- Set the object types the component should detect.
- Assign the prompt widget class if the component owns prompt creation.
- Compile and save.
Step 2, Add The Interface To A Test Actor
- Open the test actor Blueprint.
- Add
BPI_Interactablein Class Settings. - Compile and save.
- Implement the interaction event from the interface.
- Add a simple test action, such as print string, toggle visibility, or open door.
Step 3, Connect The Input
- Open the player character or input handling Blueprint.
- Find the interact input action.
- On input pressed, call the interact function on
AC_Interact. - The component should use the current interactable target.
- If the target is valid, call the interface event.
Step 4, Add The Prompt
- Create or open
WBP_InteractPrompt. - Add clear prompt text, such as
Press Interact. - Keep the prompt small and readable.
- If the prompt is world-positioned, use the interactable actor or prompt target component as the location source.
- If the prompt is screen-space, project the world location to screen.
Step 5, Test The Result
- Press Play.
- Look at or move near the test actor.
- Confirm the prompt appears.
- Press the interact input.
- Confirm the test actor reacts.
- Move away or look away.
- Confirm the prompt hides.
Photo Slots
Use these slots when adding screenshots to the documentation site.
Interaction Component On Player
Image slot: interaction component on player.
Interface Added To Actor
Image slot: interface added to interactable actor.
Trace Or Detection Settings
Image slot: interaction trace or detection settings.
Prompt Widget Setup
Image slot: prompt widget setup.
Runtime Prompt Test
Image slot: runtime prompt test.
Blueprint Flow Placeholder
This is a temporary Klee render test using the working example from the playground.
Replace this with the real Interaction NUG Blueprint export when the final Blueprint logic is ready.
Preparing Blueprint flow...
Show copied Blueprint source
Begin Object Class=/Script/BlueprintGraph.K2Node_Event Name="K2Node_Event_0"
EventReference=(MemberParent=Class'"/Script/Engine.Actor"',MemberName="ReceiveBeginPlay")
bOverrideFunction=True
bCommentBubblePinned=True
NodeGuid=DA78E90542B5EA6FFF2BB580420BADA4
CustomProperties Pin (PinId=72D40BCB43A58F1C676E9AA9770D2D80,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent=Class'"/Script/Engine.Actor"',MemberName="ReceiveBeginPlay"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=43C25E4A4F36B0A3D974C58D187B99D0,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,LinkedTo=(K2Node_CallFunction_8 347E2B8849A88B5B6EB338B0CF412295,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End Object
Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_8"
FunctionReference=(MemberParent=Class'"/Script/Engine.KismetSystemLibrary"',MemberName="PrintString")
NodePosX=288
AdvancedPinDisplay=Hidden
EnabledState=DevelopmentOnly
NodeGuid=D94D72E348471465CF685AB3C289A168
CustomProperties Pin (PinId=347E2B8849A88B5B6EB338B0CF412295,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,LinkedTo=(K2Node_Event_0 43C25E4A4F36B0A3D974C58D187B99D0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=867BBF3A41E77FED7EBB01B783D1BD58,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=89FC8C6B4DB2E65B8FFC6CB80DC5386D,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nKismet System Library Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject=Class'"/Script/Engine.KismetSystemLibrary"',PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultObject="/Script/Engine.Default__KismetSystemLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
CustomProperties Pin (PinId=B74444DF4AA54A124612178F2F98CE1F,PinName="InString",PinToolTip="In String\nString\n\nThe string to log out",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,DefaultValue="Let's share Blueprints!",AutogeneratedDefaultValue="Hello",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,)
End ObjectInjected Blueprint Code Slots
These slots will be replaced with real auto-rendered BlueprintFlow blocks once each function is final.
AC_Interact, Find Interactable Function
Paste exported Blueprint node code here.
AC_Interact, Interact Function
Paste exported Blueprint node code here.
BPI_Interactable, Actor Interaction Event
Paste exported Blueprint node code here.
Prompt Widget Update
Paste exported Blueprint node code here.
Common Issues
Prompt Does Not Appear
Check that the target actor implements BPI_Interactable.
Also check that the trace or detection object types include the actor collision type.
Actor Is Detected But Cannot Interact
Check that the interact input calls the interaction function on AC_Interact.
Also check that the current interactable reference is valid.
Prompt Appears In The Wrong Place
Check whether the prompt is using the actor location, component location, or screen projection.
For world prompts, use the interactable actor or prompt target component as the location source.
Prompt Is Stretched Or Squashed
Put the prompt content inside a ScaleBox or SizeBox.
Set a clear desired size.
Interaction Fires Constantly
Only call the interaction event when the input is pressed.
Detection can update often, but interaction should be input-based.
It Only Works From One Camera Angle
Check the trace start and direction.
If the game uses multiple cameras, make sure the trace uses the active camera or the intended view source.
Extension Notes
- Add prompt target components for cleaner widget placement later
- Add support for interaction priority if multiple objects are detected
- Add icon support for different interaction types
- Add gamepad and keyboard prompt switching later
- Keep interaction logic interface-based so other NUGS can use it without hard dependencies
Testing Checklist
- Player can detect an interactable actor
- Prompt appears when the actor is valid
- Prompt hides when the actor is no longer valid
- Interact input calls the target actor
- Non-interactable actors are ignored
- Door interaction works
- Power-up or collectible interaction can be added later
- Prompt location is readable in first-person and third-person views
- Interaction does not fire every tick
- The system still works when other NUGS are not installed