Showcase (sample level)
Showcase is a level included with the plugin. It contains five samples that connect in-game events to Hapbeat Event Map entries. Open a zone Actor’s Details and EM_Showcase to inspect or change the haptic playback settings.
| Zone | Implementation | Haptic wiring to inspect |
|---|---|---|
| Z1 Bowling | C++ Actor + collision trigger | Fires z1_pin_hit when a pin collides. |
| Z2 Swing Door | Blueprint Event Graph | Starts the door Timeline and Play Event (Hapbeat) from the same input branch. |
| Z3 Fishing | C++ Actor + Sequence / Parameter Binding | Connects hook start / loop / release and fish velocity to loop Gain. |
| Z4 Stream Console | Blueprint Event Graph + Widget Blueprint | Wires stream start / stop, UI Gain / Pan, ticks, and Address Override. |
| Z5 Target Range | C++ Actor + collision trigger | Direct SDK calls for charge / shot and light / heavy branches for target hits. |
Where to look first
Section titled “Where to look first”- Enable Show Plugin Content in Content Browser > Settings.
- Open Plugins/HapbeatSDK/Content/HapbeatSamples/Showcase/Maps/Showcase.
- Select the target zone Actor in the World Outliner.
- Open Content Browser > HapbeatSamples/Showcase/EM_Showcase and edit an entry’s Clip, Gain, Target, or Loop.
Game input / collision / state transition / UI → Hapbeat component or zone Actor → Event Map entry → Hapbeat SDKZ1 Bowling — pin collisions
Section titled “Z1 Bowling — pin collisions”Ball hits pin → pin HitTrigger → Pin Hit EventPin Hit Event is the Event Map entry played when one of the six pins collides.
Edit and try it
Section titled “Edit and try it”- Select
Z1_Bowlingin Showcase map > World Outliner. - Open Details > Hapbeat > Bowling > Pin Hit.
- Change Gain in the
z1_pin_hitentry ofEM_Showcase.- Example: halve the current value.
- What you can observe: ball and pin collisions remain unchanged; only haptic strength changes.
- Change Pin Hit Event.
- Example: switch from
z1_pin_hittoz2_door_slam. - What you can observe: the same pin collision fires the haptic selected by that entry.
- Example: switch from
Inspect the SDK connection (C++)
Section titled “Inspect the SDK connection (C++)”Choose Tools → Open Visual Studio, then open these SDK files:
Plugins└ HapbeatSDK └ Source └ HapbeatSDKSamples ├ Public │ └ HapbeatShowcaseZ1BowlingActor.h └ Private └ HapbeatShowcaseZ1BowlingActor.cppOpen Public/HapbeatShowcaseZ1BowlingActor.h first, then the identically named Private/HapbeatShowcaseZ1BowlingActor.cpp.
BuildEventMap resolves the Details values EventMapOverride and PinHitEvent. SetUpPins passes that map and entry to each pin’s HitTrigger.
These two lines in SetUpPins connect the Details selection to the pin-collision trigger:
Pin->HitTrigger->EventMap = EventMap;Pin->HitTrigger->EntryId = PinHitEntryId;Z2 Swing Door — fire an event from Blueprint
Section titled “Z2 Swing Door — fire an event from Blueprint”BP_Z2_Door is a Blueprint-only example: each door-operation branch fires Play Event (Hapbeat).
Edit and try it (PIE Details)
Section titled “Edit and try it (PIE Details)”- Start PIE and press
Shift + F1. - Select
Z2_Doorin World Outliner > Play World. - Change Door Slam Event in Details > Hapbeat > Door Events.
- Example: switch from
z2_door_slamtoz2_door_close. - What you can observe: the
Gslam Timeline remains the same, while the selected entry’s haptic is fired.
- Example: switch from
Inspect the SDK connection (Blueprint)
Section titled “Inspect the SDK connection (Blueprint)”Stop PIE, open HapbeatSamples/Showcase/BP_Z2_Door in the Content Browser, and select Event Graph. Follow the F, G, and L Input Key nodes through Switch on Door State, the applicable action lane, and Play Event (Hapbeat).
F / G / L Pressed → Switch on Door State → DoorOpen / DoorClose / DoorSlam / DoorRattle / Lock / Unlock → Play Event (Hapbeat) for the corresponding z2_door_* entry → DoorHinge TimelineEach lane’s Play Event (Hapbeat) receives Get nodes for Door Event Map and its matching Door … Event. This passes the PIE Details selection into the in-game action. Since the Timeline starts from the same lane, door motion and haptic playback share a start point.
Z3 Fishing — sequence and gain binding
Section titled “Z3 Fishing — sequence and gain binding”Left mouse press / release → Shark.HookSequence → z3_hook_start / z3_hook_loop / z3_hook_release
Shark velocity → HookVelocityBinding → loop GainHook Start / Loop / Release Event on Z3_Fishing are entries played at the start, during, and release of left-click hooking.
Edit and try it
Section titled “Edit and try it”- Select
Z3_Fishingin Showcase map > World Outliner. - Open Details > Hapbeat > Fishing > Hook and inspect the Event Map and three entries.
- Change Hook Loop Event.
- Example: switch from
z3_hook_looptoz5_charge_loop. - What you can observe: Loop Entry Name in Hook Wiring uses the selected entry and changes the loop while hooked.
- Example: switch from
Inspect the SDK connection (C++)
Section titled “Inspect the SDK connection (C++)”Choose Tools → Open Visual Studio, then open:
Plugins└ HapbeatSDK └ Source └ HapbeatSDKSamples ├ Public │ └ HapbeatShowcaseZ3FishingActor.h └ Private └ HapbeatShowcaseZ3FishingActor.cppBuildEventMapAndHaptics passes the three selected values to the start / loop / stop entries of HookSequence. SetHooked calls the sequence’s Fire() / Stop(). HookVelocityBinding applies the hooked fish’s velocity to loop-playback Gain.
Z4 Stream Console — loop and runtime parameters
Section titled “Z4 Stream Console — loop and runtime parameters”BP_Z4_StreamConsole is a Blueprint example that connects loop playback on Space with Gain / Pan updates from sliders.
Space → Switch on Loop State → Stopped: LoopTrigger.Fire → Loop State = Running → Running: LoopTrigger.Stop → Loop State = Stopped
Gain / Pan slider → On Gain/Pan Slider Changed → BP_Z4_StreamConsole Event Graph → Set Binding Input (Hapbeat) → Update Stream Parameter (Hapbeat) → Fire Tick From Value (Hapbeat)Edit and try it (PIE Details)
Section titled “Edit and try it (PIE Details)”- Start PIE and press
Shift + F1. - Select
Z4_StreamConsolein World Outliner > Play World. - Select Details component tree > TickEmitter, then change Tick Threshold in Details > Hapbeat > Tick.
- Example: change
0.1to0.2. - What you can observe: moving the Gain / Pan slider by the same distance produces half as many ticks.
- Example: change
TickEmitter reads Tick Threshold for every slider input while running, so PIE does not need restarting. If you edit Event Graph nodes or connections, stop PIE, compile, and start PIE again.
Inspect the SDK connection (Blueprint)
Section titled “Inspect the SDK connection (Blueprint)”Stop PIE, open HapbeatSamples/Showcase/BP_Z4_StreamConsole in the Content Browser, and select Event Graph.
- Follow
Space Barto Switch on Loop State. The Stopped Fire Trigger (Hapbeat) startsz4_stream_loop; the Running Stop Trigger (Hapbeat) stops that same loop. - Follow On Gain Slider Changed / On Pan Slider Changed through Set Binding Input (Hapbeat) → Update Stream Parameter (Hapbeat). The slider float is placed in
GainBinding/PanBinding; both bindings update the Gain / Pan of theLoopTriggerstream while it plays. - The following Fire Tick From Value (Hapbeat) plays
z4_slider_tickonly when a slider crosses Tick Threshold.
Address Override is a runtime destination selection that sends only to Hapbeats matching Player / Group. It does not change Event Map entries or playback wiring. See Targeting for details.
Z5 Target Range — charge / shot and target hit
Section titled “Z5 Target Range — charge / shot and target hit”Charge begin / threshold / release → z5_charge_* / z5_shot_*
Projectile hits target → LightHitTrigger or HeavyHitTrigger → z5_tar_hit_light / z5_tar_hit_heavyThe six Event dropdowns on Z5_ChargeShot select the entries played for charge, shot, and target hit.
Edit and try it
Section titled “Edit and try it”- Select
Z5_ChargeShotin Showcase map > World Outliner. - Open Details > Hapbeat > Showcase. Event Map entries are in Haptic Events; charge tuning is in Charge.
- Change Heavy Threshold.
- Example: change
0.7to0.4. - What you can observe: the threshold entry and heavy shot activate earlier.
- Example: change
- Lower the midpoint of Charge Loop Gain Curve.
- Example: set Gain at
ChargeT = 0.5to0.2. - What you can observe: the charge loop is weaker in the first half and rises more sharply later.
- Example: set Gain at
- Change Heavy Shot Event.
- Example: switch from
z5_shot_heavytoz1_pin_hit. - What you can observe: releasing a heavy charge plays the selected entry.
- Example: switch from
Inspect the SDK connection (C++)
Section titled “Inspect the SDK connection (C++)”Choose Tools → Open Visual Studio, then open:
Plugins└ HapbeatSDK └ Source └ HapbeatSDKSamples ├ Public │ └ HapbeatShowcaseZ5ChargeShotActor.h └ Private └ HapbeatShowcaseZ5ChargeShotActor.cppBuildEventMap resolves Details values EventMapOverride and six *Event values into entry IDs. Tick evaluates Charge Loop Gain Curve and updates Gain for the playing charge loop. HandleChargeBegin, Tick, and FireShotAfterDelay pass charge / shot IDs to FireOneShotEntry. SetUpTarget passes light / heavy target-hit IDs to collision triggers.
Where to change things
Section titled “Where to change things”| What to change | Where |
|---|---|
| Clip, Gain, Target, loop | An entry in EM_Showcase |
| Z1 pin-hit entry | Event Map / Pin Hit Event on Z1_Bowling |
| Z5 charge / shot / target-hit entries | Haptic Events on Z5_ChargeShot |
| Runtime destination | Address Override |
Target is a logical destination filter. Address Override does not change Event Map or Actor wiring. See Targeting for details.
SDK connection settings and diagnostics
Section titled “SDK connection settings and diagnostics”Open the following from Tools → Hapbeat in the Editor toolbar:
- Hapbeat Settings — edit Port, App Name, Command Unicast, timing, and build-fixed Address Override.
- Hapbeat Runtime Status — inspect the Address Override stored for this PC, effective Player / Group and socket state during PIE. Values saved outside PIE apply to the next PIE / packaged launch; values saved during PIE apply immediately.
Event Map Test Play resolves the same saved Address Override and build-pinned override before sending. It sends when its button is pressed.