Entwickeln

Übersicht über den Multiplayer-Modus

Aktualisiert: 23.08.2024
Mit den Meta Quest-Multiplayer-Funktionen können die Nutzer*innen andere Personen finden und einladen und in verschiedenen Spielen und Apps mit ihnen spielen. Zu diesen Funktionen gehören Destinations, Gruppenpräsenz, Einladungen, erneutes Beitreten, Aufstellungen, Benachrichtigungen und navigationsbezogene Funktionen wie Einladungslink, Schnelleinladungen und Einladung zur App.
In diesem Dokument werden Ansätze zur Nutzung dieser Funktionen für ein nahtloses Multiplayer-Erlebnis vorgestellt.

Was bedeutet „Multiplayer“?

Als „Multiplayer“ wird auf Meta Quest jedes Erlebnis bezeichnet, an dem mehrere Nutzer*innen beteiligt sind, die entweder synchron, asynchron oder gemeinsam an einem Ort zusammenkommen, um miteinander oder gegeneinander zu spielen und ein gemeinsames Ziel zu erreichen. Gut konzipierte Multiplayer-Inhalte können Nutzer*innen dazu anregen, immer wieder zu deiner App oder deinem Erlebnis zurückzukehren.
Jedes Multiplayer-Erlebnis benötigt auch eine Berichtsstruktur, über die Nutzer*innen Entwickler*innen informieren können, wenn Spieler*innen gegen den Verhaltenskodex für VR-Erlebnisse (CCVE) verstoßen. Mithilfe von Governance-Tools für deine Nutzer*innen kannst du diese besser betreuen und die Community aufbauen, die du dir für deine App vorstellst.

Synchrone, asynchrone und ortsgebundene Multiplayer-Erlebnisse

Bei einem synchronen Multiplayer-Erlebnis beteiligen sich die Nutzer*innen gleichzeitig in Echtzeit an einer Aktivität. Ein synchrones Multiplayer-Erlebnis findet in der Regel entweder persönlich, über einen lokalen Multiplayer-Modus oder online statt.
Bei einem asynchronen Multiplayer-Erlebnis müssen die Nutzer*innen nicht gleichzeitig spielen oder an einer Aktivität teilnehmen, um auf ein Ziel hinzuarbeiten. Zu den asynchronen Multiplayer-Erlebnissen gehören beispielsweise der Wettbewerb um Plätze in einer Bestenliste, eine App, in der Nutzer*innen selbst erstellte Inhalte hochladen können, oder das Beitragen zu einem gemeinsamen Ziel, von dem andere Nutzer*innen profitieren.
Bei einem ortsgebundenen Multiplayer-Erlebnis spielen die Nutzer*innen ein Spiel oder nehmen an einer Aktivität am selben physischen Ort teil. Bei einem ortsgebundenen Erlebnis kommen Elemente wie gemeinsame Raumanker zum Einsatz, um Mixed-Reality-Erlebnisse (MR) zu ermöglichen. MR-Erlebnisse bieten eine neue Möglichkeit, Nutzer*innen zusammenzubringen, da sie ihnen helfen, in gemeinsamen virtuellen Räumen zu interagieren und gemeinsam neue Multiplayer-Erlebnisse wahrzunehmen.

Multiplayer-Funktionen im Meta Quest-Ökosystem

Multiplayer-Apps und -Spiele im gesamten Quest-Ökosystem sorgen nachweislich für eine konstant hohe Bindung der Nutzer*innen und sind starke Motivationsfaktoren zur Wiederkehr.
Im Quest-Ökosystem basieren Multiplayer-Apps auf dem Platform SDK, das APIs enthält, die Multiplayer-Funktionen für immersive Apps ermöglichen. Darüber hinaus ermöglicht die Integration der Platform-APIs den Zugriff auf die Tools für Multiplayer-Analysen und -Tests im Meta Horizon Developer Center.

Navigationsfunktionen

Das Platform SDK enthält auch Navigationsfunktionen. Mit den Navigationsfunktionen können Nutzer*innen zu und von Destinations navigieren und Freund*innen und Follower*innen einladen, sich ihnen anzuschließen.
Folgende Funktionen ermöglichen die Navigation in deiner App:
  • Destinations - Destinations sind konfigurierbare Orte in deiner App, die über die Gruppenpräsenz angezeigt werden können. In der Übersicht über Destinations erfährst du, wie du Destinations in deiner App einrichtest.
  • Gruppenpräsenz – Enthält die folgenden Informationen, die von der App verwaltet werden:
    • In welcher App befindet sich ein*e Nutzer*in?
    • Nimmt er*sie an einem Spiel teil?
    • Befindet er*sie sich in einer Lobby?
    • Ist er*sie an einer bestimmten Destination?
    • Kann er*sie Nutzer*innen zu seinem*ihrer aktuellen Destination einladen?
  • Einladung zur App – Lade Follower*innen und Nutzer*innen, mit denen du vor Kurzem gespielt hast, in bereits bestehende Lobbys ein.
  • Aufstellung – Über die Aufstellung können Nutzer*innen sehen, welche Personen sich mit ihnen im Spiel befinden.
  • Erneutes Beitreten – Mit dieser Funktion können Nutzer*innen entscheiden, ob sie nach einer Unterbrechung wieder in eine Sitzung mit Freund*innen aufgenommen werden möchten.
  • Webhooks – Mit Webhooks kannst du in Echtzeit HTTP-Benachrichtigungen zu Änderungen erhalten, die für die Multiplayer-Erlebnisse in deiner App relevant sind.
  • Einladungslink – Ein offener Einladungslink kann an beliebige Personen weitergegeben werden, damit sie gemeinsam eine App nutzen können.
  • Schnelleinladungen – Mit Schnelleinladungen können Entwickler*innen Einladungen in ihr App-Erlebnis integrieren, ohne dass ein Meta Quest-Overlay erforderlich ist.

Anwendungsfälle für Navigationsfunktionen

Nachfolgend findest du Beispiele für häufige Anwendungsfälle und Erlebnisse im Zusammenhang mit Navigationsfunktionen. Diese veranschaulichen, wie Nutzer*innen normalerweise mit Navigationssystemen und -funktionen interagieren.
Hinweis: Diese Beispiele basieren auf der Beispiel-App SharedSpaces mit den Testnutzer*innen Alice und Bob. Die App umfasst eine Reihe von Räumen (rot, grün, blau und violett) mit angeschlossenen Destinations. Außerdem verwendet die App Photon als Netzwerklösung.

Einladung von Freund*innen in eine Lobby

In diesem Ablauf kommen Destinations, Gruppenpräsenz, Einladungen und Deeplinks zum Einsatz:
  • Nutzerin A (Alice) startet die App.
    • Wenn die Anwendung regulär und nicht infolge einer Einladung gestartet wird, legt ein Event die Gruppenpräsenzinformationen fest.
      • Der Name der Destination-API wird auf die Standard-Destination „Lobby“ und -Karte festgelegt.
      • Da Alice die Lobby betritt und ihre Sitzungs-Lobby-ID noch nicht festgelegt hat, wird eine neue zufällige ID erstellt. In diesem Beispiel lautet diese „lobby_123“. Die Spielesitzungs-ID wird gelöscht.
    • Im nächsten Schritt wird die Transportschicht mit Photon eingerichtet. Wir treten einfach einem Raum bei oder erstellen einen Raum mit dem gleichen Namen wie die Lobby-Sitzungs-ID „lobby_123“. Da wir diesen neuen Namen gerade erst angelegt haben, ist sie die erste Person im Raum, der für sie erstellt wurde.
    • Da sie auf UE4-Ebene Masterclient ihres Photon-Raums ist, beginnt sie nun, den UE4-Server auf ihrem Headset zu hosten.
  • Alice sendet Bob eine Einladung zu „lobby_123“.
    • Bob erhält die Einladung, entweder im Spiel oder in Horizon Home.
    • Wenn Bob die Einladung annimmt, wird die App mit einem Deeplink gestartet, der Alices Gruppenpräsenz enthält, einschließlich ihrer aktuellen Destination „Lobby“, der Lobby-Sitzung „lobby_123“ und ohne Spiel-ID.
    • Bobs Gruppenpräsenz wird aktualisiert, damit sie dieselbe Destination verwendet. Da es sich um eine Einladung zum Beitritt zu einer Lobby handelt, wird auch Bobs Lobby-ID so aktualisiert, dass sie mit der von Alice übereinstimmt.
    • Auf Photon-Ebene folgt Bob genau dem gleichen Ablauf: Er versucht, einen Raum namens „lobby_123“ zu erstellen oder ihm beizutreten. Da dieser bereits existiert, tritt er ihm einfach als normaler Client bei.
    • Auf der Ebene der Unreal Engine verbindet ihn die App mit Alice (aktueller Masterclient des Photon-Raums) als normaler Client.

Beitritt zu einem laufenden Spiel

Nachfolgend findest du ein Beispiel für eine Nutzerin, die einem aktuell laufenden Spiel beitritt.
  • Bob betritt den blauen Raum.
    • Beim Betreten wird seine „match_ID“ auf die ID des blauen Raums gesetzt. Die ID dieses privaten Raums leitet sich von der Lobby ab, an den er angeschlossen ist (z. B. „BlueRoom_for_lobby_123“).
      • Der blaue Raum ist ein privater Raum, der mit Alices Lobby „lobby_123“ verbunden ist.
      • Nutzer*innen in einer bestimmten Lobby können jedem angeschlossenen privaten Raum beitreten. Wenn Bob beispielsweise dem Raum beitritt, wird der Photon-Raum erstellt oder dem Raum hinzugefügt, der nach seiner „match_session_ID“ benannt ist.
      • Wenn er die erste Person in diesem Raum ist, wird ein neuer Photon-Raum erstellt und er wird als aktueller Masterclient zugewiesen. Als Masterclient hostet Bob den entsprechenden UE4-Server auf seinem Headset. Bob initialisiert den UE4-Server, wird zum ersten Client des Servers und seine Startposition wird festgelegt.
  • Alice betritt den blauen Raum.
    • Ihre Spiel-ID ist auf die ID des blauen Raums „BlueRoom_for_lobby_123“ eingestellt.
    • Sie verbindet sich mit dem Server von Bob, da Bob jetzt Host ist. (UE4)
    • Sie ist jetzt mit Bob gleichzeitig anwesend.
    • Sie teilen sich dieselbe Lobby-ID „lobby_123“ und dieselbe Spiel-ID „BlueRoom_for_lobby_123“.

Senden einer Einladung an Freund*innen oder Follower*innen

Im folgenden Prozess wird der Anwendungsfall beschrieben, bei dem Freund*innen oder Follower*innen eine Einladung zu einer Destination in einer App gesendet wird.
  • Im blauen Raum öffnet Alice die Aufstellung.
    • Sie und Bob sind im selben Team, da beide dieselbe Lobby-ID „lobby_123“ haben.
  • Alice klickt auf die Schaltfläche zum Einladen unten in der Ansicht mit der Aufstellung, wodurch die Ansicht zum Einladen geöffnet wird.
  • Anschließend wählt sie Charlie aus der Ansicht zum Einladen aus.
  • Charlie erhält die Einladung und kann sie von überall auf dem Meta Quest-Headset annehmen.
    • Ein „GroupPresenceJoinIntent“ wird empfangen, mit dem der Name der Destination-API, die Lobby-ID und die Spiel-ID basierend auf der Einladung festgelegt werden.
    • Dadurch wird das selbstdefinierte Event „NetworkLaunch“ ausgelöst. Da dieser Aufruf über eine Einladung initiiert wurde, wird eine Deeplink-Nachricht mit Informationen über die Destination „Blauer Raum“, die Lobby „lobby_123“ und das Spiel „BlueRoom_for_lobby_123“ verwendet.
    • Da es sich um eine Einladung zu einem Spiel handelt, wird Charlies Gruppenpräsenz mit den Informationen zur Destination und zur Lobby aktualisiert.
    • Charlies Lobby-Sitzungs-ID ändert sich jedoch nicht. Er behält die bereits vorhandene, und wenn er noch keine hat, wird eine neue zufällig generiert. Seine Lobby-Sitzung unterscheidet sich daher von der von Bob und Alice (z. B. „lobby_456“).
    • Durch die Verbindung mit dem Photon-Raum mit dem Namen „BlueRoom_for_Lobby_123“ wird Charlie benachrichtigt, dass Bob der Host ist. Charlie verbindet sich mit Bob.
    • Alice, Bob und Charlie sind im blauen Raum gleichzeitig anwesend.

Einladung von Freund*innen oder Follower*innen in eine Lobby mit anschließender gemeinsamer Navigation zu einem Spiel

Nachfolgend wird der Anwendungsfall beschrieben, bei dem eine Nutzer*in eine/n Freund*in oder Follower*in in ihre*seine Lobby einlädt, um eine Gruppe zu bilden, und dann gemeinsam zu einer Destination zu navigieren.
  • Sie verlassen den blauen Raum und kehren in die Lobby zurück.
    • Ihre Spiel-IDs werden auf null gesetzt.
    • Alice und Bob kehren mit der gemeinsamen Lobby-ID „lobby_123“ in Alices Lobby zurück.
    • Charlie kehrt allein mit seiner individuellen Lobby-ID „lobby_456“ zurück.
  • Alice sendet Charlie eine Einladung aus ihrer Lobby. Sie möchte, dass sie gemeinsam mehrere Spiele durchlaufen und in dieselbe Lobby zurückkehren.
    • Charlie nimmt die Einladung an.
    • Ein „GroupPresenceJoinIntent“ wird empfangen, mit dem Gruppenpräsenzinformationen festgelegt werden.
      • Der Name der Destination-API, die Lobby-ID „lobby_123“ und die Spiel-ID basieren auf der Nachricht mit dem Deeplink zur Einladung.
      • Dadurch wird die Lobby-ID von Bobs Gruppenpräsenz auf die Lobby-ID von Alice „lobby_123“ aktualisiert.
      • Dadurch wird er dem Photon-Raum zugeordnet.
    • Charlies Gruppenpräsenz wird nun so aktualisiert, dass seine Lobby-ID mit der von Alice und Bob übereinstimmt.
    • Alice, Bob und Charlie sind gemeinsam in der Lobby anwesend und können Spiele jetzt zusammen spielen und danach in dieselbe Lobby zurückkehren.

Beitrittsversuch während eines laufenden Spiels oder während der Anwesenheit von Nutzer*innen an einer nicht zum Beitritt freigegebenen Destination

Nachfolgend wird der Anwendungsfall beschrieben, bei dem ein*e Nutzer*in versucht, einer Lobby oder Sitzung beizutreten, die gerade läuft, oder sich in einer nicht zum Beitritt freigegebenen Destination wie dem Hauptmenü oder einem Optionsmenü befindet.
  • Alice sieht, dass sich Bob derzeit in einer Spielelobby befindet, da seine Gruppenpräsenz seine aktuelle Destination in der Freundesliste angibt.
  • Bob befindet sich derzeit in einem Spielstatus, der nicht zum Beitritt freigegeben ist, sodass seine Gruppenpräsenz „is_joinable“ auf „false“ gesetzt ist.
    • Da Bobs „is_joinable“ auf „false“ gesetzt ist, kann Alice Bob an seiner aktuellen Destination nicht beitreten.
  • Wenn sich Bob an einer Destination befindet, der beigetreten werden kann, während ein Spiel oder eine Sitzung läuft, kann sein „is_joinable“ auf „true“ gesetzt bleiben.
    • Wenn Alice versucht, einer Gruppe beizutreten, wird ein „GroupPresenceJoinIntent“ für Bobs aktuelle Destination empfangen.
      • Die aktuelle Spielsitzung von Bob wird unterbrochen und er und alle weiteren Gruppenmitglieder werden in ihre Lobby zurückgeschickt.
      • Alice betritt den Raum und ihre Lobby-ID wird so eingestellt, dass sie mit der Lobby-ID von Bob übereinstimmt.
    • Alice ist nun zusammen mit Bob und allen anderen Mitgliedern in der Lobby anwesend.
    • Alice und Bob können nun gemeinsam als Gruppe ein Spiel oder eine App starten.

Häufig gestellte Fragen

Frage: Was sind Multiplayer-Funktionen und warum sind sie wichtig?
Antwort: Mit den Multiplayer-Funktionen der Plattform können deine Nutzer*innen sich koordinieren und andere Personen unabhängig vom Standort zu deiner App einladen. Die eingeladenen Personen können sich in deiner App, an einem anderen Ort in der VR-Umgebung oder auf ihren Mobilgeräten befinden. Wenn du diese Funktionen in deine App integrierst, erreichst du ein breiteres Publikum, ermutigst neue Nutzer*innen zum Beitritt und reduzierst Konflikte im Multiplayer-Modus.
Frage: Wie integriere ich Multiplayer-Funktionen in meine App?
Antwort: Die Integration von Multiplayer-Funktionen gestaltet sich für jede*n Entwickler*in anders. Jede App hat ihre eigenen Anforderungen und vorhandener Code kann unterschiedliche Lösungen erfordern. Die im obigen Abschnitt beschriebenen Anwendungsfälle beziehen sich auf einige gängige Szenarien im Zusammenhang mit Multiplayer-Funktionen, Navigation und der Interaktion von Nutzer*innen damit. Hinweis: Multiplayer-Funktionen werden derzeit nur in immersiven Apps unterstützt und sind in nicht-immersiven Umgebungen wie 2D-Panel-Apps oder normalen Android-Apps nicht verfügbar.
Frage: Das ist eine Menge an Informationen. Nach welchen Kriterien sollte ich Prioritäten in Bezug auf Multiplayer-Funktionen setzen?
Antwort: Wir empfehlen, mit der Implementierung von Navigationsfunktionen zu beginnen, zu denen Destinationen und Gruppenpräsenz sowie Einladungen zur App gehören. Anschließend kannst du weitere Funktionen wie Einladungslinks, die Aufstellung und erweiterte Funktionen wie erneutes Beitreten, aufrufbare Fehlerdialoge und Webhooks implementieren.
Frage: Was sind Multiplayer-Testfälle und warum sind sie wichtig?
Antwort: Multiplayer-Testfälle sind Grenzfälle, die eine Multiplayer-App bewältigen muss, sobald die Einladung zum gewünschten Pfad und die Beitrittsabläufe entwickelt sind. (Diese sind bei der Implementierung von Multiplayer-Funktionen gleichermaßen wichtig.) Durch die Berücksichtigung gängiger Szenarien im Abschnitt zu Testfällen kannst du Unannehmlichkeiten für Nutzer*innen reduzieren.