Reference Devices compiles

matchmaking_portal_device: Sending Players to New Islands

The Matchmaking Portal device is your bridge between islands — it lets players hop from your experience to another Fortnite island or linked experience. With Verse you can Enable or Disable the portal at runtime, so you can lock it behind a puzzle, open it only when a round ends, or gate it until every player has collected a key item.

Updated Examples verified on the live UEFN compiler
Watch the Knotmatchmaking_portal_device in ~90 seconds.

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.InteractedWithEvent sends a non-optional agent, 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

  1. 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 to Enable() / Disable() silently target the default instance and nothing happens in-game.

  2. 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 call EscapePortal.Disable() at the top of OnBegin so your Verse logic is the single source of truth.

  3. Sleep requires <suspends>. Any function that calls Sleep() must be marked <suspends> and called with spawn { } from a non-suspending context (like an event handler). Forgetting spawn causes a compile error.

  4. trigger_device.TriggeredEvent sends ?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 with if (A := Agent?): before using A.

  5. No events on matchmaking_portal_device. The device currently exposes only Enable and Disable — there is no PlayerEnteredEvent or similar. If you need to react to a player using the portal, pair it with a trigger volume placed at the portal's entrance.

  6. 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.

Device Settings & Options

The matchmaking_portal_device User Options panel in the UEFN editor — every setting you can tune.

Matchmaking Portal Device settings and options panel in the UEFN editor — Island Code, Set Island Title Text Visibility, Set Matchmaking Text Visibility D.., Set Island Details Visibility, Enable Audio, Enable as Art, Operat Summ, Set Matchmaking Text Visibility D.
Matchmaking Portal Device — User Options (1 of 2) in the UEFN editor: Island Code, Set Island Title Text Visibility, Set Matchmaking Text Visibility D.., Set Island Details Visibility, Enable Audio, Enable as Art, Operat Summ, Set Matchmaking Text Visibility D.
Matchmaking Portal Device settings and options panel in the UEFN editor — Island Code, Set Island Title Text Visibility, Set Matchmaking Text Visibility D.., Set Island Details Visibility, Enable Audio, Enable as Art, Operat Summ, Set Matchmaking Text Visibility D.
Matchmaking Portal Device — User Options (2 of 2) in the UEFN editor: Island Code, Set Island Title Text Visibility, Set Matchmaking Text Visibility D.., Set Island Details Visibility, Enable Audio, Enable as Art, Operat Summ, Set Matchmaking Text Visibility D.
⚙️ Settings on this device (8)

Setting names read from the panel above — may be partial; the screenshots are the source of truth.

Island Code
Set Island Title Text Visibility
Set Matchmaking Text Visibility D..
Set Island Details Visibility
Enable Audio
Enable as Art
Operat Summ
Set Matchmaking Text Visibility D.

Guides & scripts that use matchmaking_portal_device

Step-by-step tutorials that put this object to work.

Build your own lesson with matchmaking_portal_device

Generate a personalized, step-by-step lesson plan built around this object — grounded in this exact reference and our compile-verified knowledge base.

Build a lesson →