Overview
The matchmaking_portal_device represents a physical portal placed in your UEFN island that, when active, sends players to a different island or linked experience. Out of the box you configure the destination in the device's properties panel, but Verse gives you programmatic control over when that portal is available.
Reach for this device when you need to:
- Gate progression — only open the exit portal after a boss is defeated.
- Timed escape — enable the portal for a 30-second window at round end.
- Conditional travel — disable the portal until every player has collected a required item.
Because the API surface is focused on availability (Enable / Disable), the device pairs naturally with other devices (trigger plates, score managers, timers) that fire the right moment to open or close the portal.
API Reference
matchmaking_portal_device
Used to take players to different islands and to link experiences together.
Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).
matchmaking_portal_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. |
Walkthrough
Scenario: A boss-fight island. The escape portal is disabled at round start. When a player steps on a trigger plate (representing the boss being defeated), the portal enables for 20 seconds, then disables again — a timed escape window.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Place this Verse device in your level alongside a trigger_device
# and a matchmaking_portal_device.
boss_escape_manager := class(creative_device):
# Wire up the trigger plate that fires when the boss is defeated.
@editable
BossDefeatedPlate : trigger_device = trigger_device{}
# Wire up the escape portal.
@editable
EscapePortal : matchmaking_portal_device = matchmaking_portal_device{}
# How many seconds the portal stays open.
EscapeWindowSeconds : float = 20.0
OnBegin<override>()<suspends> : void =
# Portal is closed at the start of the round.
EscapePortal.Disable()
# Listen for the boss-defeated trigger.
BossDefeatedPlate.TriggeredEvent.Subscribe(OnBossDefeated)
# Called when any agent steps on the boss-defeated plate.
OnBossDefeated(Agent : ?agent) : void =
# Spawn a concurrent task so we don't block the event handler.
spawn { OpenPortalWindow() }
# Opens the portal, waits, then closes it.
OpenPortalWindow()<suspends> : void =
EscapePortal.Enable()
Sleep(EscapeWindowSeconds)
EscapePortal.Disable()
Line-by-line explanation
| Lines | What's happening |
|---|---|
@editable EscapePortal |
Exposes the portal device slot in the UEFN Details panel so you can drag-and-drop the placed portal. |
EscapePortal.Disable() in OnBegin |
Immediately closes the portal when the round starts — players can't leave early. |
BossDefeatedPlate.TriggeredEvent.Subscribe(OnBossDefeated) |
Hooks the trigger plate's event to our handler method. |
OnBossDefeated(Agent : ?agent) |
The trigger_device sends a ?agent; we don't need to unwrap it here because we're acting on the portal, not the agent. |
spawn { OpenPortalWindow() } |
Launches the timed sequence concurrently so the event handler returns immediately. |
EscapePortal.Enable() |
Opens the portal — players can now step in and travel. |
Sleep(EscapeWindowSeconds) |
Waits 20 seconds (suspends this coroutine). |
EscapePortal.Disable() |
Closes the portal after the window expires. |
Common patterns
Pattern 1 — Permanently enable the portal at round start
Sometimes you just want the portal off in the editor (so it doesn't fire during pre-game) and then on the moment the round begins.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
portal_activator := class(creative_device):
@editable
ExitPortal : matchmaking_portal_device = matchmaking_portal_device{}
OnBegin<override>()<suspends> : void =
# Wait one frame so all devices have initialised.
Sleep(0.0)
# Enable the portal permanently for this session.
ExitPortal.Enable()
Pattern 2 — Toggle the portal with a button
A lever or button in the world toggles the portal on/off each time a player interacts with it.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
portal_toggle_manager := class(creative_device):
@editable
ToggleButton : button_device = button_device{}
@editable
TravelPortal : matchmaking_portal_device = matchmaking_portal_device{}
# Track whether the portal is currently open.
var PortalOpen : logic = false
OnBegin<override>()<suspends> : void =
TravelPortal.Disable()
ToggleButton.InteractedWithEvent.Subscribe(OnButtonPressed)
OnButtonPressed(Agent : agent) : void =
if (PortalOpen?):
TravelPortal.Disable()
set PortalOpen = false
else:
TravelPortal.Enable()
set PortalOpen = true
Note:
button_device.InteractedWithEventsends a non-optionalagent, so no unwrapping is needed here.
Pattern 3 — Disable the portal when a player enters a danger zone
A damage_volume_device or trigger marks a danger area; while any player is inside, the portal is locked.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
portal_lockout_manager := class(creative_device):
@editable
DangerTriggerEnter : trigger_device = trigger_device{}
@editable
DangerTriggerExit : trigger_device = trigger_device{}
@editable
SafePortal : matchmaking_portal_device = matchmaking_portal_device{}
OnBegin<override>()<suspends> : void =
SafePortal.Enable()
DangerTriggerEnter.TriggeredEvent.Subscribe(OnEnterDanger)
DangerTriggerExit.TriggeredEvent.Subscribe(OnExitDanger)
OnEnterDanger(Agent : ?agent) : void =
SafePortal.Disable()
OnExitDanger(Agent : ?agent) : void =
SafePortal.Enable()
Gotchas
-
Always wire the device in the Details panel. Declaring
@editable TravelPortal : matchmaking_portal_device = matchmaking_portal_device{}gives you the default value as a compile-time placeholder only. If you forget to assign the actual placed device in UEFN, calls toEnable()/Disable()silently target the default instance and nothing happens in-game. -
Disable in
OnBegin, not in the editor property. The device's enabled/disabled state can be set in the Details panel, but for dynamic control it's safest to callEscapePortal.Disable()at the top ofOnBeginso your Verse logic is the single source of truth. -
Sleeprequires<suspends>. Any function that callsSleep()must be marked<suspends>and called withspawn { }from a non-suspending context (like an event handler). Forgettingspawncauses a compile error. -
trigger_device.TriggeredEventsends?agent. The handler signature must be(Agent : ?agent). If you need to act on the specific player (e.g., only enable the portal for them), unwrap withif (A := Agent?):before usingA. -
No events on
matchmaking_portal_device. The device currently exposes onlyEnableandDisable— there is noPlayerEnteredEventor similar. If you need to react to a player using the portal, pair it with a trigger volume placed at the portal's entrance. -
Destination is editor-only. The target island / linked experience is set in the device's Details panel, not in Verse. You cannot change the destination at runtime via code.