Overview
The billboard_device is a placeable Creative device that renders a text panel in 3D world space. Players see it like a sign — floating above a capture point, mounted on a wall, or hovering near a chest. Its real power comes from Verse: you can change what it says, how big the text is, whether the physical border frame is visible, and whether the text is shown at all — all at runtime in response to game events.
When to reach for it:
- Displaying a live objective label ("Defend the Vault") that updates when the objective changes.
- Showing a countdown message that appears when a timer starts and disappears when it ends.
- Giving players contextual hints near interactables ("Press here to unlock").
- Hiding flavor text until a trigger fires, then revealing it dramatically.
API Reference
billboard_device
Used to display custom text messages on a billboard.
Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).
billboard_device<public> := class<concrete><final>(creative_device_base):
Methods (call these to make the device act):
| Method | Signature | Description |
|---|---|---|
ShowText |
ShowText<public>():void |
Shows the billboard text. |
HideText |
HideText<public>():void |
Hides the billboard text. |
UpdateDisplay |
UpdateDisplay<public>():void |
Updates the device display to show the current Text. |
SetShowBorder |
SetShowBorder<public>(Show:logic):void |
Sets the visibility of the device border mesh. This also determines whether the device collision is enabled. |
GetShowBorder |
GetShowBorder<public>()<transacts>:logic |
Returns true if the device border is enabled. |
SetText |
SetText<public>(Text:message):void |
Sets the device Text. |
SetTextSize |
SetTextSize<public>(Size:int):void |
Sets the Text Size of the device Text. Clamped to range [8, 24]. |
GetTextSize |
GetTextSize<public>()<transacts>:int |
Returns the Text Size of the device Text. |
Walkthrough
Scenario: A vault door puzzle. When a player steps on a pressure plate, a billboard near the vault first shows a warning message in large text with a visible border. After a short delay it swaps to a "VAULT OPEN" message in smaller text and hides the border frame — signaling the door is now unlocked.
This example uses SetText, SetTextSize, UpdateDisplay, ShowText, SetShowBorder, HideText, and GetTextSize across the full flow.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Localizer helper — billboard_device.SetText requires a `message`, not a raw string.
vault_warning<localizes>(S : string) : message = "{S}"
vault_billboard_device := class(creative_device):
# Wire this to your Billboard device in the UEFN details panel.
@editable
Billboard : billboard_device = billboard_device{}
# Wire this to a Trigger device the player steps on.
@editable
Plate : trigger_device = trigger_device{}
OnBegin<override>()<suspends> : void =
# Start with the billboard hidden — no spoilers before the puzzle begins.
Billboard.HideText()
Billboard.SetShowBorder(false)
# Wait for the pressure plate to fire.
Plate.TriggeredEvent.Await()
# Phase 1: warning — big text, border visible.
Billboard.SetText(vault_warning("⚠ SECURITY BREACH DETECTED ⚠"))
Billboard.SetTextSize(24) # Maximum allowed size.
Billboard.SetShowBorder(true) # Show the physical border frame.
Billboard.UpdateDisplay() # Flush the new text to the screen.
Billboard.ShowText() # Make the text visible.
# Hold the warning for 3 seconds.
Sleep(3.0)
# Phase 2: vault open — smaller text, no border (clean look).
Billboard.SetText(vault_warning("VAULT OPEN — ENTER NOW"))
Billboard.SetTextSize(14)
Billboard.UpdateDisplay() # Apply the new text + size.
Billboard.SetShowBorder(false) # Remove the border frame.
# Confirm the final size in the log (GetTextSize is transactional — safe to call anywhere).
CurrentSize : int = Billboard.GetTextSize()
Print("Billboard text size is now: {CurrentSize}")
# Leave the vault-open message visible indefinitely.
Line-by-line explanation:
| Lines | What's happening |
|---|---|
vault_warning<localizes> |
Converts a plain string into a message value — required by SetText. |
HideText() / SetShowBorder(false) |
Hides both the text and the border on startup so the billboard is invisible. |
Plate.TriggeredEvent.Await() |
Suspends until the pressure plate fires — no polling needed. |
SetText(...) |
Queues new text content. The display won't update until UpdateDisplay() is called. |
SetTextSize(24) |
Sets the largest allowed text size (clamped to 8–24). |
SetShowBorder(true) |
Makes the physical border mesh (and its collision) visible. |
UpdateDisplay() |
Required — flushes the queued text/size changes to what players actually see. |
ShowText() |
Reveals the text layer (separate from the border). |
Sleep(3.0) |
Waits 3 seconds before switching to the vault-open message. |
GetTextSize() |
Reads back the current size — useful for conditional logic or debugging. |
Common patterns
Pattern 1 — Toggle visibility with ShowText / HideText
A hint sign that pulses on and off every 2 seconds to draw attention to a nearby objective.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
hint_pulse_device := class(creative_device):
@editable
HintBoard : billboard_device = billboard_device{}
OnBegin<override>()<suspends> : void =
# Pulse the billboard on/off indefinitely.
loop:
HintBoard.ShowText()
Sleep(1.5)
HintBoard.HideText()
Sleep(0.5)
Pattern 2 — Swap messages with SetText + UpdateDisplay
A scoreboard-style billboard that cycles through three round-result messages, each displayed for 4 seconds.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
round_result<localizes>(S : string) : message = "{S}"
round_announcer_device := class(creative_device):
@editable
Announcer : billboard_device = billboard_device{}
OnBegin<override>()<suspends> : void =
Messages : []string = array:
"ROUND 1 — FIGHT!"
"ROUND 2 — FIGHT!"
"FINAL ROUND — FIGHT!"
Announcer.SetTextSize(20)
Announcer.ShowText()
for (Msg : Messages):
Announcer.SetText(round_result(Msg))
Announcer.UpdateDisplay() # Must call this after SetText to refresh the display.
Sleep(4.0)
Announcer.HideText()
Pattern 3 — Border toggle with GetShowBorder
A device that checks the current border state and flips it — useful when you want to toggle without tracking state yourself.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
border_toggle_device := class(creative_device):
@editable
Sign : billboard_device = billboard_device{}
@editable
ToggleButton : button_device = button_device{}
OnBegin<override>()<suspends> : void =
ToggleButton.InteractedWithEvent.Subscribe(OnButtonPressed)
# Keep the coroutine alive.
Sleep(Inf)
OnButtonPressed(Agent : agent) : void =
# Read the current border state and invert it.
CurrentBorder : logic = Sign.GetShowBorder()
if (CurrentBorder = true):
Sign.SetShowBorder(false)
else:
Sign.SetShowBorder(true)
Gotchas
1. SetText alone does nothing visible — you must call UpdateDisplay() after it.
This is the most common mistake. SetText queues the new content internally, but the device only refreshes what players see when UpdateDisplay() is called. Always pair them:
Sign.SetText(MyMessage("New text"))
Sign.UpdateDisplay() # ← required
2. SetText requires a message, not a string.
Verse's localization system means you cannot pass a raw string literal directly. Declare a localizer function:
my_label<localizes>(S : string) : message = "{S}"
// Then:
Sign.SetText(my_label("Hello World"))
There is no StringToMessage helper — the <localizes> attribute is the correct pattern.
3. SetTextSize is clamped to [8, 24].
Values outside this range are silently clamped — passing 100 gives you 24, passing 1 gives you 8. Use GetTextSize() after setting if you need to confirm the effective value.
4. ShowText / HideText and SetShowBorder are independent.
The text layer and the border mesh are controlled separately. Calling HideText() hides the text but leaves the border frame visible (and its collision active). If you want the device fully invisible, call both HideText() and SetShowBorder(false).
5. SetShowBorder also controls collision.
The border mesh is a physical object — when it's visible (SetShowBorder(true)), players and projectiles collide with it. If you want a purely cosmetic text overlay with no collision, keep the border hidden.
6. The device must be declared as an @editable field.
You cannot construct a billboard_device in Verse code — it must be placed in UEFN and wired via the details panel. A bare billboard_device{} in OnBegin without the @editable annotation will not reference your placed device.