Overview
The dance_mannequin_device projects a hologram of a character performing dance emotes. You configure up to three visual presets (skin + emote combinations) in the device's UEFN properties panel, then switch between them at runtime from Verse. The killer feature is Skin and Emote Capture: call ActivateSkinAndEmoteCapture(Agent) and the mannequin instantly mirrors whatever skin and emote the live player is wearing — perfect for a "Copy the Champion" minigame or a winner's podium that shows off the round MVP.
Reach for this device when you need:
- An animated NPC-style dancer that isn't a real player
- A podium that clones the winning player's look
- Atmosphere dressing (lobby dance floors, nightclub stages) that can be toggled by game state
API Reference
dance_mannequin_device
Used to project a hologram of a character performing dance emotes.
Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).
dance_mannequin_device<public> := class<concrete><final>(creative_device_base):
Methods (call these to make the device act):
| Method | Signature | Description |
|---|---|---|
Enable |
Enable<public>():void |
Enables this device. |
Disable |
Disable<public>():void |
Disables this device. |
ActivateDefaultPreset |
ActivateDefaultPreset<public>():void |
Activates the hologram using Default Preset options. |
ActivatePreset2 |
ActivatePreset2<public>():void |
Activates the hologram using Preset 2 options. |
ActivatePreset3 |
ActivatePreset3<public>():void |
Activates the hologram using Preset 3 options. |
ActivateSkinAndEmoteCapture |
ActivateSkinAndEmoteCapture<public>(Agent:agent):void |
Activates the hologram using Agent's skin and emotes. |
DeactivateSkinAndEmoteCapture |
DeactivateSkinAndEmoteCapture<public>():void |
Deactivates the hologram. |
Walkthrough
Scenario — The Winner's Podium
When a round ends, a trigger fires. The mannequin first plays the Default Preset (a generic celebration), then after 5 seconds it captures the winning player's actual skin and emote. A second trigger lets the host reset everything back to the Default Preset for the next round.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
# Attach this device to your island.
# Wire RoundEndTrigger to fire when a round finishes.
# Wire ResetTrigger to fire when a new round starts.
podium_mannequin_manager := class(creative_device):
# The dance mannequin sitting on the winner's podium.
@editable
Mannequin : dance_mannequin_device = dance_mannequin_device{}
# Fires when the round ends (e.g. from a Class Designer or custom logic).
@editable
RoundEndTrigger : trigger_device = trigger_device{}
# Fires when the host resets for the next round.
@editable
ResetTrigger : trigger_device = trigger_device{}
# We store the winning agent so the async routine can use it.
var WinningAgent : ?agent = false
OnBegin<override>()<suspends> : void =
# Subscribe to both triggers.
RoundEndTrigger.TriggeredEvent.Subscribe(OnRoundEnd)
ResetTrigger.TriggeredEvent.Subscribe(OnReset)
# Start with the mannequin enabled and showing the default preset.
Mannequin.Enable()
Mannequin.ActivateDefaultPreset()
# Called when the round-end trigger fires.
# The trigger sends ?agent; unwrap before use.
OnRoundEnd(MaybeAgent : ?agent) : void =
if (A := MaybeAgent?):
set WinningAgent = option{A}
spawn { RunPodiumSequence(A) }
else:
# No agent context — just play the default celebration.
Mannequin.ActivateDefaultPreset()
# Async routine: play default preset, wait, then mirror the winner.
RunPodiumSequence(Winner : agent)<suspends> : void =
# Step 1 — generic celebration hologram while the camera pans.
Mannequin.ActivateDefaultPreset()
Sleep(5.0)
# Step 2 — clone the winner's skin and current emote.
Mannequin.ActivateSkinAndEmoteCapture(Winner)
# Called when the reset trigger fires — prepare for the next round.
OnReset(MaybeAgent : ?agent) : void =
# Drop any skin capture and return to the default preset.
Mannequin.DeactivateSkinAndEmoteCapture()
Mannequin.ActivateDefaultPreset()
set WinningAgent = false
Line-by-line breakdown
| Lines | What's happening |
|---|---|
@editable Mannequin |
Exposes the mannequin slot in the UEFN details panel so you can point it at the placed device. |
Mannequin.Enable() |
Ensures the device is on at game start (it might have been disabled in properties). |
Mannequin.ActivateDefaultPreset() |
Switches to the skin/emote combo you configured in Default Preset in the UEFN panel. |
OnRoundEnd(MaybeAgent : ?agent) |
Trigger events send ?agent; we unwrap with if (A := MaybeAgent?): before passing to the async routine. |
spawn { RunPodiumSequence(A) } |
Launches the timed sequence without blocking the event handler. |
Sleep(5.0) |
Waits 5 seconds while the camera does its cinematic pan. |
Mannequin.ActivateSkinAndEmoteCapture(Winner) |
Mirrors the winner's actual Fortnite skin and emote onto the hologram. |
Mannequin.DeactivateSkinAndEmoteCapture() |
Releases the skin capture so the mannequin returns to a preset state. |
Common patterns
Pattern 1 — Cycling through all three presets on a button press
A nightclub has three mannequins on a stage. One button cycles the center mannequin through all three configured looks.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
preset_cycler := class(creative_device):
@editable
Mannequin : dance_mannequin_device = dance_mannequin_device{}
@editable
CycleButton : button_device = button_device{}
# Tracks which preset is currently active (0 = Default, 1 = Preset2, 2 = Preset3).
var CurrentPreset : int = 0
OnBegin<override>()<suspends> : void =
Mannequin.Enable()
Mannequin.ActivateDefaultPreset()
CycleButton.InteractedWithEvent.Subscribe(OnCycle)
OnCycle(MaybeAgent : ?agent) : void =
set CurrentPreset = Int(Mod[Float(CurrentPreset + 1), 3.0])
if (CurrentPreset = 0):
Mannequin.ActivateDefaultPreset()
else if (CurrentPreset = 1):
Mannequin.ActivatePreset2()
else:
Mannequin.ActivatePreset3()
Note on the math: Verse does not auto-convert
int↔float. We cast viaFloat()andInt()to useMod[](which operates on floats), then cast back.
Pattern 2 — Disable the mannequin during combat, re-enable in the safe zone
The mannequin is decorative and should only run when players are in a lobby/safe area. A mutator zone drives enable/disable.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
lobby_mannequin_controller := class(creative_device):
@editable
Mannequin : dance_mannequin_device = dance_mannequin_device{}
# A Mutator Zone that covers the lobby safe area.
@editable
LobbyZone : mutator_zone_device = mutator_zone_device{}
OnBegin<override>()<suspends> : void =
# Start disabled — no one is in the lobby yet.
Mannequin.Disable()
LobbyZone.AgentEntersEvent.Subscribe(OnPlayerEntersLobby)
LobbyZone.AgentExitsEvent.Subscribe(OnPlayerExitsLobby)
OnPlayerEntersLobby(Agent : agent) : void =
# First player enters — light up the mannequin.
Mannequin.Enable()
Mannequin.ActivateDefaultPreset()
OnPlayerExitsLobby(Agent : agent) : void =
# Check if the zone is now empty; if so, power down.
if (GetAgentsInZone() = 0):
Mannequin.DeactivateSkinAndEmoteCapture()
Mannequin.Disable()
# Helper — count agents currently in the lobby zone.
GetAgentsInZone() : int =
LobbyZone.GetAgentsInVolume().Length
Pattern 3 — Mirror a specific player's skin on demand
A "Copy Cat" minigame: when a player presses a button, the mannequin instantly copies their look. Any other player pressing the button steals the spotlight.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
copy_cat_mannequin := class(creative_device):
@editable
Mannequin : dance_mannequin_device = dance_mannequin_device{}
@editable
SpotlightButton : button_device = button_device{}
OnBegin<override>()<suspends> : void =
Mannequin.Enable()
Mannequin.ActivateDefaultPreset()
SpotlightButton.InteractedWithEvent.Subscribe(OnSpotlightPressed)
OnSpotlightPressed(MaybeAgent : ?agent) : void =
if (A := MaybeAgent?):
# Drop any previous capture and mirror this player immediately.
Mannequin.DeactivateSkinAndEmoteCapture()
Mannequin.ActivateSkinAndEmoteCapture(A)
else:
# No agent context — fall back to default preset.
Mannequin.ActivateDefaultPreset()
Gotchas
1. ActivateSkinAndEmoteCapture needs a live agent, not ?agent
The method signature is ActivateSkinAndEmoteCapture(Agent:agent) — it takes a concrete agent, not an optional. Always unwrap ?agent from trigger/button events with if (A := MaybeAgent?): before passing it in.
2. Calling ActivatePreset2 or ActivatePreset3 without configuring them in UEFN is a no-op
The three presets (Default, Preset 2, Preset 3) are configured entirely in the device's UEFN details panel. If you call ActivatePreset2() but never set a skin/emote for Preset 2, nothing visible changes. Always verify your presets in the editor first.
3. DeactivateSkinAndEmoteCapture before switching presets
If the mannequin is currently in skin-capture mode and you call ActivateDefaultPreset() directly, the transition may not behave as expected on all builds. The safe pattern is always DeactivateSkinAndEmoteCapture() → then ActivateDefaultPreset() / ActivatePreset2() / ActivatePreset3().
4. Enable/Disable vs. Activate/Deactivate
Enable() and Disable() control whether the device is active at all (think power switch). The Activate* and Deactivate* methods control which hologram is displayed. A disabled mannequin ignores all Activate* calls — always Enable() before trying to switch presets.
5. No events on this device
dance_mannequin_device exposes zero listenable events. It is a pure output device — you drive it from other devices' events (triggers, buttons, zone entries). Don't look for an OnActivated event; it doesn't exist.
6. int ↔ float conversions are explicit
If you do arithmetic to cycle preset indices (as in the cycling pattern above), remember Verse never auto-converts between int and float. Use Float() to cast up and Int() to cast back down.