AFS_UX_Select
Selection by fingertip, laser or desktop click, with priority resolution and interface-based vetoes.
What it gives you
- One interaction that works with mouse, laser and fingertip
- Priority resolution when objects overlap
- Hit-location override for precise pointing
Description
Select is the smallest complete interaction stack in the framework and the best one to read when learning the pattern.
BPC_PawnAbility_Select traces from the pawn and resolves the highest-priority selectable component
under the cursor. BPC_Interaction_Select on the target declares selectability and fires
On Select. Interface_Select on the owning actor can veto, or redirect where a pointer appears
to hit.
The same interaction serves all three input methods, because the ability supplies the trace and the target only cares about the resulting Source Info.
Setup
- Enable
AFS_UX_Select. - Confirm
BPC_PawnAbility_Selectis on the pawn, andBPC_ControllerAbility_Hand_Laseror_Hand_Fingeron the motion controllers for VR. - Add
BPC_Interaction_Selectto any actor and bind On Select.
Usage
Basic selection
See Make an object selectable.
Vetoing
Implement Interface_Select and return Override = true with Is Selectable = false.
Redirecting the pointer
Implement Select_HitLocationOverride to make a laser terminate at a chosen point rather than the
raw trace hit — useful for snapping to a control's centre.

Key properties
| Property | When to change |
|---|---|
Select Sound | Feedback on selection |
Relevant Components | Restrict which meshes are clickable |
Select Interaction Style | The cursor and accent colour shown while hovering something selectable |
Min / Max Laser Length | On the laser ability, to change reach |
Extending
Copy this stack's shape when adding your own interaction type — it is the reference implementation. See Extending the framework.
Multiplayer notes
BPC_Interaction_Select implements IOutsidePawnRPCInterface, so selection replicates without routing through the pawn. Requires AFPNetDriver.
Example map
Map_Examples_Select covers click, laser and fingertip selection with vetoes.
Troubleshooting
Nothing is selectable. The pawn is missing BPC_PawnAbility_Select, or the object's meshes have no collision on the trace channel.
API reference
Every blueprint asset in this plugin. Expand an asset to see its members.
Components/ControllerAbilities
BPC_ControllerAbility_Hand_Finger1 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | Trace DistanceSettings | float | How far ahead of the fingertip the selection trace reaches. |
BPC_ControllerAbility_Hand_Laser7 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | MinLaserLengthSettings | float | Shortest the laser is drawn when it hits something close by. |
| var | MaxLaserLengthSettings | float | Maximum reach of the selection laser. |
| var | Mapping Contexts DefaultInput | ST_MappingContext_Side | Input mapping contexts applied for the left and right hand. |
| var | ThicknessSettings | float | Thickness of the laser beam. |
| var | ColorSettings | LinearColor | Colour of the laser beam. |
| fn | SetHoverState | (out AlternateLocation: bool, out Location: Vector) | Updates the laser's hover appearance and returns an alternate endpoint when the target overrides its hit location. |
| fn | HandleSelect | () | Runs a selection against whatever the laser is currently pointing at. |
Components/Interactions
BPC_Interaction_Select5 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | SelectSoundSound | SoundBase | Sound played at the hit location when this object is selected. |
| fn | Can be SelectedSelect | (ref const HitComponent: PrimitiveComponent, SourceInfo: ST_SourceInfo, out CanBeSelected: bool) | Returns whether this object may currently be selected by the given source, consulting Interface Select on the owner if implemented. |
| fn | OverrideHitLocationSelect | (out Override: bool, out HitLocation: Vector) | Lets the owner supply a different hit location, so a laser can terminate on a chosen point rather than the raw trace hit. |
| fn | HandleSelect | (SourceInfo: ST_SourceInfo, HitResult: HitResult) | Broadcasts On Select without playing feedback, for triggering a selection from code. |
| event | SelectPressed | (SourceInfo: ST_SourceInfo, HitResult: HitResult) | Fires when the object is selected, playing sound and haptics. Bind to On Select to react. |
Components/PawnAbility
BPC_PawnAbility_Select3 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | Input_SelectInput | InputMappingContext | Input mapping context enabled while this ability is active, carrying the select action. |
| var | SelectInteractionStyleStyle | PDA_InteractionState | Interaction state requested while hovering something selectable, controlling the cursor and accent colour. |
| event | Select | () | Runs a selection against whatever the pawn is currently pointing at. |
BPC_PawnAbility_Widget2 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | Input_WidgetInput | InputMappingContext | Input mapping context enabled while this ability is active, carrying the widget interaction actions. |
| var | WidgetInteractionStyleStyle | PDA_InteractionState | Interaction state requested while hovering a widget. |
Helpers
BP_Helper_ControllerAbility_Hand_Finger0 members
No editor-visible members; this asset configures defaults only.
BP_Helper_ControllerAbility_Hand_Laser1 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| var | ControllerAbilityHandLaser | BPC_ControllerAbility_Hand_Laser | The laser ability this helper draws for. |
Interfaces
Interface_Select2 members
| Kind | Name | Signature | Description |
|---|---|---|---|
| fn | CanBeSelectedSelect | (SelectComponent: BPC_Interaction_Select, SourceInfo: ST_SourceInfo, out Override: bool, out IsSelectable: bool) | Implement on an actor to veto or allow selection under your own conditions. Return Override true and Is Selectable false to block; not implementing the interface means always selectable. |
| fn | Select_HitLocationOverrideSelect | (out Override: bool, out NewHitLocation: Vector) | Implement to redirect where a pointer appears to hit this object, for example snapping a laser to a control's centre. |