The Gateway: Matchmaking Portal Device

In this lesson you'll learn to

  • βœ“Student can configure a matchmaking_portal_device with a linked island code, enable/disable it from Verse, and send players to another published island.

Student can configure a matchmaking_portal_device with a linked island code, enable/disable it from Verse, and send players to another published island.

πŸ“– Reference & full walkthrough: The Gateway: Matchmaking Portal Device

πŸ” Builds on: lesson 13 portal_gatekeeper module

🧩 Your capstone piece: The five live portals β€” one per zone capstone island β€” enabled by the gatekeeper


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.

πŸ”’

Keep going β€” free

You've read the intro. The rest of this lesson is free for members. Sign in to continue and track your progress.

Sign in free to continue this lesson
Pass the quiz above to chart this quest in your Journal.

Sources

/guides/matchmaking-portal-device
Source

Biloxi Studios original lesson

Guided course

Add this lesson to your free study plan.

🧭 The Keeper’s log

Quest complete? Chart your next heading from the 🧠 Center Village (Free) expedition.

β›΅ Take me there