This document is about: FUSION 2
SWITCH TO

Collaboration desk

Level
INTERMEDIATE
Available in the Industries Circle

Overview

The Collaboration desk sample demonstrates how Fusion can be used to mix colocated users with remote users in a mixed reality scenario, using the Anchors add-on.

Note: this sample focuses on an automatic mixed reality rooms alignment, designed to progressively build a common working table. To see a sample with manual re-positioning of the various user rooms, see the Fusion MR room Minimap technical sample.

When scanning a QRCode positioned on a table in the real life room, the user will join the common table. If another user scanned the same QRCode, they will be colocated. The table is designed to build progressively, each user room contributing to its construction with a virtual table part aligned on the closest table detected in the room.

If remote users end up being located outside of the local users real life walls, a VR background context will appear behind the remote user, to make this more comfortable, creating a combined remote room.

Technical Info

  • This sample uses the Shared Authority topology,

  • The project has been developed with Unity 6.0, Fusion 2 and tested with the following packages :

    • Meta XR Core SDK 85.0.0 : com.meta.xr.sdk.core
    • Meta MRUK 85.0.0 : com.meta.xr.mrutilitykit
    • OpenXR plugin 1.15.1 : com.unity.xr.openxr
    • Unity OpenXR Meta 2.3.0 : com.unity.xr.meta-openxr
  • Headset firmware version: v85, v2.1

Before you start

To run the sample :

  • Create a Fusion AppId in the PhotonEngine Dashboard and paste it into the App Id Fusion field in Real Time Settings (reachable from the Fusion menu).

  • Create a Voice AppId in the PhotonEngine Dashboard and paste it into the App Id Voice field in Real Time Settings

Download

VersionRelease DateDownload
2.0.12Apr 14, 2026Fusion Collaboration Desk 2.0.12

Folder Structure

The main folder /Collaboration_Desk contains all elements specific to this sample.

The /Photon folder contains the Fusion and Photon Voice SDK.

The /Photon/FusionAddons folder contains the Industries Addons used in this sample.

The /Photon/FusionAddons/FusionXRShared folder contains the rig and grabbing logic coming from the VR shared sample, creating a FusionXRShared light SDK that can be shared with other projects.

The /XR folder contains configuration files for virtual reality.

Architecture overview

The Collaboration desk sample is based on the XR Shared add-on, notably for the rig synchronization.

Aside from this base, the sample, like the other XR samples, contains some extensions to the XR add-ons, to handle some reusable features like marker detection, mixed reality rooms repositioning or touching.

Mixed reality rooms handling

The Anchors addon provides:

  • the colocation logic, to ensure users in the same room can share the same spatial reference, after scanning a common visual marker,
  • the combined remote room, providing a VR background context for remote users or objects when they are outside of the local room limits,
  • the room repositioning logic

Table arrangement

The logic of this sample is to allow several groups of user to work together, by being sure they will be in the network room in an appropriate position to work around a common table. The idea in this sample is to do this positioning automatically.

The ArrangementManager component handles the progressive construction of this common table.

When a user launch the application, they are expected to scan a QR code, lying on the table they work at: it can be a personal table, or a meeting room table where other users will join later on.

When the QR code is scanned, 2 things happen simultaneously:

  • first, the IRLRoomManager checks if this QR code is known, to know if the user is in the same room as another user. See Anchors' add-on colocation logic section for more details
  • besides, the application considers that the user is at their working position when this scan occurs, and triggers joining the common table.

Detect the reference table

When joining the table, the first step is to prepare for joining it. When the user triggers joining the table, the closest table (provided by a room scan, coming from Meta's MRUK) next to them is found.

In this sample, tables detected by MRUK have an ArrangeableFurniture (the tables are spawned by the NetworkedAnchorPrefabSpawner component after MRUK finished the room analysis)
In this component, this closest table ArrangeableFurniture.ShouldBeArranged is set to true, to warn the state authority of the ArrangementManager that this table should be used as a part of the common table (and that this user is ready to join it).

At this point, the ArrangementManager state authority creates an arrangement room network object. This object contains a ArrangementEmbeddedIRLRoom component, tracking information about this user room. Among those information is this reference table.
For now, the selected table has still not joined the common table.

Finding the user position on the table

To do so, the arrangement manager determines:

  • which contribution this table will make to the common table
  • where to put this table part on the common table

Table plate contribution to the common table

The goal here is to keep the common table size limited. To do so, when a user is alone in their room, instead of adding the full length of their table to the common table, we limit this contribution to a subsection of their table. By default, this "plate" has a width of 1 meter.

Besides, again to limit the table size, a single user should be able to have another single user in front of them. So the depth of this plate is set to half the depth of the common table (if it is the first user, the common table depth is set to their table depth: for the first user, the common table seems to be exactly their table, even if they are alone).

The side of the table to use, and the position to center this plate subsection is based on the user location: the arrangement manager considers a user will use the side of the table whose middle they are the closest to (note that for QR code placed on the border of a thin table, the arrangement manager could confuse the desired size: placing the QRCode near the center of the table solves this).

Table plate for single user
Table plate for single user

For colocated users, we expect other people to join at some point, so the full table width is used, and we consider that it requires to book both side of the common table (no remote users will be placed initially in front of them)

Table plate for colocated user
Table plate for colocated user

This plate description (offset position, axis used, ...) is store in the ArrangementEmbeddedIRLRoom.

Table plate position on the common table

Once the plate contribution is determined, the arrangement manager determines where to place it. To keep the common table size limited, it applies some rules:

  • if only one side of the table is occupied on a section of the table, it will try first to fill the opposite side
  • it will keep the width as limited as possible, but progressively alternatingly filling each corner (around the table initial center)
  • it will try to fill "holes" left by disconnected users (when they were the last user of their real life room)
Table filling logic

Move the users to join the table

Once the plate position is determined, the arrangement manager knows from which current location should the table plate move, and to which location it should end. This move should also be applied to every users, furniture, walls, anchor in the room containing this table.

To do so, the arrangement manager uses the NetworkIRLRoomMoveRequester associated to the moved user room, to trigger a move with NetworkIRLRoomMoveRequester.InitializingRoomMove. Note that every room connected to the application has a move requester object, spawned by the MoveRequesterSpawner component in the scene.

Update the common table

Finally, once the move actually occurred, the common table representation is updated, to reflect the new table size

Updating the table arrangement

A user interface can be displayed, from a button under the left hand watch, to change the table arrangement.

One button allows to re-arrange the local user room: it is relevant to use it when another user colocalizes in the same room. Indeed, the arrangement manager does not automatically change the plate size to use the full table (to avoid unexpected changes), but if a arrangement restart is required, the arrangement manager will detect that this room now has a colocalization setup, and will use the full table contribution to the common table.

Another button allows to fully reset the common table arrangement. It can be interesting for testing purposes, but also when a colocated room left the room and joined back, leaving a large hole (only single user tries to fill holes in the table, not colocated ones).

Car model and catwalk watch menu actions

To illustrate the need to have a common working table, the sample includes a small 3D car model to study, that can display an exploded view, and move alongside the common table to be observed by all attendees.

The model, its moving status, and its exploded view mode, can all be enabled with button present on the left watch.

Exploded car model
Exploded car model

The car presentation state is synched through the CatWalkManager component and its related networked properties: CatWalkEnabled, CatWalkPlay, CatWalkObjectExplodeViewEnabled.
The car object itself stores in the component CarController network properties to know if the car, that can be grabbed, has been placed back on the catwalk track (IsOnTrack) and if the wheel should be animating (IsAnimating).

Hardware rig construction

The hardware rig has been generated by the Meta's core building blocks, and is synchronized to the network rig with the MetaCoreIntegration Addon's components.

Network Connection

The network connection is managed by the Meta building blocks [BuildingBlock] Network Manager && [BuildingBlock] Auto Matchmaking.

[BuildingBlock] Auto Matchmaking set the room name and Fusion topology (Shared mode).

[BuildingBlock] Network Manager contains the Fusion's NetworkRunner. The UserSpawnercomponent, placed on it, spawns the user prefab when the user joins the room and handles the Photon Voice connection.

Used XR Addons & Industries Addons

To make it easy for everyone to get started with their 3D/XR project prototyping, we provide a comprehensive list of reusable addons.
See Industries Addons for more details.

Here are the addons we've used in this sample.

XRShared

XRShared addon provides the base components to create a XR experience compatible with Fusion.
It is in charge of the players' rig parts synchronization, and provides simple features such as grabbing and teleport.

See XRShared for more details.

Voice Helpers

The VoiceHelpers addon is used for the voice integration.

See VoiceHelpers Addon for more details.

Anchors

The Anchors addon is used for colocation, room repositioning, the combined remote room, and the room minimap.

See Anchors Addon for more details.

Dynamic Audio group

The dynamic audio group addon is used to enable users to chat together, while taking into account the distance between users to optimize comfort and bandwidth consumption. The ColocDynamicAudioGroupMember component ensures to also cut the voice transmission for colocated users (as they are in the same real life room, no need to sync their voice when they are close).

See Dynamic Audio Group XR Addon for more details.

XRITIntegration

The XRITIntegration addon is used to network the XR Interaction toolkit rig, and synchronize players' hands.

See XRITIntegration Addon for more details.

Feedback

The Feedback addon is used to centralize sounds used in the application and to manage haptic & audio feedbacks.

See Feedback Addon for more details.

3rd Party Assets and Attributions

The sample is built around several awesome third party assets:

Back to top