Skip to main content

Portal & travel authoring

How portals and URL travel work for authors.

One scene at a time (permanent product model)

DDDBrowser loads exactly one scene. Portal or URL travel unloads the current scene and loads the destination. This is the supported product model—not a temporary gap before “streaming worlds.”

world.id / world.position remain metadata + portal compatibility checks only. Do not author for continuous multi-scene adjacency or in-memory neighbor streaming.

In-scene cull: portal openings form a small visibility graph (chained nearby portals). Place openings so rooms you intend to hide sit outside opening radii on the far side; do not rely on portal cull for gameplay secrecy.

Trigger mutex

Each portal must enable exactly one trigger mode:

FlagDefaultBehavior
manualTriggertrueInteract → confirmation modal → load
autoTriggerfalseEnter radius → shared travel preview / load path
scriptTriggerfalseInteract → script on_interact; script calls Engine.triggerPortal(id) or Scene.TravelTo(url)

Schema/runtime reject zero or multiple triggers. Omitting flags yields manual-only defaults.

Author UX tips

  1. Prefer manual portals for public hubs (clear confirm).
  2. Use auto only when accidental travel is acceptable.
  3. Use script when game logic must gate travel (Engine.triggerPortal).
  4. Destination URL: HTTPS preferred; HTTP requires user Allow HTTP.
  5. Metadata/thumbnail improve the confirm preview—not an in-app catalog.

URL bar travel

Top-bar URL + Load uses the same load path (discovery → validate → assets → render). Portals do not keep the previous world in memory.