Entwickeln

Das Colocation-Paket einrichten

Aktualisiert: 16.12.2024
Während der Einrichtung der Szene werden die Spieler*innen synchronisiert. Alles andere wird über das reguläre Unity-Netzwerk ausgeführt.
Für ein optimales Colocation-Erlebnis musst du gewährleisten, dass sich die Client-Spieler*innen am richtigen Ort relativ zu der Szene befinden, die an den*die gastgebende*n Spieler*in übermittelt wird.
Hierfür greift der*die gastgebende Spieler*in auf die Scene API zu, um alle Objekte in der Szene erscheinen zu lassen. Sobald die Client-Spieler*innen der Session beitreten, können sie mit diesen Objekten interagieren. Beim Rest dieser Logik müssen die Client-Spieler*innen dann lediglich an der richtigen Stelle relativ zu dem*der gastgebenden Spieler*in platziert werden. Hieraus ergeben sich die gemeinsamen Spatial Anchors. Sobald diese eingerichtet sind, fügt sich alles zu einer Netzwerkszene zusammen.
Die Client-Spieler*innen empfangen zwei Dinge von dem*der gastgebenden Spieler*in:
  • Ein Objekt (z. B. ein Unity-Transform) zur Darstellung relativ zum Spatial Anchor – in Discover wird dieses Objekt durch Photon Fusion übermittelt.
  • Eine Anchor-ID, die der*die gastgebende Spieler*in mit der Shared Spatial Anchors API verwendet, um den Transform relativ zum Headset zu erhalten.
Das Colocation-Paket verwendet diese Daten, um die Rigs aller Spieler*innen am Transform auszurichten, das der*die Gastgeber*in an die Client-Spieler*innen gesendet hat. Der Server sendet also zuerst einen Transform und die ID. Er verwendet diese ID dann für einen anderen Transform, der darstellt, wo sich der*die Spieler*in tatsächlich in der Szene des*der ersten Spieler*in befindet. Im Hintergrund sendet die Spatial Anchors API den Transform relativ zum Headset zurück.
So wird ein absolutes Koordinatensystem erstellt. Dieses bildet den gemeinsamen Weltbereich, der von dem*der Gastgeber*in und den Client-Spieler*innen genutzt wird. Aus diesem Grund musst du, wenn du digitale Objekte mithilfe des Colocation-Pakets in einer App replizierst, die Objekte nicht auch an dem*der Spieler*in ausrichten. Du bewegst lediglich die Basis des Kamera-Rigs des*der Spieler*in.

Das Colocation-Paket einrichten

Dieser Prozess wird durch die ColocationDriverNetObj-Klasse in /Assets/Discover/Scripts/Colocation/ColocationDriverNetObj.cs veranschaulicht. So sieht der Workflow in dieser Klasse aus:
  1. Objekte in der UniTask SetupForColocation()-Funktion einrichten: Die Klasse richtet alle Objekte in der Szene ein, wie im folgenden Code-Schnipsel ersichtlich:
                 m_colocationLauncher.Init(
                 m_oculusUser?.ID ?? default,
                 m_headsetGuid,
                 NetworkAdapter.NetworkData,
                 NetworkAdapter.NetworkMessenger,
                 sharedAnchorManager,
                 m_alignmentAnchorManager,
                 overrideEventCode
             );
    
  2. Colocation-Launcher initialisieren: Nachdem alle Objekte eingerichtet wurden, wird der Colocation-Launcher initialisiert:
             m_colocationLauncher.ColocationReady += OnColocationReady;
             m_colocationLauncher.ColocationFailed += OnColocationFailed;
    
             if (HasStateAuthority)
             {
                 m_colocationLauncher.CreateColocatedSpace();
             }
             else
             {
                 // Don't try to colocate if we join remotely
                 if (SkipColocation)
                 {
                     OnColocationCompletedCallback?.Invoke(false);
                 }
                 else
                 {
                     m_colocationLauncher.ColocateAutomatically();
                 }
             }
    
    Hierdurch wird ein OnAfterColocationReady-Rückruf bereitgestellt. Mithilfe von HasStateAuthority wird zudem überprüft, ob das verbundene Gerät das gastgebende Gerät ist. Wenn ja, erstellt es den Colocation-Bereich mit:
     m_colocationLauncher.CreateColocatedSpace();
    
    Andernfalls ruft es die Methode ColocateAutomatically auf.
    Hierdurch wird gewährleistet, dass die Spatial Anchors sowohl von Seiten der Meta Quest-Cloud (mit der Shared Spatial Anchor API) als auch von Seiten des Unity-Objektnetzwerkes (mit einer Netzwerklösung wie Photo Fusion) eingerichtet werden.
Sobald sich der*die Client-Spieler*in verbindet, ruft die Klasse die Methode ColocateAutomatically auf. Hierdurch werden die Informationen des*der Gastgeber*in erfasst, der*die dann alles so einrichtet, dass die Spieler*innen korrekt orientiert sind.