MR-Freigabe 250: HoloLens und immersive Headsets

Hinweis

Die Tutorials der Mixed Reality Academy wurden im Hinblick auf HoloLens (1. Gen.) und immersive Mixed Reality-Headsets entworfen. Daher halten wir es für wichtig, diese Tutorials für Entwickler verfügbar zu halten, die noch nach Anleitung beim Entwickeln für diese Geräte suchen. Diese Tutorials werden nicht mit den neuesten Toolsets oder Interaktionen aktualisiert, die für HoloLens 2 verwendet werden. Sie werden gewartet, um weiterhin auf den unterstützten Geräten zu funktionieren. Es wurde eine neue Reihe von Tutorials für HoloLens 2 veröffentlicht.

Mit der Flexibilität von Universelle Windows-Plattform (UWP) ist es einfach, eine Anwendung zu erstellen, die sich über mehrere Geräte erstreckt. Mit dieser Flexibilität können wir Umgebungen schaffen, die die Stärken der einzelnen Geräte nutzen. In diesem Tutorial wird eine grundlegende gemeinsame Erfahrung behandelt, die sowohl auf HoloLens als auch auf Windows Mixed Reality immersiven Headsets ausgeführt wird. Dieser Inhalt wurde ursprünglich auf der Microsoft Build 2017-Konferenz in Seattle, WA, bereitgestellt.

In diesem Lernprogramm wird Folgendes beschrieben:

  • Richten Sie ein Netzwerk mithilfe von UNET ein.
  • Teilen Sie Hologramme auf Mixed Reality-Geräten.
  • Richten Sie eine andere Ansicht der Anwendung ein, je nachdem, welches Mixed Reality-Gerät verwendet wird.
  • Erstellen Sie eine gemeinsame Erfahrung, in der HoloLens-Benutzer immersive Headsets durch einige einfache Rätsel führen.

Geräteunterstützung

Kurs HoloLens Immersive Headsets
MR-Freigabe 250: HoloLens und immersive Headsets ✔️ ✔️

Vorbereitung

Voraussetzungen

Projektdateien

Hinweis

Wenn Sie den Quellcode vor dem Herunterladen durchsuchen möchten, ist er auf GitHub verfügbar.

Kapitel 1: Holo World

Ziele

Stellen Sie sicher, dass die Entwicklungsumgebung für ein einfaches Projekt bereit ist.

Was wir erstellen werden

Eine Anwendung, die ein Hologramm entweder auf HoloLens oder einem Windows Mixed Reality immersiven Headset anzeigt.

Schritte

  • Öffnen Sie Unity.
    • Klicken Sie auf Öffnen.
    • Navigieren Sie zu dem Speicherort, an dem Sie die Projektdateien extrahiert haben.
    • Klicken Sie auf Ordner auswählen.
    • Es wird eine Weile dauern, bis Unity das Projekt zum ersten Mal verarbeitet hat.
  • Überprüfen Sie, ob Mixed Reality in Unity aktiviert ist.
    • Öffnen Sie das Dialogfeld "Buildeinstellungen" (STRG+UMSCHALT+B oder Dateibuildeinstellungen > ...).
    • Wählen Sie Universelle Windows-Plattform und klicken Sie dann auf Plattform wechseln.
    • Wählen Sie Playereinstellungen bearbeiten> aus.
    • Erweitern Sie im Bereich Inspektor auf der rechten Seite die Option XR-Einstellungen.
    • Aktivieren Sie das Kontrollkästchen Virtual Reality Unterstützt .
    • Windows Mixed Reality sollte das Virtual Reality SDK sein.
  • Erstellen Sie eine Szene.
    • Klicken Sie in der Hierarchie mit der rechten Maustaste auf Hauptkamera , und wählen Sie Löschen aus.
    • Ziehen Sie MixedRealityCameraParent aus HoloToolkit > Input > Prefabs in die Hierarchie.
  • Hinzufügen von Hologrammen zur Szene
    • Ziehen Sie Skybox aus AppPrefabs in die Szenenansicht.
    • Ziehen Sie Manager aus AppPrefabs in die Hierarchie.
    • Ziehen Sie islandaus AppPrefabs in die Hierarchie.
  • Speichern und erstellen
    • Speichern (entweder STRG+S oder Dateispeicherszene>)
    • Da es sich um eine neue Szene handelt, müssen Sie sie benennen. Der Name spielt keine Rolle, aber wir verwenden SharedMixedReality.
  • Exportieren nach Visual Studio
    • Öffnen Des Menüs "Build" (STRG+UMSCHALT+B oder Dateibuildeinstellungen>)
    • Klicken Sie auf Offene Szenen hinzufügen.
    • Überprüfen von Unity C#-Projekten
    • Klicken Sie auf Erstellen.
    • Erstellen Sie im angezeigten Datei-Explorer-Fenster einen neuen Ordner mit dem Namen App.
    • Klicken Sie auf den Ordner App .
    • Klicken Sie auf Ordner auswählen.
    • Warten Sie, bis der Build abgeschlossen ist.
    • Navigieren Sie im daraufhin angezeigten Datei-Explorer-Fenster zum Ordner App .
    • Doppelklicken Sie auf SharedMixedReality.sln , um Visual Studio zu starten.
  • Erstellen aus Visual Studio
    • Verwenden Sie die obere Symbolleiste, um das Ziel in Release und x86 zu ändern.
    • Klicken Sie auf den Pfeil neben Lokaler Computer , und wählen Sie Gerät aus, das auf HoloLens bereitgestellt werden soll.
    • Klicken Sie auf den Pfeil neben Gerät , und wählen Sie Lokaler Computer aus, um sie für das Mixed Reality-Headset bereitzustellen.
    • Klicken Sie auf Debuggen ohne> Debuggen starten oder auf CTRL+F5 , um die Anwendung zu starten.

Untersuchen des Codes

Navigieren Sie im Projektbereich zu Assets\HoloToolkit\Input\Scripts\Utilities , und doppelklicken Sie auf MixedRealityCameraManager.cs , um es zu öffnen.

Übersicht: MixedRealityCameraManager.cs ist ein einfaches Skript, das die Qualitätsstufe und die Hintergrundeinstellungen basierend auf dem Gerät anpasst. Der Schlüssel hierfür ist HolographicSettings.IsDisplayOpaque, mit dem ein Skript erkennen kann, ob es sich bei dem Gerät um eine HoloLens (IsDisplayOpaque gibt false) oder ein immersives Headset (IsDisplayOpaque gibt true zurück).

Genießen Sie Ihren Fortschritt

An diesem Punkt rendert die Anwendung nur ein Hologramm. Wir werden dem Hologramm später eine Interaktion hinzufügen. Beide Geräte rendern das Hologramm gleich. Das immersive Headset rendert auch einen blauen Himmels- und Wolkenhintergrund.

Kapitel 2 : Interaktion

Ziele

Zeigen Sie, wie Eingaben für eine Windows Mixed Reality-Anwendung behandelt werden.

Was wir erstellen werden

Aufbauend auf der Anwendung aus Kapitel 1 fügen wir Funktionen hinzu, die es dem Benutzer ermöglichen, das Hologramm auf einer realen Oberfläche in HoloLens oder auf einem virtuellen Tisch in einem immersiven Headset zu platzieren.

Eingabeaktualisierung: Bei HoloLens ist die Auswahlgeste das Tippen in die Luft. Bei immersiven Headsets verwenden wir die A-Taste am Xbox-Controller. Weitere Informationen finden Sie in der Übersicht über das Interaktionsmodell.

Schritte

  • Hinzufügen des Eingabe-Managers
    • Aus HoloToolkit > Input > Prefabs ziehen Sie InputManager als untergeordnetes Element von Managern in die Hierarchie.
    • Aus HoloToolkit > Input > Prefabs > Cursor ziehen Sie den Cursor in die Hierarchie.
  • Hinzufügen einer räumlichen Zuordnung
    • Ziehen Sie aus HoloToolkit > SpatialMapping > PrefabsSpatialMapping in Hierarchy.
  • Hinzufügen eines virtuellen Playspaces
    • Erweitern Sie unter Hierarchieden Eintrag MixedRealityCameraParent und wählen Sie Grenze aus.
    • Aktivieren Sie im Inspektorbereich das Kontrollkästchen, um Grenze zu aktivieren .
    • Ziehen Sie VRRoom aus AppPrefabs in die Hierarchie.
  • Hinzufügen von WorldAnchorManager
    • Wählen Sie unter Hierarchiedie Option Manager aus.
    • Klicken Sie im Inspektor auf Komponente hinzufügen.
    • Geben Sie World Anchor Manager ein.
    • Wählen Sie World Anchor Manager aus, um ihn hinzuzufügen.
  • Hinzufügen von TapToPlace zur Insel
    • Erweitern Sie unter Hierarchie den Eintrag Insel.
    • Wählen Sie MixedRealityLand aus.
    • Klicken Sie im Inspektor auf Komponente hinzufügen.
    • Geben Sie Tap To Place ein, und wählen Sie ihn aus.
    • Aktivieren Sie "Übergeordnetes Element beim Tippen platzieren".
    • Legen Sie Platzierungsoffset auf (0, 0,1, 0) fest.
  • Speichern und Erstellen wie zuvor

Untersuchen des Codes

Skript 1: GamepadInput.cs

Navigieren Sie im Projektbereich zu Assets\HoloToolkit\Input\Scripts\InputSources , und doppelklicken Sie auf GamepadInput.cs , um es zu öffnen. Doppelklicken Sie im Projektbereich im selben Pfad auch auf InteractionSourceInputSource.cs.

Beachten Sie, dass beide Skripts über die gemeinsame Basisklasse BaseInputSource verfügen.

BaseInputSource behält einen Verweis auf einen InputManager bei, der es einem Skript ermöglicht, Ereignisse auszulösen. In diesem Fall ist das InputClicked-Ereignis relevant. Dies ist wichtig zu beachten, wenn wir mit Skript 2, TapToPlace, beginnen. Im Fall von GamePadInput rufen wir die Schaltfläche A auf dem Controller ab, die gedrückt werden soll, und lösen dann das InputClicked-Ereignis aus. Im Fall von InteractionSourceInputSource lösen wir das InputClicked-Ereignis als Reaktion auf das TappedEvent aus.

Skript 2: TapToPlace.cs

Navigieren Sie im Projektbereich zu Assets\HoloToolkit\SpatialMapping\Scripts , und doppelklicken Sie auf TapToPlace.cs , um es zu öffnen.

Das erste, was viele Entwickler beim Erstellen einer Holographic-Anwendung implementieren möchten, ist das Verschieben von Hologrammen mit Gesteneingaben. Daher haben wir uns bemüht, dieses Skript gründlich zu kommentieren. In diesem Tutorial sollten einige Dinge hervorgehoben werden.

Beachten Sie zunächst, dass TapToPlace IInputClickHandler implementiert. IInputClickHandler macht die Funktionen verfügbar, die das InputClicked-Ereignis behandeln, das von GamePadInput.cs oder InteractionSourceInputSource.cs ausgelöst wird. OnInputClicked wird aufgerufen, wenn eine BaseInputSource einen Klick erkennt, während sich das Objekt mit TapToPlace im Fokus befindet. Das Ereignis wird entweder durch Airtapping auf HoloLens oder durch Drücken der A-Taste auf dem Xbox-Controller ausgelöst.

Zweitens wird der Code im Update ausgeführt, um zu sehen, ob eine Oberfläche betrachtet wird, damit wir das Spielobjekt wie einen Tisch auf einer Oberfläche platzieren können. Das immersive Headset verfügt nicht über ein Konzept von realen Oberflächen, sodass das Objekt, das die Tischplatte (Vroom > TableThingy > Cube) darstellt, mit der SpatialMapping-Physikebene markiert wurde, sodass der Strahlguss in Update mit der virtuellen Tischplatte kollidiert.

Genießen Sie Ihren Fortschritt

Dieses Mal können Sie die Insel auswählen, um sie zu verschieben. Auf HoloLens können Sie die Insel auf eine echte Oberfläche verschieben. Im immersiven Headset können Sie die Insel an den virtuellen Tisch verschieben, den wir hinzugefügt haben.

Kapitel 3: Freigeben

Ziele

Stellen Sie sicher, dass das Netzwerk ordnungsgemäß konfiguriert ist, und geben Sie an, wie Raumanker zwischen Geräten gemeinsam genutzt werden.

Was wir erstellen werden

Wir konvertieren unser Projekt in ein Multiplayer-Projekt. Wir fügen Ui und Logik hinzu, um Sitzungen zu hosten oder daran teilzunehmen. HoloLens-Benutzer sehen sich in der Sitzung mit Clouds über dem Kopf, und immersive Headset-Benutzer haben Clouds in der Nähe des Ankers. Benutzer in den immersiven Headsets sehen die HoloLens-Benutzer relativ zum Ursprung der Szene. HoloLens-Benutzer sehen das Hologramm der Insel am selben Ort. Es ist wichtig zu beachten, dass die Benutzer in den immersiven Headsets während dieses Kapitels nicht auf der Insel sein werden, sondern sich sehr ähnlich wie HoloLens verhalten, mit einer Vogelperspektive der Insel.

Schritte

  • Entfernen von Island und VRRoom
    • Klicken Sie in der Hierarchie mit der rechten Maustaste auf Insel auf Löschen.
    • Klicken Sie in der Hierarchie mit der rechten Maustaste auf VRRoom , und wählen Sie Löschen aus.
  • Usland hinzufügen
    • Ziehen Sie Usland aus AppPrefabs in die Hierarchie.
  • Ziehen Sie aus AppPrefabs jede der folgenden Elemente in die Hierarchie:
    • UNETSharingStage
    • UNetAnchorRoot
    • UIContainer
    • DebugPanelButton
  • Speichern und Erstellen wie zuvor

Untersuchen des Codes

Navigieren Sie im Projektbereich zu Assets\AppPrefabs\Support\SharingWithUnet\Scripts , und doppelklicken Sie auf UnetAnchorManager.cs. Die Möglichkeit, dass eine HoloLens Tracking-Informationen mit einer anderen HoloLens gemeinsam nutzen kann, sodass beide Geräte denselben Raum gemeinsam nutzen können, ist nahezu magisch. Die Leistungsfähigkeit von Mixed Reality wird lebendig, wenn zwei oder mehr Personen mit den gleichen digitalen Daten zusammenarbeiten können.

In diesem Skript sollten Sie auf einige Punkte hinweisen:

Beachten Sie in der Startfunktion die Überprüfung auf IsDisplayOpaque. In diesem Fall geben wir vor, dass der Anker eingerichtet ist. Dies liegt daran, dass die immersiven Headsets keine Möglichkeit zum Importieren oder Exportieren von Ankern verfügbar machen. Wenn wir jedoch auf einer HoloLens ausführen, implementiert dieses Skript die Freigabeanker zwischen den Geräten. Das Gerät, das die Sitzung startet, erstellt einen Anker für den Export. Das Gerät, das einer Sitzung beitritt, fordert den Anker von dem Gerät an, das die Sitzung gestartet hat.

Exportieren:

Wenn ein Benutzer eine Sitzung erstellt, ruft NetworkDiscoveryWithAnchors die CreateAnchor-Funktion UNETAnchorManagers auf. Folgen wir dem CreateAnchor-Flow.

Wir beginnen mit einigen Housekeepings und löschen alle Daten, die wir möglicherweise für vorherige Anker gesammelt haben. Anschließend überprüfen wir, ob ein zwischengespeicherter Anker zum Laden vorhanden ist. Die Ankerdaten betragen in der Regel zwischen 5 und 20 MB, sodass die Wiederverwendung von zwischengespeicherten Ankern die Menge an Daten sparen kann, die wir über das Netzwerk übertragen müssen. Wir werden später sehen, wie dies funktioniert. Selbst wenn wir den Anker wiederverwenden, müssen wir die Ankerdaten vorbereiten, falls ein neuer Client nicht über den Anker verfügt.

Apropos Vorbereiten der Ankerdaten: Die WorldAnchorTransferBatch-Klasse macht die Funktionalität zum Vorbereiten von Ankerdaten für das Senden an ein anderes Gerät oder eine andere Anwendung und die Funktionalität zum Importieren der Ankerdaten verfügbar. Da wir uns im Exportpfad befinden, fügen wir unseren Anker dem WorldAnchorTransferBatch hinzu und rufen die ExportAsync-Funktion auf. ExportAsync ruft dann den WriteBuffer-Rückruf auf, während Daten für den Export generiert werden. Wenn alle Daten exportiert wurden, wird ExportComplete aufgerufen. In WriteBuffer fügen wir den Datenblock zu einer Liste hinzu, die wir für den Export aufbewahren. In ExportComplete konvertieren wir die Liste in ein Array. Die Variable AnchorName ist ebenfalls festgelegt, wodurch andere Geräte ausgelöst werden, den Anker anzufordern, wenn sie ihn nicht besitzen.

In einigen Fällen exportiert der Anker nicht oder erstellt so wenig Daten, dass wir es erneut versuchen. Hier rufen wir einfach createAnchor erneut auf.

Eine letzte Funktion im Exportpfad ist AnchorFoundRemotely. Wenn ein anderes Gerät den Anker findet, teilt dieses Gerät dem Host mit, und der Host verwendet dies als Signal, dass der Anker ein "guter Anker" ist und zwischengespeichert werden kann.

Importieren:

Wenn eine HoloLens einer Sitzung beitritt, muss sie einen Anker importieren. In der Update-Funktion von UNETAnchorManager wird der AnchorName abgefragt. Wenn sich der Ankername ändert, beginnt der Importvorgang. Zunächst versuchen wir, den Anker mit dem angegebenen Namen aus dem lokalen Ankerspeicher zu laden. Wenn es bereits vorhanden ist, können wir es verwenden, ohne die Daten erneut herunterzuladen. Wenn sie nicht vorhanden ist, rufen wir WaitForAnchor auf, das den Download initiiert.

Wenn der Download abgeschlossen ist, wird NetworkTransmitter_dataReadyEvent aufgerufen. Dadurch wird der Update-Schleife signalisiert, ImportAsync mit den heruntergeladenen Daten aufzurufen. ImportAsync ruft ImportComplete auf, wenn der Importvorgang abgeschlossen ist. Wenn der Import erfolgreich ist, wird der Anker im lokalen Playerspeicher gespeichert. PlayerController.cs ruft AnchorFoundRemotely tatsächlich auf, um den Host darüber zu informieren, dass ein guter Anker eingerichtet wurde.

Genießen Sie Ihren Fortschritt

Dieses Mal hostet ein Benutzer mit holoLens eine Sitzung mithilfe der Schaltfläche "Sitzung starten " auf der Benutzeroberfläche. Andere Benutzer, sowohl in HoloLens als auch in einem immersiven Headset, wählen die Sitzung und dann die Schaltfläche "Sitzung beitreten " auf der Benutzeroberfläche aus. Wenn Sie mehrere Personen mit HoloLens-Geräten haben, haben sie rote Wolken über den Köpfen. Es wird auch eine blaue Wolke für jedes immersive Headset geben, aber die blauen Wolken werden nicht über den Headsets liegen, da die Headsets nicht versuchen, denselben Weltkoordinatenraum wie die HoloLens-Geräte zu finden.

Dieser Punkt im Projekt ist eine eigenständige Freigabeanwendung. Es ist nicht sehr viel und könnte als Basis dienen. In den nächsten Kapiteln beginnen wir damit, ein Erlebnis zu erstellen, das die Menschen genießen können. Weitere Anleitungen zum Design gemeinsamer Erfahrungen finden Sie hier.

Kapitel 4 : Eintauchen und Teleportieren

Ziele

Sorgen Sie für das Erlebnis für jeden Mixed Reality-Gerättyp.

Was wir erstellen werden

Wir werden die Anwendung aktualisieren, um immersive Headset-Benutzer auf der Insel mit einer immersiven Ansicht zu platzieren. HoloLens-Benutzer haben weiterhin die Vogelperspektive auf die Insel. Benutzer jedes Gerätetyps können andere Benutzer sehen, wie sie in der Welt angezeigt werden. Für instance, immersive Headset-Benutzer können die anderen Avatare auf anderen Wegen auf der Insel sehen, und sie sehen die HoloLens-Benutzer als riesige Wolken über der Insel. Immersive Headset-Benutzer sehen auch den Cursor des HoloLens-Benutzers, wenn der HoloLens-Benutzer die Insel betrachtet. HoloLens-Benutzer sehen einen Avatar auf der Insel, der jeden immersiven Headset-Benutzer darstellt.

Eingabe für das immersive Gerät aktualisiert:

  • Der linke Stoßfänger und die rechten Stoßfängertasten auf dem Xbox-Controller drehen den Spieler
  • Wenn Sie die Y-Taste auf dem Xbox-Controller halten, wird ein Teleportcursor aktiviert. Wenn der Cursor beim Loslassen der Schaltfläche Y über eine sich drehende Pfeilanzeige verfügt, werden Sie an die Position des Cursors teleportiert.

Schritte

  • Hinzufügen von MixedRealityTeleport zu MixedRealityCameraParent
    • Wählen Sie unter Hierarchiedie Option Usland aus.
    • Aktivieren Sie in Inspectordie Ebenensteuerung.
    • Wählen Sie unter Hierarchiedie Option MixedRealityCameraParent aus.
    • Klicken Sie in Inspector auf Komponente hinzufügen.
    • Geben Sie Mixed Reality Teleport ein, und wählen Sie sie aus.

Untersuchen des Codes

Immersive Headset-Benutzer werden mit einem Kabel an ihre PCs angebunden, aber unsere Insel ist größer als das Kabel ist lang. Zum Ausgleich benötigen wir die Möglichkeit, die Kamera unabhängig von der Bewegung des Benutzers zu bewegen. Weitere Informationen zum Entwerfen Ihrer Mixed Reality-Anwendung (insbesondere Eigenbewegung und Fortbewegung) finden Sie auf der Komfortseite .

Um diesen Prozess zu beschreiben, ist es hilfreich, zwei Begriffe zu definieren. Zunächst ist dolly das Objekt, das die Kamera unabhängig vom Benutzer bewegt. Ein untergeordnetes Spielobjekt des Dolly ist die Standard Kamera. Die Standard Kamera ist am Kopf des Benutzers angebracht.

Navigieren Sie im Projektbereich zu Assets\AppPrefabs\Support\Scripts\GameLogic , und doppelklicken Sie auf MixedRealityTeleport.cs.

MixedRealityTeleport verfügt über zwei Aufträge. Zunächst übernimmt es die Drehung mithilfe der Stoßfänger. In der Updatefunktion wird "ButtonUp" für LeftBumper und RightBumper abgefragt. GetButtonUp gibt nur true zurück, wenn eine Schaltfläche nach dem Down im ersten Frame aktiviert ist. Wenn eine Schaltfläche ausgelöst wurde, wissen wir, dass der Benutzer rotieren muss.

Wenn wir rotieren, führen wir ein Aus- und Einblenden mithilfe eines einfachen Skripts namens "Fade Control" durch. Wir tun dies, um zu verhindern, dass der Benutzer eine unnatürliche Bewegung sieht, die zu Unbehagen führen kann. Der Ein- und Ausblendeffekt ist ziemlich einfach. Vor der Standard Kamera hängt ein schwarzes Quad. Beim Ausblenden wird der Alphawert von 0 auf 1 umgestellt. Dies bewirkt nach und nach, dass die schwarzen Pixel des Quads alles hinter ihnen rendern und verdecken. Beim Einblenden wird der Alphawert wieder auf 0 umgestellt.

Wenn wir die Drehung berechnen, beachten Sie, dass wir unseren Dolly drehen, aber die Drehung um die Standard Kamera berechnen. Dies ist wichtig, denn je weiter die Standard Kamera von 0,0,0 entfernt ist, desto weniger genau würde eine Drehung um den Dolly aus Sicht des Benutzers werden. Wenn Sie sich nicht um die Kameraposition drehen, bewegt sich der Benutzer in einem Bogen um den Dolly , anstatt sich zu drehen.

Der zweite Auftrag für MixedRealityTeleport besteht darin, das Verschieben des Dollys zu behandeln. Dies geschieht in SetWorldPosition. SetWorldPosition nimmt die gewünschte Weltposition ein, die Position, an der der Benutzer erkennen möchte, dass er lebt. Wir müssen unseren Dolly an dieser Position abzüglich der lokalen Position der Standard Kamera platzieren, da dieser Offset bei jedem Frame hinzugefügt wird.

Ein zweites Skript ruft SetWorldPosition auf. Sehen wir uns dieses Skript an. Navigieren Sie im Projektbereich zu Assets\AppPrefabs\Support\Scripts\GameLogic , und doppelklicken Sie auf TeleportScript.cs.

Dieses Skript ist etwas mehr involviert als MixedRealityTeleport. Das Skript überprüft, ob die Y-Taste auf dem Xbox-Controller gedrückt gehalten wird. Während die Schaltfläche gedrückt gehalten wird, wird ein Teleportcursor gerendert, und das Skript wirft einen Strahl aus der Blickposition des Benutzers. Wenn dieser Strahl mit einer Oberfläche kollidiert, die mehr oder weniger nach oben zeigt, wird die Oberfläche als gute Oberfläche zum Teleportieren betrachtet, und die Animation auf dem Teleportcursor wird aktiviert. Wenn der Strahl nicht mit einer mehr oder weniger nach oben zeigenden Oberfläche kollidiert, wird die Animation auf dem Cursor deaktiviert. Wenn die Schaltfläche Y freigegeben wird und der berechnete Punkt des Strahls eine gültige Position ist, ruft das Skript SetWorldPosition mit der Position auf, an der sich der Strahl überschneiden hat.

Genießen Sie Ihren Fortschritt

Dieses Mal müssen Sie einen Freund finden.

Erneut hostet ein Benutzer mit der HoloLens eine Sitzung. Andere Benutzer nehmen an der Sitzung teil. Die Anwendung platziert die ersten drei Benutzer, die von einem immersiven Headset aus teilnehmen, auf einem der drei Pfade der Insel. In diesem Abschnitt können Sie die Insel erkunden.

Details zu beachten:

  1. Sie können Gesichter in den Clouds sehen, sodass ein eingetauchter Benutzer erkennen kann, welche Richtung ein HoloLens-Benutzer sucht.
  2. Die Avatare auf der Insel haben Hälse, die sich drehen. Sie werden nicht folgen, was der Benutzer tut, ist die realitätsnahe Realität (wir haben diese Informationen nicht), aber es sorgt für eine schöne Erfahrung.
  3. Wenn der HoloLens-Benutzer die Insel betrachtet, können die eingetauchten Benutzer ihren Cursor sehen.
  4. Die Clouds, die die HoloLens-Benutzer darstellen, werfen Schatten.

Kapitel 5 – Finale

Ziele

Erstellen Sie eine interaktive Zusammenarbeit zwischen den beiden Gerätetypen.

Was wir erstellen werden

Wenn ein Benutzer mit einem immersiven Headset in die Nähe eines Puzzles auf der Insel gelangt, erhalten die HoloLens-Benutzer nach Kapitel 4 einen Tooltipp mit einem Hinweis auf das Puzzle. Sobald alle immersiven Headset-Benutzer ihre Puzzles hinter sich lassen und auf das "Ready Pad" im Raketenraum gelangen, wird die Rakete starten.

Schritte

  • Wählen Sie unter Hierarchiedie Option Usland aus.
  • Aktivieren Sie unter Inspektor unter Ebenensteuerungdie Option Zusammenarbeit aktivieren.

Untersuchen des Codes

Sehen wir uns nun LevelControl.cs an. Dieses Skript ist der Kern der Spiellogik und behält den Spielzustand bei. Da es sich um ein Multiplayer-Spiel mit UNET handelt, müssen wir den Datenfluss verstehen, zumindest gut genug, um dieses Tutorial zu ändern. Eine vollständigere Übersicht über UNET finden Sie in der Unity-Dokumentation.

Navigieren Sie im Projektbereich zu Assets\AppPrefabs\Support\Scripts\GameLogic , und doppelklicken Sie auf LevelControl.cs.

Lassen Sie uns verstehen, wie ein immersives Headset anzeigt, dass es für den Raketenstart bereit ist. Die Raketenstartbereitschaft wird durch Festlegen eines von drei Bools in einer Liste von Bools kommuniziert, die den drei Pfaden auf der Insel entsprechen. Der Bool eines Pfads wird festgelegt, wenn sich der dem Pfad zugewiesene Benutzer auf dem braunen Pad im Raketenraum befindet. Okay, jetzt zu den Details.

Wir beginnen mit der Update()-Funktion. Sie werden feststellen, dass es eine "Cheat"-Funktion gibt. Wir haben dies in der Entwicklung verwendet, um den Raketenstart und die Rücksetzungssequenz zu testen. Dies funktioniert nicht in der Multi-Benutzeroberfläche. Wenn Sie die folgende Infromation verinnerlichen, können Sie es hoffentlich zum Funktionieren bringen. Nachdem wir überprüft haben, ob wir betrügen sollten, überprüfen wir, ob der lokale Spieler eingetaucht ist. Wir möchten uns darauf konzentrieren, wie wir feststellen, dass wir am Ziel sind. Innerhalb der If-Überprüfung (Immersed) gibt es einen Aufruf von CheckGoal, der sich hinter dem EnableCollaboration-Bool versteckt. Dies entspricht dem Kontrollkästchen, das Sie beim Ausführen der Schritte für dieses Kapitel aktiviert haben. Innerhalb von EnableCollaboration wird ein Aufruf von CheckGoal() angezeigt.

CheckGoal führt einige Berechnungen durch, um zu sehen, ob wir mehr oder weniger auf dem Pad stehen. Wenn wir sind, debug.Log "Am Ziel angekommen" und dann "SendAtGoalMessage()". In SendAtGoalMessage nennen wir playerController.SendAtGoal. Um Zeit zu sparen, sehen Sie sich den folgenden Code an:

private void CmdSendAtGoal(int GoalIndex)
{
    levelState.SetGoalIndex(GoalIndex);
}
public void SendAtGoal(int GoalIndex)
{
    if (isLocalPlayer)
    {
        Debug.Log("sending at goal " + GoalIndex);
        CmdSendAtGoal(GoalIndex);
    }
}

Beachten Sie, dass SendAtGoalMessage CmdSendAtGoal aufruft, wodurch levelState.SetGoalIndex aufgerufen wird, das sich wieder in LevelControl.cs befindet. Auf den ersten Blick erscheint das seltsam. Warum nicht einfach SetGoalIndex anstelle dieses seltsamen Routings über den Playercontroller aufrufen? Der Grund ist, dass wir dem Datenmodell entsprechen, das UNET verwendet, um Daten synchron zu halten. Um Cheating und Thrashing zu verhindern, erfordert UNET, dass jedes Objekt über einen Benutzer verfügt, der über die Berechtigung verfügt, die synchronisierten Variablen zu ändern. Darüber hinaus kann nur der Host (der Benutzer, der die Sitzung gestartet hat) Daten direkt ändern. Benutzer, die nicht der Host sind, aber über Autorität verfügen, müssen einen "Befehl" an den Host senden, der die Variable ändert. Standardmäßig verfügt der Host über Autorität für alle Objekte, mit Ausnahme des Objekts, das erstellt wurde, um den Benutzer darzustellen. In unserem Fall verfügt dieses Objekt über das Playercontroller-Skript. Es gibt eine Möglichkeit, Autorität für ein Objekt anzufordern und dann Änderungen vorzunehmen, aber wir entscheiden uns dafür, die Tatsache zu nutzen, dass der Spielercontroller über Selbstautorität verfügt und Befehle über den Spielercontroller weitergibt.

Anders gesagt, wenn wir uns bei unserem Ziel gefunden haben, muss der Spieler es dem Gastgeber sagen, und der Gastgeber wird es allen anderen sagen.

Zurück in LevelControl.cs sehen Sie sich SetGoalIndex an. Hier legen wir den Wert eines Werts in einer Synchronisierungsliste (AtGoal) fest. Denken Sie daran, dass wir uns dabei im Kontext des Hosts befinden. Ähnlich wie bei einem Befehl kann der Host einen RPC-Code ausführen, der dazu führt, dass alle Clients Code ausführen. Hier nennen wir "RpcCheckAllGoals". Jeder Client überprüft einzeln, ob alle drei AtGoals festgelegt sind, und wenn ja, startet die Rakete.

Genießen Sie Ihren Fortschritt

Aufbauend auf dem vorherigen Kapitel beginnen wir die Sitzung wie zuvor. Wenn die Benutzer des immersiven Headsets zur "Tür" auf ihrem Pfad gelangen, wird eine QuickInfo angezeigt, die nur die HoloLens-Benutzer sehen können. Die HoloLens-Benutzer sind für die Kommunikation dieses Hinweises an die Benutzer im immersiven Headset verantwortlich. Die Rakete wird in den Weltraum starten, sobald jeder Avatar auf seine entsprechende braune Pad im Vulkan getreten ist. Die Szene wird nach 60 Sekunden zurückgesetzt, sodass Sie dies erneut tun können.

Weitere Informationen