Binding Into Player X-Ray Events#
This document outlines how to use the HELIX X-Ray system in Lua to create custom logic for player X-Ray events, such as displaying new UI widgets or triggering other in-game actions.
The system is built around events that are broadcasted to the local player. You can listen to these events globally or on a per-actor basis.
Making an Actor X-Ray Detectable#
Before any events can be triggered for an actor, it must be marked as detectable by the X-Ray system with one of the methods below:
- By Adding a Tag: This is the easiest method if you only need the actor to be focusable.
-- 'MyActor' is a variable holding the AActor object
MyActor.Tags:Add("xray")
- By Adding the Component: This method is required if you want to listen for X-Ray events directly on the actor's component.
-- 'MyActor' is a variable holding the AActor object
-- This assumes the component is registered with UnLua as "HXRayTargetActorComponent"
local XRayComponent = MyActor:AddComponentByClass(UE.UHXRayTargetActorComponent, false, UE.FTransform(), false)
-- You can also get it if it already exists
local XRayComponent = MyActor:GetComponentByClass(UE.UHXRayTargetActorComponent)
Note
Player characters already have this component attached by default.
API Reference#
Global Events (World Subsystem)#
This is the primary and most common way to listen for X-Ray events. Events are broadcasted globally for the local player.
Accessing the Subsystem#
You must first get the UHXRayWorldSubsystem from the HWorld.
-- Get the X-Ray subsystem from the HWorld global
local XRaySubsystem = UE.USubsystemBlueprintLibrary.GetWorldSubsystem(HWorld, UE.UHXRayWorldSubsystem)
Delegate: OnLocalPlayerXRayEvent#
This is the main delegate to bind for x-ray events. It fires for every X-Ray event triggered by the local player.
Signature: (Instigator, TargetActor, EventType):
- Instigator (APlayerController*): The local player controller triggering the event.
- TargetActor (AActor*): The actor being targeted. This can be nil (e.g., for a Cancel event).
- EventType (EHXRayEventType): The type of event that occurred. (See Enums section below).
Lua Example#
local function OnXRayEvent(Instigator, TargetActor, EventType)
if EventType == EHXRayEventType.BeginFocus then
-- Player started looking at an actor
print("Player started focusing on: " .. TargetActor:GetName())
-- Show a simple WebUI widget
elseif EventType == EHXRayEventType.EndFocus then
-- Player looked away from the actor
print("Player stopped focusing on: " .. TargetActor:GetName())
-- Hide the simple WebUI widget
elseif EventType == EHXRayEventType.Reveal then
-- Player "confirmed" the X-Ray on the actor
print("Player revealed: " .. TargetActor:GetName())
-- Show detailed WebUI widget
elseif EventType == EHXRayEventType.Cancel then
-- Player cancelled the X-Ray (looked at nothing)
print("Player cancelled X-Ray")
-- Hide any visible X-Ray WebUI
end
end
-- Bind the function to the delegate
local XRaySubsystem = UE.USubsystemBlueprintLibrary.GetWorldSubsystem(HWorld, UE.UHXRayWorldSubsystem)
if XRaySubsystem then
XRaySubsystem.OnLocalPlayerXRayEvent:Bind(OnXRayEvent)
end
-- Remember to unbind when your script is destroyed!
-- XRaySubsystem.OnLocalPlayerXRayEvent:Unbind(OnXRayEvent)
Helper Functions#
The subsystem also provides functions to check the current state:
- GetCurrentXRayState(): Returns the current EHXRayEventType.
- GetFocusedActor(): Returns the currently focused AActor*, or nil if none.
local CurrentState = XRaySubsystem:GetCurrentXRayState()
local FocusedActor = XRaySubsystem:GetFocusedActor()
Actor-Specific Events (Actor Component)#
This method is for more granular control. The event only fires for the specific actor that has the component.
Accessing the Component#
You must first add or get the UHXRayTargetActorComponent from a specific actor.
-- 'MyActor' is a variable holding the AActor object
local XRayComponent = MyActor:GetComponentByClass(UHXRayTargetActorComponent)
Delegate: OnXRayStateChangedEvent#
This delegate exists on the component itself. It will only fire when the actor that owns this component is involved in an X-Ray event.
Signature: (Instigator, TargetActor, EventType)
Lua Example#
-- 'MyActor' is a specific actor we want to monitor
local XRayComponent = MyActor:GetComponentByClass(UHXRayTargetActorComponent)
if not XRayComponent then
-- Add the component if it doesn't exist
XRayComponent = MyActor:AddComponentByClass(UE.UHXRayTargetActorComponent, false, UE.FTransform(), false)
end
local function OnMyActorXRayEvent(Instigator, TargetActor, EventType)
-- We already know this event is for 'MyActor'
if EventType == EHXRayEventType.Reveal then
print("MyActor was revealed!")
-- TODO: Do something specific for this actor
end
end
if XRayComponent then
XRayComponent.OnXRayStateChangedEvent:Bind(OnMyActorXRayEvent)
end
Properties#
CurrentXRayState (EHXRayEventType): You can read the component's last known state directly.
local CurrentState = XRayComponent.CurrentXRayState
Enums#
EHXRayEventType#
This enum defines the different states of the X-Ray system.
| Value | Description |
|---|---|
| None | Default / no event. |
| BeginFocus | Player started looking at the actor while the X-Ray key is held. |
| EndFocus | Player stopped looking at the actor while the X-Ray key is held. |
| Reveal | Player released the X-Ray key while still focusing on the actor. |
| Cancel | Player released the X-Ray key while looking at nothing. |