Skip to content
EN

Blueprint nodes

Hapbeat SDK nodes end in (Hapbeat). Nodes without that suffix—such as Create Widget, Add to Viewport, and Set Value—are native Unreal Engine nodes. Operations UI and logging nodes supplied by the Samples module also use (Hapbeat), but are not required product APIs.

GoalUse
Play an entry oncePlay Event (Hapbeat)
Watch for a Hit / OverlapHapbeat Collision Trigger component
Group start, loop, and stopHapbeat Sequence component
Modulate continuous playback with a slider / knobHapbeat Parameter Binding component
Play a one-shot for each control incrementHapbeat Tick Emitter component
Choose an event ID, Clip, or target directly at runtimeHapbeat Subsystem

Purpose: Plays an Event Map entry. This is the usual entry point for a gameplay event.

  • Inputs: Map, Entry; advanced pins are Gain Multiplier, Pan, and Delay Seconds.
  • Result: A Command entry sends a device event. A Stream Clip entry returns a Hapbeat Stream Playback handle.
  • Effect on transmission: Uses Clip / Gain / Target / Loop stored in the entry. Gain Multiplier multiplies authored Gain; Pan is added to authored Pan; Delay Seconds is added to Project Settings delay and the entry’s Delay Offset.
Gameplay event → Play Event (Hapbeat)
Map: DA_HapbeatEventMap
Entry: pickup

Purpose: Stops an Event Map entry.

  • Inputs: Map, Entry.
  • Result: A Command entry sends STOP for its event / Target. A Stream Clip entry stops all Stream sources in this Subsystem. To stop only one playback, call Stop Stream Playback (Hapbeat) on the handle returned at play time.
  • Use it: When the gameplay state that started a loop ends.

Search for Hapbeat in Components Add. When Event Map is set, Entry Id becomes a picker for entries in that asset.

Purpose: Fires an entry from Hit or Begin Overlap on the owner’s Primitive Component. No Event Graph wiring is needed.

  • Trigger Event: Hit or Begin Overlap.
  • Gain Mode: fixed Gain or velocity-dependent Velocity Scaled.
  • Tag Filter: limits the other collision participant by tag.
  • Velocity Threshold / Max Velocity / Velocity Curve: convert collision velocity to Gain.
  • bEnterOnly: treats sustained contact as one contact.

For Hit, enable Simulation Generates Hit Events on the colliding Primitive Component. For Overlap, enable Generate Overlap Events.

Purpose: Manages a start one-shot, held loop, and end one-shot as one component.

  • Start Entry Id: start event played by Fire.
  • Entry Id: loop Stream Clip started by Fire.
  • Stop Entry Id: end event played after Stop.
  • Stop Shot Delay: interval between stopping the loop and sending the end event.

Call Fire Trigger (Hapbeat) and Stop Trigger (Hapbeat) from gameplay events such as grab start and end.

Collision / Sequence / Tick Emitter derive from Hapbeat Trigger Component. Drag a component reference into the Event Graph and call these nodes.

NodeInputResult / use
Fire Trigger (Hapbeat)nonePlays the configured entry unchanged.
Fire Trigger With Gain (Hapbeat)Gain MultiplierMultiplies the entry’s Gain for this call.
Fire Trigger Scaled (Hapbeat)input value, input min / maxNormalizes a value to 0–1 for Gain; useful for collision speed.
Fire Trigger With Curve (Hapbeat)input value, Curve FloatUses Curve output as Gain for a custom response curve.
Stop Trigger (Hapbeat)noneStops the entry started by this trigger.
Set Trigger Gain Multiplier (Hapbeat)Gain MultiplierImmediately updates Gain of the playing Stream Clip held by the trigger.
Set Trigger Stream Pan (Hapbeat)PanImmediately updates Pan of the playing Stream Clip held by the trigger.
Get Trigger Playback (Hapbeat)noneReturns the Stream Playback handle started by the component.

On Trigger Fired (Hapbeat) occurs for a fire request that passed enabled-state, entry-resolution, and cooldown checks. Use it to connect matching SFX / VFX, but it does not guarantee device arrival or successful playback.

Store the return value from Play Event (Hapbeat) for a Stream Clip entry, or from Play Stream Clip (Hapbeat), in a variable. Each handle represents one logical stream source.

NodeInputResult / use
Apply Stream Gain Modulation (Hapbeat)ModulatorMultiplies authored baseline Gain. 0 is silent, 1 is authored Gain, maximum 2.
Set Stream Pan (Hapbeat)New PanSets -1 left, 0 center, or +1 right. Mono Clips are made stereo before sending, so this can change during playback.
Set Stream Loop (Hapbeat)LoopChanges loop on the playing stream.
Get Stream Loop (Hapbeat)noneReturns current loop setting.
Stop Stream Playback (Hapbeat)noneStops only this handle’s stream.
Get Stream Gain (Hapbeat)noneReturns current final Gain.
Get Stream Pan (Hapbeat)noneReturns current Pan.
Is Stream Playback Active (Hapbeat)noneTrue while stream chunks are being sent.
Is Stream Playback Stopped (Hapbeat)noneTrue after a stop request or after a one-shot finishes.
Get Stream Playback Status (Hapbeat)noneReturns a state such as Active, Deferred, or Stopped.
Get Stream Deferred Reason (Hapbeat)noneReturns None or NoResolvedEndpoint; it is not a delay duration.

Store a separate return value per simultaneously playing source. Z4 stores one loop handle and updates that handle’s Gain / Pan from sliders.

Purpose: Normalizes an input to 0..1, applies a curve and output range, then updates Gain or Pan of a playing stream.

  • Source Property = External: accepts a value from Blueprint; use it for UMG Sliders.
  • Input Min / Input Max: input range.
  • Curve Type / Custom Curve: input-to-output transformation.
  • Output Parameter: Stream Gain or Stream Pan.
  • Output Min / Output Max: output range.
  • Target Trigger: Stream Clip trigger to update; select it when an Actor has multiple streams.
NodeInputResult / use
Set Binding Input (Hapbeat)ValueStores the current External-source value. Connect a Slider’s On Value Changed here.
Update Stream Parameter (Hapbeat)noneReads input immediately, normalizes it, transforms it through the curve and output range, then writes to the target stream. Its return value is the calculation result even with no target stream, so it is not a transmission-success signal.
Get Binding Input (Hapbeat)noneReturns the last raw input.
Get Binding Normalized Input (Hapbeat)noneReturns the 0..1 value after input range processing.
Get Binding Output (Hapbeat)noneReturns the last calculated output, not device state or send completion.

Purpose: Fires an entry once each time an input crosses Tick Threshold. It is based on movement amount rather than time: faster movement creates more ticks.

  • Tick Mode: Absolute Position uses fixed marks; Accumulated Motion sums each movement.
  • Tick Threshold: input delta required for one tick. 0.1 means one tick per 0.1.
  • Axis: X / Y used with Vector2D input.
  • bEmitOnInitialValue: whether the first input produces a tick.
NodeInputResult / use
Fire Tick From Value (Hapbeat)ValueSupplies a one-dimensional slider / knob value.
Fire Tick From Vector2D (Hapbeat)ValueUses the configured axis of a Vector2D.
Fire Tick Now (Hapbeat)noneFires once without threshold testing.
Reset Tick Reference (Hapbeat)nonePrevents unwanted consecutive ticks after code jumps a UI value.

Parameter Binding changes a continuous stream value; Tick Emitter plays one-shots that communicate control movement. They can be used on the same slider.

Use Get Game Instance Subsystem to get Hapbeat Subsystem. Use it only when event ID, Clip, or Target must be chosen at runtime rather than through an Event Map.

NodeInputResult / use
Connect (Hapbeat)Port, App NameOpens the UDP socket and makes the app able to receive PONG.
Play Event (Hapbeat)Event Id, Gain, Target, PanSends a Kit event ID directly; does not use an Event Map.
Stop Event (Hapbeat)Event Id, TargetStops the specified event.
Stop All Events (Hapbeat)TargetStops events on devices matching Target.
Play Stream Clip (Hapbeat)Clip, baseline / initial Gain, Target, Loop, initial PanStreams a Clip directly and returns a source handle.
Stop Streams (Hapbeat)noneStops every stream source held by this Subsystem.
Node / eventValueUse
Ping (Hapbeat)noneDiscovers reachable devices and requests PONG.
On Connected (Hapbeat)noneFires when responsive device count changes from 0 to 1 or more.
On Disconnected (Hapbeat)noneFires when responsive device count changes from 1 or more to 0.
On Error (Hapbeat)MessageFires when a device returns an ERROR packet.
On Pong (Hapbeat)endpoint, RTT, device name, address, firmwareFires for every PONG; use for a device list or RTT display.
Is Connected (Hapbeat)boolWhether the UDP socket is open; does not guarantee a device exists.
Get Alive Device Count (Hapbeat)intNumber of devices responding to PONG.
Is Device Alive (Hapbeat)boolWhether at least one device is responding to PONG.
Is Streaming (Hapbeat)boolWhether at least one endpoint stream session is operating.
Get Active Stream Playback (Hapbeat)handleReturns the first active source; store a play return value for source-specific control.

Target is a logical filter for device addressing. Usually create it by editing an Event Map entry’s Target; use these nodes when generating or validating it at runtime.

NodeInputOutput / use
Build Target (Hapbeat)Player, Position, GroupBuilds player_1/pos_chest/group_2; empty when all are unspecified. Use to assemble from UI or game state.
Parse Target (Hapbeat)Target stringOutputs Player, Position, Group; missing numeric axes are -1, Position is empty. Use to return a Target to separate UI fields.
Resolve Target (Hapbeat)authored Target, override Player / GroupReplaces only specified axes. Use to show or verify the effective Target under Address Override; Target is unchanged when both overrides are -1.
Apply Address Placeholders (Hapbeat)app name with <p> / <g>, override Player / GroupReplaces placeholders with effective numbers; inactive axes become -. Use to display HMD numbers on the device OLED at connection.
Does Address Match (Hapbeat)resolved Target, PONG Device AddressReturns whether a device matches Target. Empty Target matches every device.

Address Override replaces only player / group axes of the Target for all sends. It does not change Event Map or Trigger component settings. For one build across multiple HMDs, see Targeting.

NodeInput / outputResult / use
Set Address Override (Hapbeat)Player, Group, PersistReplaces effective Target for subsequent Command / Stream sends. -1 turns off that axis; Persist saves for the next launch.
Clear Saved Address Override (Hapbeat)noneRemoves saved settings and turns off player / group that are not build-fixed. Keeps Forced Override in the build.
Get Override Player (Hapbeat)intReturns current effective player, or -1 when off.
Get Override Group (Hapbeat)intReturns current effective group, or -1 when off.

9. Operations and diagnostics nodes in Samples

Section titled “9. Operations and diagnostics nodes in Samples”

These are helper components in the Samples module. A production UI can implement only needed behavior with native Unreal UI and Hapbeat Subsystem.

NodeInput / outputResult / use
Show Address Panel (Hapbeat)noneShows the Address Override panel in the viewport.
Attach Address Panel (Hapbeat)Widget ComponentShows the same panel in a world-space Widget Component for VR.
Hide Address Panel (Hapbeat)noneCloses the viewport / world-space panel.
Toggle Address Panel (Hapbeat)noneToggles viewport-panel visibility.
Is Address Panel Shown (Hapbeat)boolReturns whether the panel is visible.

Panel Apply calls Set Address Override (Hapbeat), Clear calls Clear Saved Address Override (Hapbeat), and Test sends a sample event to the current effective Target. See VR Config Example for VR use.

NodeInput / outputResult / use
Log Status Message (Hapbeat)MessageAdds one line to the on-screen status log.
Clear Status Log (Hapbeat)noneClears the status log.

This component also automatically displays connected / disconnected / PONG / error / stream transitions. It is for development-time state checks, not a replacement for shipping UI.

NodeLogged game event
Log Event (Hapbeat)arbitrary event name
Log Begin Overlap (Hapbeat) / Log End Overlap (Hapbeat)overlap start / end
Log Hit (Hapbeat)hit
Log Clicked (Hapbeat) / Log Released (Hapbeat)click / release
Log Begin Cursor Over (Hapbeat) / Log End Cursor Over (Hapbeat)cursor-hover start / end
Log Grabbed (Hapbeat) / Log Dropped (Hapbeat)grab / drop
Log Activated (Hapbeat) / Log Deactivated (Hapbeat)activate / deactivate

These nodes only record to Output Log and the sample display; they do not send haptics. Use them to isolate whether the game event occurred first.

AssetNodeResult
Hapbeat Event MapFind Event Entry (Hapbeat)Returns a copy of Hapbeat Event Entry from its GUID in Out Entry. The bool return value indicates lookup success. It is not an Entry Ref, so edits to the copy do not change the asset.
Hapbeat ClipGet Clip Sample Count (Hapbeat)Returns PCM sample count.
Hapbeat ClipGet Clip Frame Count (Hapbeat)Returns frame count.
Hapbeat ClipGet Clip Duration (Hapbeat)Returns duration in seconds.

Normally use the Event Map Editor entry picker; call these from an Event Graph only when selecting assets dynamically.

All public BlueprintCallable / BlueprintPure functions. Nodes with the same title are distinguished by owning class. Argument types, defaults, and return types match their declarations. Non-const reference arguments are output pins; WorldContextObject is normally populated automatically. Component member functions take that component as Target. See the functional sections above for use and operational constraints.

NodeOwnerDeclaration
Play Event (Hapbeat)UHapbeatBlueprintLibraryPlayHapbeatEvent(WorldContextObject, Map, Entry, GainMultiplier = 1.0f, Pan = 0.0f, DelaySeconds = 0.0f) -> UHapbeatStreamPlayback*
Stop Event (Hapbeat)UHapbeatBlueprintLibraryStopHapbeatEvent(WorldContextObject, Map, Entry)
Fire Tick From Value (Hapbeat)UHapbeatBlueprintLibraryFireHapbeatTickFromValue(TickEmitter, Value)
Get Clip Sample Count (Hapbeat)UHapbeatClipNumSamples() -> int32
Get Clip Frame Count (Hapbeat)UHapbeatClipNumFrames() -> int32
Get Clip Duration (Hapbeat)UHapbeatClipDurationSeconds() -> float
Find Event Entry (Hapbeat)UHapbeatEventMapFindById(Id, OutEntry) -> bool
Set Binding Input (Hapbeat)UHapbeatParameterBindingSetValue(Value)
Update Stream Parameter (Hapbeat)UHapbeatParameterBindingEvaluateNow() -> float
Get Binding Input (Hapbeat)UHapbeatParameterBindingGetCurrentInput() -> float
Get Binding Normalized Input (Hapbeat)UHapbeatParameterBindingGetCurrentNormalized() -> float
Get Binding Output (Hapbeat)UHapbeatParameterBindingGetCurrentOutput() -> float
Apply Stream Gain Modulation (Hapbeat)UHapbeatStreamPlaybackApplyGainModulation(Modulator)
Set Stream Pan (Hapbeat)UHapbeatStreamPlaybackSetPan(NewPan)
Set Stream Loop (Hapbeat)UHapbeatStreamPlaybackSetLoop(bNewLoop)
Get Stream Loop (Hapbeat)UHapbeatStreamPlaybackGetLoop() -> bool
Stop Stream Playback (Hapbeat)UHapbeatStreamPlaybackStop()
Get Stream Gain (Hapbeat)UHapbeatStreamPlaybackGetGain() -> float
Get Stream Pan (Hapbeat)UHapbeatStreamPlaybackGetPan() -> float
Is Stream Playback Stopped (Hapbeat)UHapbeatStreamPlaybackIsStopped() -> bool
Is Stream Playback Active (Hapbeat)UHapbeatStreamPlaybackIsActive() -> bool
Get Stream Playback Status (Hapbeat)UHapbeatStreamPlaybackGetStatus() -> EHapbeatStreamPlaybackStatus
Get Stream Deferred Reason (Hapbeat)UHapbeatStreamPlaybackGetDeferredReason() -> EHapbeatStreamDeferredReason
Connect (Hapbeat)UHapbeatSubsystemConnect(InPort = 7700, InAppName = TEXT(""))
Play Event (Hapbeat)UHapbeatSubsystemPlay(EventId, Gain = 1.0f, Target = TEXT(""), Pan = 0.0f)
Stop Event (Hapbeat)UHapbeatSubsystemStop(EventId, Target = TEXT(""))
Stop All Events (Hapbeat)UHapbeatSubsystemStopAll(Target = TEXT(""))
Ping (Hapbeat)UHapbeatSubsystemPing()
Play Stream Clip (Hapbeat)UHapbeatSubsystemStreamClip(Clip, BaselineGain = 1.0f, InitialGain = 1.0f, Target = TEXT(""), bLoop = false, InitialPan = 0.0f) -> UHapbeatStreamPlayback*
Stop Streams (Hapbeat)UHapbeatSubsystemStopStream()
Set Address Override (Hapbeat)UHapbeatSubsystemSetAddressOverride(Player, InGroup, bPersist = false)
Clear Saved Address Override (Hapbeat)UHapbeatSubsystemClearPersistedAddressOverride()
Get Override Player (Hapbeat)UHapbeatSubsystemGetOverridePlayer() -> int32
Get Override Group (Hapbeat)UHapbeatSubsystemGetOverrideGroup() -> int32
Is Connected (Hapbeat)UHapbeatSubsystemIsConnected() -> bool
Get Alive Device Count (Hapbeat)UHapbeatSubsystemGetAliveDeviceCount() -> int32
Is Device Alive (Hapbeat)UHapbeatSubsystemIsAlive() -> bool
Is Streaming (Hapbeat)UHapbeatSubsystemIsStreaming() -> bool
Get Active Stream Playback (Hapbeat)UHapbeatSubsystemGetActivePlayback() -> UHapbeatStreamPlayback*
Build Target (Hapbeat)UHapbeatTargetLibraryBuildTarget(Player = -1, Position = TEXT(""), Group = -1) -> FString
Parse Target (Hapbeat)UHapbeatTargetLibraryParseTarget(Target, OutPlayer, OutPosition, OutGroup)
Resolve Target (Hapbeat)UHapbeatTargetLibraryResolveTarget(Target, OverridePlayer, OverrideGroup) -> FString
Apply Address Placeholders (Hapbeat)UHapbeatTargetLibraryApplyAddressPlaceholders(AppName, OverridePlayer, OverrideGroup) -> FString
Does Address Match (Hapbeat)UHapbeatTargetLibraryAddressMatches(Target, DeviceAddress) -> bool
Fire Tick From Value (Hapbeat)UHapbeatTickEmitterComponentFireFromValue(Value)
Fire Tick From Vector2D (Hapbeat)UHapbeatTickEmitterComponentFireFromVector2D(Value)
Fire Tick Now (Hapbeat)UHapbeatTickEmitterComponentFireNow()
Reset Tick Reference (Hapbeat)UHapbeatTickEmitterComponentResetReference()
Fire Trigger (Hapbeat)UHapbeatTriggerComponentFire()
Fire Trigger With Gain (Hapbeat)UHapbeatTriggerComponentFireWithGain(GainOverride)
Fire Trigger Scaled (Hapbeat)UHapbeatTriggerComponentFireScaled(Velocity, MinVelocity = 0.0f, MaxVelocity = 10.0f)
Fire Trigger With Curve (Hapbeat)UHapbeatTriggerComponentFireWithCurve(Value, Curve)
Stop Trigger (Hapbeat)UHapbeatTriggerComponentStop()
Set Trigger Gain Multiplier (Hapbeat)UHapbeatTriggerComponentSetGainMultiplier(NewMultiplier)
Set Trigger Stream Pan (Hapbeat)UHapbeatTriggerComponentSetStreamPan(NewPan)
Get Trigger Playback (Hapbeat)UHapbeatTriggerComponentGetActivePlayback() -> UHapbeatStreamPlayback*
Show Address Panel (Hapbeat)UHapbeatAddressOverridePanelComponentShow()
Attach Address Panel (Hapbeat)UHapbeatAddressOverridePanelComponentAttachToWidgetComponent(Target)
Hide Address Panel (Hapbeat)UHapbeatAddressOverridePanelComponentHide()
Toggle Address Panel (Hapbeat)UHapbeatAddressOverridePanelComponentToggle()
Is Address Panel Shown (Hapbeat)UHapbeatAddressOverridePanelComponentIsShown() -> bool
Move Address Panel Focus (Hapbeat)UHapbeatAddressOverridePanelComponentMoveFocus(Horizontal, Vertical)
Activate Address Panel Focus (Hapbeat)UHapbeatAddressOverridePanelComponentActivateFocused()
Show Address Panel Focus (Hapbeat)UHapbeatAddressOverridePanelComponentShowFocusHighlight()
Log Event (Hapbeat)UHapbeatEventLoggerComponentLogEvent(Tag)
Log Begin Overlap (Hapbeat)UHapbeatEventLoggerComponentLogBeginOverlap()
Log End Overlap (Hapbeat)UHapbeatEventLoggerComponentLogEndOverlap()
Log Hit (Hapbeat)UHapbeatEventLoggerComponentLogHit()
Log Clicked (Hapbeat)UHapbeatEventLoggerComponentLogClicked()
Log Released (Hapbeat)UHapbeatEventLoggerComponentLogReleased()
Log Begin Cursor Over (Hapbeat)UHapbeatEventLoggerComponentLogBeginCursorOver()
Log End Cursor Over (Hapbeat)UHapbeatEventLoggerComponentLogEndCursorOver()
Log Grabbed (Hapbeat)UHapbeatEventLoggerComponentLogGrabbed()
Log Dropped (Hapbeat)UHapbeatEventLoggerComponentLogDropped()
Log Activated (Hapbeat)UHapbeatEventLoggerComponentLogActivated()
Log Deactivated (Hapbeat)UHapbeatEventLoggerComponentLogDeactivated()
Log Status Message (Hapbeat)UHapbeatStatusOverlayComponentLog(Message)
Clear Status Log (Hapbeat)UHapbeatStatusOverlayComponentClearLog()