MR-Freigabe 250: HoloLens und immersive HeadsetsMR Sharing 250: HoloLens and immersive headsets

Hinweis

Die Tutorials der Mixed Reality Academy wurden im Hinblick auf HoloLens (1. Gen.) und immersive Mixed Reality-Headsets entworfen.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. 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.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Diese Tutorials werden nicht mit den neuesten Toolsets oder Interaktionen aktualisiert, die für HoloLens 2 verwendet werden.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Sie werden gewartet, um weiterhin auf den unterstützten Geräten zu funktionieren.They will be maintained to continue working on the supported devices. Es wurde eine neue Reihe von Tutorials für HoloLens 2 veröffentlicht.A new series of tutorials has been posted for HoloLens 2.

Mit der Flexibilität von universelle Windows-Plattform (UWP) ist es einfach, eine Anwendung zu erstellen, die mehrere Geräte umfasst.With the flexibility of Universal Windows Platform (UWP), it is easy to create an application that spans multiple devices. Mit dieser Flexibilität können wir Umgebungen erstellen, die die Stärken der einzelnen Geräte nutzen.With this flexibility, we can create experiences that leverage the strengths of each device. Dieses Tutorial behandelt eine grundlegende freigegebene Darstellung, die auf hololens und Windows Mixed Reality-immersiven Headsets ausgeführt wird.This tutorial will cover a basic shared experience that runs on both HoloLens and Windows Mixed Reality immersive headsets. Dieser Inhalt wurde ursprünglich auf der Microsoft Build 2017-Konferenz in Seattle, WA, bereitgestellt.This content was originally delivered at the Microsoft Build 2017 conference in Seattle, WA.

In diesem Lernprogramm wird Folgendes beschrieben:In this tutorial, we will:

  • Richten Sie ein Netzwerk mithilfe von uNet ein.Setup a network using UNET.
  • Freigeben von holograms auf gemischten Reality-Geräten.Share holograms across mixed reality devices.
  • Richten Sie abhängig davon, welches gemischte Reality-Gerät verwendet wird, eine andere Ansicht der Anwendung ein.Establish a different view of the application depending on which mixed reality device is being used.
  • Sorgen Sie für eine gemeinsame Nutzung, bei der hololens-Benutzer über einige einfache Rätsel mit den Benutzer in der Hand arbeiten.Create a shared experience where HoloLens users guide immersive headsets users through some simple puzzles.

GeräteunterstützungDevice support

KursCourse HoloLensHoloLens Immersive HeadsetsImmersive headsets
MR-Freigabe 250: HoloLens und immersive HeadsetsMR Sharing 250: HoloLens and immersive headsets ✔️✔️ ✔️✔️

VorbereitungBefore you start

VoraussetzungenPrerequisites

ProjektdateienProject files

Hinweis

Wenn Sie den Quellcode vor dem herunterladen durchsuchen möchten, ist er auf GitHub verfügbar.If you want to look through the source code before downloading, it's available on GitHub.

Kapitel 1-Holo WorldChapter 1 - Holo World

ZieleObjectives

Stellen Sie sicher, dass die Entwicklungsumgebung mit einem einfachen Projekt fertig ist.Make sure the development environment is ready to go with a simple project.

BuildWhat we will build

Eine Anwendung, die ein – Hologramm für hololens oder ein Windows Mixed Reality-immersives Headset anzeigt.An application that shows a hologram on either HoloLens or a Windows Mixed Reality immersive headset.

SchritteSteps

  • Öffnen Sie Unity.Open Unity.
    • Wählen Sie Open(Öffnen).Select Open.
    • Navigieren Sie dorthin, wo Sie die Projektdateien extrahiert haben.Navigate to where you extracted the project files.
    • Klicken Sie auf Ordner auswählen.Click Select Folder.
    • Es dauert einige Zeit, bis Unity das Projekt erstmalig verarbeitet.It will take a little while for Unity to process the project the first time.
  • Überprüfen Sie, ob gemischte Realität in Unity aktiviert ist.Check that Mixed Reality is enabled in Unity.
    • Öffnen Sie das Dialogfeld "Buildeinstellungen" (STRG +UMSCHALT + B oder Datei > Erstellen von Einstellungen...).Open the build settings dialog (Control+Shift+B or File > Build Settings...).
    • Wählen Sie universelle Windows-Plattform klicken Sie dann auf Plattform wechseln.Select Universal Windows Platform then click Switch Platform.
    • Wählen Sie >Player Einstellungen bearbeiten aus.Select Edit>Player Settings.
    • Erweitern Sie im Bereich Inspector auf der rechten Seite die Option XR-Einstellungen.In the Inspector panel on the right hand side, expand XR Settings.
    • Aktivieren Sie das Kontrollkästchen virtuelle Realität unterstützt .Check the Virtual Reality Supported box.
    • Windows Mixed Reality sollte das Virtual Reality SDK sein.Windows Mixed Reality should be the Virtual Reality SDK.
  • Erstellen Sie eine Szene.Create a scene.
    • Klicken Sie in der Hierarchie mit der rechten Maustaste auf Hauptkamera Löschen.In the Hierarchy right click Main Camera select Delete.
    • Aus holotoolkit > Eingabe > Prefabs mixedrealitycameraparent in die Hierarchie ziehen.From HoloToolkit > Input > Prefabs drag MixedRealityCameraParent to the Hierarchy.
  • Hinzufügen von holograms zur SzeneAdd Holograms to the scene
    • Ziehen Sie in appprefabs Skybox in die Ansicht Szene.From AppPrefabs drag Skybox to the Scene View.
    • Aus appprefabs ziehen Sie Manager in die Hierarchie.From AppPrefabs drag Managers to the Hierarchy.
    • Ziehen Sie die Insel von appprefabs auf die- Hierarchie.From AppPrefabs drag Island to the Hierarchy.
  • Speichern und erstellenSave And build
    • Speichern (entweder Control + S oder File > Szene speichern)Save (either Control+S or File > Save Scene)
    • Da es sich um eine neue Szene handelt, müssen Sie diese benennen.Since this is a new scene, you'll need to name it. Der Name ist nicht wichtig, aber wir verwenden sharedmixedreality.Name doesn't matter, but we use SharedMixedReality.
  • In Visual Studio exportierenExport To Visual Studio
    • Öffnen Sie das Menü "Build" (STRG +UMSCHALT + B oder Datei > Buildeinstellungen).Open the build menu (Control+Shift+B or File > Build Settings)
    • Klicken Sie auf offene Szenen hinzufügen.Click Add Open Scenes.
    • Überprüfen von Unity c#-ProjektenCheck Unity C# Projects
    • Klicken Sie auf Erstellen.Click Build.
    • Erstellen Sie im daraufhin angezeigten Fenster "Datei-Explorer" einen neuen Ordner mit dem Namen " App".In the file explorer window that appears, create a New Folder named App.
    • Klicken Sie einfach auf den App -Ordner.Single click the App folder.
    • Drücken Sie Ordner auswählen.Press Select Folder.
    • Warten Sie, bis der Build beendet wurde.Wait for the build to complete
    • Navigieren Sie im Datei-Explorer-Fenster, das angezeigt wird, in den App -Ordner.In the file explorer window that appears, navigate into the App folder.
    • Doppelklicken Sie auf sharedmixedreality. sln , um Visual Studio zu starten.Double-click SharedMixedReality.sln to launch Visual Studio
  • Build aus Visual StudioBuild From Visual Studio
    • Verwenden des oberen Symbolleisten-Änderungs Ziels für Release und x86.Using the top toolbar change target to Release and x86.
    • Klicken Sie auf den Pfeil neben lokaler Computer , und wählen Sie Gerät für die Bereitstellung in hololens aus.Click the arrow next to Local Machine and select Device to deploy to HoloLens
    • Klicken Sie auf den Pfeil neben Gerät , und wählen Sie lokaler Computer für die Bereitstellung für das Mixed Reality-Headset aus.Click the arrow next to Device and select Local Machine to deploy for the mixed reality headset.
    • Klicken Sie auf Debuggen >starten ohne Debuggen oder Steuern + F5 , um die Anwendung zu starten.Click Debug->Start Without Debugging or Control+F5 to start the application.

Durchforsten des CodesDigging into the code

Navigieren Sie im Projekt Panel zu asset\holotoolkit\input\script\utilities , und doppelklicken Sie auf MixedRealityCameraManager.cs , um es zu öffnen.In the project panel, navigate to Assets\HoloToolkit\Input\Scripts\Utilities and double click MixedRealityCameraManager.cs to open it.

Übersicht: MixedRealityCameraManager.cs ist ein einfaches Skript, das Qualitäts-und Hintergrundeinstellungen basierend auf dem Gerät anpasst.Overview: MixedRealityCameraManager.cs is a simple script that adjusts quality level and background settings based on the device. Schlüssel hier ist holographicsettings. isdisplaytransparent, mit dem ein Skript erkennen kann, ob es sich bei dem Gerät um einen hololens handelt (isdisplayopaque gibt false zurück), oder ein immersives Headset (isdisplayopaque gibt true zurück).Key here is HolographicSettings.IsDisplayOpaque, which allows a script to detect if the device is a HoloLens (IsDisplayOpaque returns false) or an immersive headset (IsDisplayOpaque returns true).

Nutzen Sie Ihren FortschrittEnjoy your progress

An diesem Punkt wird nur ein Hologram von der Anwendung erstellt.At this point the application will just render a hologram. Wir werden dem – Hologramm später eine Interaktion hinzufügen.We will add interaction to the hologram later. Beide Geräte erzeugen das – Hologramm gleich.Both devices will render the hologram the same. Das immersive Headset gibt auch einen blauen Himmel und Clouds-Hintergrund aus.The immersive headset will also render a blue sky and clouds background.

Kapitel 2: InteraktionChapter 2 - Interaction

ZieleObjectives

Zeigt, wie Eingaben für eine Windows Mixed Reality-Anwendung behandelt werden.Show how to handle input for a Windows Mixed Reality application.

BuildWhat we will build

Auf der Grundlage der Anwendung aus Kapitel 1 fügen wir Funktionen hinzu, die es dem Benutzer ermöglichen, das Hologramm zu übernehmen und es auf der realen Oberfläche in hololens oder einer virtuellen Tabelle in einem immersiven Headset zu platzieren.Building on the application from chapter 1, we will add functionality to allow the user to pick up the hologram and place it on a real world surface in HoloLens or on a virtual table in an immersive headset.

Eingabe Auffrischung: Bei hololens ist die Auswahl Geste die Luftlinie.Input Refresher: On HoloLens the select gesture is the air tap. Bei immersiven Headsets verwenden wir die Schaltfläche A auf dem Xbox-Controller.On immersive headsets, we will use the A button on the Xbox controller. Weitere Informationen finden Sie in der Übersicht über das Interaktionsmodell.For more information check out the interaction model overview.

SchritteSteps

  • Eingabe-Manager hinzufügenAdd Input manager
    • Aus holotoolkit > Eingabe > Prefabs als untergeordnetes Element von Vorgesetzten in die Hierarchie ziehen.From HoloToolkit > Input > Prefabs drag InputManager to Hierarchy as a child of Managers.
    • Aus holotoolkit > Eingabe > präfabs > Cursor Cursor in die Hierarchie ziehen.From HoloToolkit > Input > Prefabs > Cursor drag Cursor to Hierarchy.
  • Räumliche Zuordnung hinzufügenAdd Spatial Mapping
    • Aus holotoolkit > spatialmapping > Prefabs spatialmapping in die Hierarchie ziehen.From HoloToolkit > SpatialMapping > Prefabs drag SpatialMapping to Hierarchy.
  • Virtuellen Playspace hinzufügenAdd Virtual Playspace
    • Erweitern Sie in Hierarchie den Knoten mixedrealitycameraparent Select Boundary .In Hierarchy expand MixedRealityCameraParent select Boundary
    • Aktivieren Sie im Inspektor -Panel das Kontrollkästchen zum Aktivieren der Grenze .In Inspector panel check the box to enable Boundary
    • Ziehen Sie in appprefabs vrroom auf Hierarchie.From AppPrefabs drag VRRoom to Hierarchy.
  • Worldanchormanager hinzufügenAdd WorldAnchorManager
    • Wählen Sie in Hierarchie die Option Manager aus.In Hierarchy, Select Managers.
    • Klicken Sie in Inspector auf Komponente hinzufügen.In Inspector, click Add Component.
    • Geben Sie World Anchor Manager ein.Type World Anchor Manager.
    • Wählen Sie World Anchor Manager aus, um ihn hinzuzufügen.Select World Anchor Manager to add it.
  • Hinzufügen von taptoplace zur InselAdd TapToPlace to the Island
    • Erweitern Sie in Hierarchie den Knoten Insel.In Hierarchy, expand Island.
    • Wählen Sie mixedrealitylands aus.Select MixedRealityLand.
    • Klicken Sie in Inspector auf Komponente hinzufügen.In Inspector, click Add Component.
    • Geben Sie tippen Sie ein , und wählen Sie ihn aus.Type Tap To Place and select it.
    • Aktivieren Sie übergeordnetes Element bei tippen.Check Place Parent On Tap.
    • Legen Sie Platzierungs Offset auf (0, 0,1, 0) fest.Set Placement Offset to (0, 0.1, 0).
  • Speichern und erstellen wie zuvorSave and Build as before

Durchforsten des CodesDigging into the code

Skript 1-GamepadInput.csScript 1 - GamepadInput.cs

Navigieren Sie im Projekt Panel zu asset\holotoolkit\input\script\inputsources , und doppelklicken Sie auf GamepadInput.cs , um es zu öffnen.In the project panel navigate to Assets\HoloToolkit\Input\Scripts\InputSources and double click GamepadInput.cs to open it. Doppelklicken Sie im Projekt Panel auf denselben Pfad, und doppelklicken Sie auf InteractionSourceInputSource.cs.From the same path in the project panel, also double click InteractionSourceInputSource.cs.

Beachten Sie, dass beide Skripts über eine allgemeine Basisklasse (baseinputsource) verfügen.Note that both scripts have a common base class, BaseInputSource.

Baseinputsource speichert einen Verweis auf einen InputManager, wodurch ein Skriptereignisse auslöst.BaseInputSource keeps a reference to an InputManager, which allows a script to trigger events. In diesem Fall ist das inputgeklickt-Ereignis relevant.In this case, the InputClicked event is relevant. Dies ist wichtig, wenn Sie das Skript 2, taptoplace, erhalten.This will be important to remember when we get to script 2, TapToPlace. Im Fall von "gamepadinput" rufen wir die Schaltfläche "A" auf dem Controller ab, die gedrückt werden soll. Anschließend wird das Ereignis "inputgeklickt" aufgerufen.In the case of GamePadInput, we poll for the A button on the controller to be pressed, then we raise the InputClicked event. Im Fall von interaktionsourceinputsource wird das inputgeklickt-Ereignis als Antwort auf das tappedevent-Ereignis ausgelöst.In the case of InteractionSourceInputSource, we raise the InputClicked event in response to the TappedEvent.

Skript 2-TapToPlace.csScript 2 - TapToPlace.cs

Navigieren Sie im Projekt Panel zu assets\holotoolkit\spatialmapping\scripts , und doppelklicken Sie auf TapToPlace.cs , um es zu öffnen.In the project panel navigate to Assets\HoloToolkit\SpatialMapping\Scripts and double click TapToPlace.cs to open it.

Das erste, was viele Entwickler implementieren möchten, wenn Sie eine Holographic-Anwendung erstellen, ist das Verschieben von holograms mit Gesten Eingaben.The first thing many developers want to implement when creating a Holographic application is moving Holograms with gesture input. Daher haben wir uns bemüht, dieses Skript gründlich zu kommentieren.As such, we've endeavored to thoroughly comment this script. Einige Dinge sind für dieses Tutorial besonders hervorzuheben.A few things are worth highlighting for this tutorial.

Beachten Sie zunächst, dass "taptoplace" iinputclickhandler implementiert.First, note that TapToPlace implements IInputClickHandler. Iinputclickhandler macht die Funktionen verfügbar, die das von GamePadInput.cs oder InteractionSourceInputSource.cs ausgebene inputclick-Ereignis behandeln.IInputClickHandler exposes the functions that handle the InputClicked event raised by GamePadInput.cs or InteractionSourceInputSource.cs. "Oninputclick" wird aufgerufen, wenn ein "baseinputsource" einen Klick erkennt, während das Objekt mit "taptoplace" den Fokus hat.OnInputClicked is called when a BaseInputSource detects a click while the object with TapToPlace is in focus. Das-Ereignis wird entweder durch airtippen auf hololens oder durch Drücken der Schaltfläche auf dem Xbox-Controller auslöst.Either airtapping on HoloLens or pressing the A button on the Xbox controller will trigger the event.

Zweitens: der Code wird in Update ausgeführt, um festzustellen, ob eine Oberfläche betrachtet wird, damit wir das Spielobjekt auf einer Oberfläche platzieren können, z. b. eine Tabelle.Second is the code be executed in update to see if a surface is being looked at so we can place the game object on a surface, like a table. Das immersive Headset weist kein Konzept von echten Oberflächen auf, sodass das Objekt, das die Tabelle oben darstellt (Vroom > tablethingy > Cube) mit der spatialmapping-Physik Schicht markiert wurde, sodass die Strahl Umwandlung bei Update mit der virtuellen Tabelle oben in Konflikt steht.The immersive headset doesn't have a concept of real surfaces, so the object that represents the table top (Vroom > TableThingy > Cube) has been marked with the SpatialMapping physics layer, so the ray cast in Update will collide with the virtual table top.

Nutzen Sie Ihren FortschrittEnjoy your progress

Dieses Mal können Sie die Insel auswählen, um Sie zu verschieben.This time you can select the island to move it. Auf hololens können Sie die Insel auf eine echte Oberfläche verschieben.On HoloLens you can move the island to a real surface. Im immersiven Headset können Sie die Insel in die virtuelle Tabelle verschieben, die wir hinzugefügt haben.In the immersive headset you can move the island to the virtual table we added.

Kapitel 3: FreigabeChapter 3 - Sharing

ZieleObjectives

Stellen Sie sicher, dass das Netzwerk ordnungsgemäß konfiguriert ist, und erläutern Sie, wie räumliche Anker von Geräten gemeinsam genutzt werdenEnsure that the network is correctly configured and detail how spatial anchors are shared between devices.

BuildWhat we will build

Das Projekt wird in ein multiplayerprojekt konvertiert.We will convert our project to a multiplayer project. Wir fügen Benutzeroberfläche und Logik zum Hosten oder Verknüpfen von Sitzungen hinzu.We will add UI and logic to host or join sessions. Hololens-Benutzer werden einander in der Sitzung mit Clouds über ihren Köpfen sehen, und immersive Headset-Benutzer haben Clouds in der Nähe des Ankers.HoloLens users will see each other in the session with clouds over their heads, and immersive headset users have clouds near to where the anchor is. Benutzer in den immersiven Headsets sehen die hololens-Benutzer relativ zum Ursprung der Szene.Users in the immersive headsets will see the HoloLens users relative to the origin of the scene. Hololens-Benutzer sehen alle das Hologramm der Insel am gleichen Ort.HoloLens users will all see the hologram of the island in the same place. Beachten Sie, dass die Benutzer in den immersiven dashboarden in diesem Kapitel nicht auf der Insel sein werden, sondern sich ähnlich wie hololens Verhalten, mit einer Vogelperspektive auf der Insel.It is key to note that the users in the immersive headsets will not be on the island during this chapter, but will behave very similarly to HoloLens, with a birds eye view of the island.

SchritteSteps

  • Insel und vrroom entfernenRemove Island and VRRoom
    • Klicken Sie in Hierarchie mit der rechten Maustaste auf Insel .In Hierarchy right-click Island select Delete
    • Klicken Sie in Hierarchie mit der rechten Maustaste auf vrroom Select DeleteIn Hierarchy right-click VRRoom select Delete
  • Add-inAdd Usland
    • Ziehen Sie in appprefabs auf die Hierarchie.From AppPrefabs drag Usland to Hierarchy.
  • Ziehen Sie in appprefabs die folgenden Befehle in die Hierarchie:From AppPrefabs drag each of the following to Hierarchy:
    • UnetsharingstageUNETSharingStage
    • UnetanchorrootUNetAnchorRoot
    • UIContainerUIContainer
    • Debug-SchaltflächeDebugPanelButton
  • Speichern und erstellen wie zuvorSave and Build as before

Durchforsten des CodesDigging into the code

Navigieren Sie im Projekt Panel zu assets\appprefabs\support\sharingwithunet\scripts , und doppelklicken Sie auf UnetAnchorManager.cs.In the project panel, navigate to Assets\AppPrefabs\Support\SharingWithUnet\Scripts and double-click on UnetAnchorManager.cs. Die Fähigkeit eines hololens, Überwachungsinformationen mit anderen hololens gemeinsam zu nutzen, sodass beide Geräte denselben Platz gemeinsam nutzen können, ist nahezu magisch.The ability for one HoloLens to share tracking information with another HoloLens such that both devices can share the same space is near magical. Die Leistung gemischter Realität kommt in Kraft, wenn zwei oder mehr Personen mit denselben digitalen Daten zusammenarbeiten können.The power of mixed reality comes alive when two or more people can collaborate using the same digital data.

In diesem Skript können einige Punkte aufgeführt werden:A few things to point out in this script:

Beachten Sie in der Funktion Start die Überprüfung auf isdisplaytransparent.In the start function, notice the check for IsDisplayOpaque. In diesem Fall wird der Anker festgelegt.In this case, we pretend that the Anchor is established. Dies liegt daran, dass die immersiven Headsets keine Möglichkeit zum Importieren oder Exportieren von Ankern bereitstellen.This is because the immersive headsets do not expose a way to import or export anchors. Wenn Sie jedoch auf einem hololens ausführen, implementiert dieses Skript gemeinsame Anker zwischen den Geräten.If we are running on a HoloLens, however, this script implements sharing anchors between the devices. Das Gerät, von dem die Sitzung gestartet wird, erstellt einen Anker für den Export.The device that starts the session will create an anchor for exporting. Das Gerät, das einer Sitzung Beitritt, fordert den Anker von dem Gerät an, das die Sitzung gestartet hat.The device that joins a session will request the anchor from the device that started the session.

ExportExporting:

Wenn ein Benutzer eine Sitzung erstellt, wird die unetanchormanager-Funktion von networkdiscoverywithanchor aufgerufen.When a user creates a session, NetworkDiscoveryWithAnchors will call UNETAnchorManagers CreateAnchor function. Gehen wir folgendermaßen vor:Let's follow CreateAnchor flow.

Wir beginnen mit der Arbeit mit der Verwaltung und löschen alle Daten, die wir möglicherweise für vorherige Anker gesammelt haben.We start by doing some housekeeping, clearing out any data we may have collected for previous anchors. Dann überprüfen wir, ob ein zwischen gespeicherter Anker zum Laden vorhanden ist.Then we check if there is a cached anchor to load. Die Anker Daten liegen tendenziell zwischen 5 und 20 MB, sodass die Wiederverwendung zwischen gespeicherter Anker die Menge der Daten einsparen kann, die wir über das Netzwerk übertragen müssen.The anchor data tends to be between 5 and 20 MB, so reusing cached anchors can save on the amount of data we need to transfer over the network. Wir sehen, wie dies etwas später funktioniert.We'll see how this works a bit later. Auch wenn wir den Anker wieder verwenden, müssen wir die Anker Daten für den Fall bereitstellen, dass ein neuer clientjoins vorhanden ist, der nicht über den Anker verfügt.Even if we are reusing the anchor, we need to get the anchor data ready in case a new client joins that doesn't have the anchor.

Beim Vorbereiten der Anker Daten stellt die worldanchortransferbatch-Klasse die Funktionalität zum Vorbereiten von Anker Daten für das Senden an ein anderes Gerät oder eine andere Anwendung sowie die Funktionalität zum Importieren der Anker Daten bereit.Speaking of getting the anchor data ready, the WorldAnchorTransferBatch class exposes the functionality to prepare anchor data for sending to another device or application and the functionality to import the anchor data. Da wir den Export Pfad verwenden, fügen wir den Anker zu worldanchortransferbatch hinzu und nennen die exportasync-Funktion.Since we're on the export path, we will add our anchor to the WorldAnchorTransferBatch and call the ExportAsync function. Exportasync ruft dann den Rück schreibe Rückruf auf, wenn Daten für den Export generiert werden.ExportAsync will then call the WriteBuffer callback as it generates data for export. Wenn alle Daten exportiert wurden, wird der Export Complete aufgerufen.When all of the data has been exported ExportComplete will be called. In "Write Buffer" fügen wir den Datenblock zu einer Liste hinzu, die für den Export beibehalten wird.In WriteBuffer we add the chunk of data to a list we keep for exporting. In "exportcomplete" konvertieren wir die Liste in ein Array.In ExportComplete we convert the list to an array. Außerdem wird die anchorname-Variable festgelegt, die andere Geräte auslöst, um den Anker anzufordern, wenn Sie ihn nicht haben.The AnchorName variable is also set, which will trigger other devices to request the anchor if they don't have it.

In einigen Fällen wird der Anker nicht exportiert oder erstellt so wenig Daten, die wir erneut versuchen werden.In some cases the anchor won't export or will create so little data that we will try again. Hier wird nur "kreateanchor" aufgerufen.Here we just call CreateAnchor again.

Eine abschließende Funktion im Export Pfad ist anchorfoundremote.A final function in the export path is AnchorFoundRemotely. Wenn ein anderes Gerät den Anker findet, teilt dieses Gerät den Host, und der Host verwendet diese als Signal, dass der Anker ein "guter Anker" ist und zwischengespeichert werden kann.When another device finds the anchor, that device will tell the host, and the host will use that as a signal that the anchor is a "good anchor" and can be cached.

HumiImporting:

Wenn ein hololens einer Sitzung Beitritt, muss ein Anker importiert werden.When a HoloLens joins a session, it needs to import an anchor. In der Update-Funktion von unetanchormanager wird der anchorname abgerufen.In UNETAnchorManager's Update function, the AnchorName is polled. Wenn sich der Anker Name ändert, beginnt der Import Vorgang.When the anchor name changes, the import process begins. Zuerst versuchen wir, den Anker mit dem angegebenen Namen aus dem lokalen Anker Speicher zu laden.First, we try to load the anchor with the specified name from the local anchor store. Wenn wir das bereits haben, können wir es verwenden, ohne die Daten erneut herunterzuladen.If we already have it, we can use it without downloading the data again. Wenn dies nicht der Fall ist, wird waitforanchor aufgerufen, um den Download zu initiieren.If we don't have it, then we call WaitForAnchor which will initiate the download.

Wenn der Download abgeschlossen ist, wird NetworkTransmitter_dataReadyEvent aufgerufen.When the download is completed, NetworkTransmitter_dataReadyEvent is called. Dadurch wird die Aktualisierungs Schleife signalisiert, um importasync mit den heruntergeladenen Daten aufzurufen.This will signal the Update loop to call ImportAsync with the downloaded data. Importasync wird importcomplete aufrufen, wenn der Import Vorgang beendet ist.ImportAsync will call ImportComplete when the import process is complete. Wenn der Import erfolgreich ist, wird der Anker im lokalen Player Speicher gespeichert.If the import is successful, the anchor will be saved in the local player store. PlayerController.cs bewirkt, dass anchorfoundremote aufgerufen wird, damit der Host weiß, dass ein guter Anker eingerichtet wurde.PlayerController.cs actually makes the call to AnchorFoundRemotely to let the host know that a good anchor has been established.

Nutzen Sie Ihren FortschrittEnjoy your progress

Dieses Mal hostet ein Benutzer mit einem hololens eine Sitzung mithilfe der Schaltfläche Sitzung starten in der Benutzeroberfläche.This time a user with a HoloLens will host a session using the start session button in the UI. Andere Benutzer, sowohl auf hololens als auch auf einem immersiven Headset, wählen die Sitzung aus und wählen dann die Schaltfläche Sitzung beitreten in der Benutzeroberfläche aus.Other users, both on HoloLens or an immersive headset, will select the session and then select the join session button in the UI. Wenn Sie über mehrere Personen mit hololens-Geräten verfügen, werden diese über rote Clouds verfügen.If you have multiple people with HoloLens devices, they will have red clouds over their heads. Es gibt auch eine blaue Cloud für jedes immersive Headset, aber die blauen Clouds werden nicht über den Headsets angezeigt, da die Headsets nicht versuchen, denselben weltweiten Koordinatenraum wie die hololens-Geräte zu finden.There will also be a blue cloud for each immersive headset, but the blue clouds will not be above the headsets, as the headsets are not trying to find the same world coordinate space as the HoloLens devices.

Dieser Punkt im Projekt ist eine enthaltene Freigabe Anwendung. Dies funktioniert nicht sehr viel und kann als Baseline fungieren.This point in the project is a contained sharing application; it doesn't do very much, and could act as a baseline. In den nächsten Kapiteln beginnen wir damit, eine benutzerfreundliche Lösung zu entwickeln.In the next chapters, we will start building an experience for people to enjoy. Weitere Anleitungen zum Entwurf von freigegebenen Funktionen finden Sie hier.To get further guidance on shared experience design, go here.

Kapitel 4: eintauchen und teleportierungChapter 4 - Immersion and teleporting

ZieleObjectives

Sorgen Sie für die einzelnen Arten gemischter Reality-Geräte.Cater the experience to each type of mixed reality device.

BuildWhat we will build

Wir werden die Anwendung aktualisieren, um immersive Headset-Benutzer auf der Insel mit einer immersiven Ansicht zu platzieren.We will update the application to put immersive headset users on the island with an immersive view. Hololens-Benutzer verfügen weiterhin über die Augen Ansicht der Insel.HoloLens users will still have the bird's eye view of the island. Benutzer jedes Gerätetyps können andere Benutzer sehen, wie Sie in der Welt angezeigt werden.Users of each device type can see other users as they appear in the world. Beispielsweise können immersive Headset-Benutzer die anderen Avatare in anderen Pfaden auf der Insel sehen, und Sie sehen die hololens-Benutzer als riesige Clouds oberhalb der Insel.For instance, immersive headset users can see the other avatars on other paths on the island, and they see the HoloLens users as giant clouds above the island. Immersive Headset-Benutzer sehen auch den Cursor des Blicks Strahl des hololens-Benutzers, wenn der hololens-Benutzer die Insel ansieht.Immersive headset users will also see the cursor of the HoloLens user's gaze ray if the HoloLens user is looking at the island. Hololens-Benutzern wird ein Avatar auf der Insel angezeigt, der jeden immersiven Headset-Benutzer darstellt.HoloLens users will see an avatar on the island to represent each immersive headset user.

Aktualisierte Eingabe für das immersive Gerät:Updated Input for the Immersive device:

  • Die Schaltflächen Linker und rechter Stoß Taste auf dem Xbox-Controller drehen den Player.The left bumper and right bumper buttons on the Xbox controller rotate the player
  • Wenn Sie die Y-Schaltfläche auf dem Xbox-Controller halten, wird ein teleportcursor aktiviert.Holding the Y button on the Xbox controller will enable a teleport cursor. Wenn der Cursor einen drehenden Pfeil anzeigt, wenn Sie die Y-Schaltfläche loslassen, werden Sie an die Position des Cursors portiert.If the cursor has a spinning arrow indicator when you release the Y button, you will be teleported to the cursor's location.

SchritteSteps

  • Mixedrealityteleport zu mixedrealitycameraparent hinzufügenAdd MixedRealityTeleport to MixedRealityCameraParent
    • Wählen Sie in Hierarchie die Option " Verwendung von".In Hierarchy, select Usland.
    • Aktivieren Sie im Inspektor das Steuerelement Ebene.In Inspector, enable Level Control.
    • Wählen Sie in Hierarchie die Option mixedrealitycameraparent aus.In Hierarchy, select MixedRealityCameraParent.
    • Klicken Sie in Inspector auf Komponente hinzufügen.In Inspector, click Add Component.
    • Geben Sie gemischter Reality-Teleport ein, und wählen Sie denType Mixed Reality Teleport and select it.

Durchforsten des CodesDigging into the code

Immersive Headset-Benutzer werden mit einem Kabel auf ihren PCs getestet, aber unsere Insel ist größer als das Kabel.Immersive headset users will be tethered to their PCs with a cable, but our island is larger than the cable is long. Um dies zu kompensieren, benötigen wir die Möglichkeit, die Kamera unabhängig von der Bewegung des Benutzers zu verschieben.To compensate, we need the ability to move the camera independently of the user's motion. Auf der Seite "Komfort " finden Sie weitere Informationen zum Entwerfen Ihrer gemischten Reality-Anwendung (insbesondere selbst Bewegung und Fortbewegung).Please see the comfort page for more information about designing your mixed reality application (in particular self motion and locomotion).

Um diesen Prozess zu beschreiben, ist es hilfreich, zwei Begriffe zu definieren.In order to describe this process it will be useful to define two terms. Zunächst ist Dolly das Objekt, das die Kamera unabhängig vom Benutzer verschiebt.First, dolly will be the object that moves the camera independently from the user. Ein untergeordnetes Spielobjekt von Dolly ist die Hauptkamera.A child game object of the dolly will be the main camera. Die Hauptkamera wird an den Kopf des Benutzers angefügt.The main camera is attached to the user's head.

Navigieren Sie im Projekt Panel zu assetion\appprefabs\support\script\gamelogic , und doppelklicken Sie auf MixedRealityTeleport.cs.In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on MixedRealityTeleport.cs.

Mixedrealityteleport verfügt über zwei Aufträge.MixedRealityTeleport has two jobs. Zuerst wird die Drehung mithilfe der Stoßdämpfer verarbeitet.First, it handles rotation using the bumpers. In der Funktion "Update" rufen wir "Button up" für "leftbumper" und "rightbumper" ab.In the update function we poll for 'ButtonUp' on LeftBumper and RightBumper. "Getbuttonup" gibt nur "true" auf dem ersten Frame zurück, wenn eine Schaltfläche nicht mehr vorhanden ist.GetButtonUp only returns true on the first frame a button is up after having been down. Wenn eine der beiden Schaltflächen ausgelöst wurde, wissen wir, dass der Benutzer sich drehen muss.If either button had been raised, then we know the user needs to rotate.

Wenn wir drehen, gehen wir mit einem einfachen Skript, das als "Fade-Steuerelement" bezeichnet wird, ein und blenden es aus.When we rotate we do a fade out and fade in using a simple script called 'fade control'. Dies geschieht, um zu verhindern, dass der Benutzer eine unnatürliche Bewegung sieht, was zu einem Unbehagen führen könnte.We do this to prevent the user from seeing an unnatural movement which could lead to discomfort. Der Einblend-und Ausgabe Effekt ist ziemlich einfach.The fade in and out effect is fairly simple. Wir haben ein schwarzes Quad vor der Hauptkamera.We have a black quad hanging in front of the main camera. Beim Ausblenden wird der Alpha-Wert von 0 auf 1 umgestellt.When fading out we transition the alpha value from 0 to 1. Dies bewirkt allmählich, dass die schwarzen Pixel des Quad-Elements dargestellt werden, und Sie verbergen alles dahinter.This gradually causes the black pixels of the quad to render and obscure anything behind them. Beim zurückkehren wird der Alpha-Wert auf Null zurückgesetzt.When fading back in we transition the alpha value back to zero.

Wenn wir die Drehung berechnen, beachten Sie, dass wir unsere Dolly drehen, aber die Drehung um die Hauptkamera berechnen.When we calculate the rotation, note that we are rotating our dolly but calculating the rotation around the main camera. Dies ist wichtig, wenn die Hauptkamera von 0, 0 und 0 entfernt wird, desto weniger genau wird eine Drehung um den Dolly aus der Sicht des Benutzers.This is important as the farther the main camera is away from 0,0,0, the less accurate a rotation around the dolly would become from the point of view of the user. Wenn Sie sich nicht um die Kameraposition drehen, wird der Benutzer in einem Bogen um den Dolly bewegt, anstatt sich zu drehen.In fact, if you do not rotate around the camera position, the user will move on an arc around the dolly rather than rotating.

Der zweite Auftrag für mixedrealityteleport ist das Verschieben von Dolly.The second job for MixedRealityTeleport is to handle moving the dolly. Dies erfolgt in setworldposition.This is done in SetWorldPosition. Setworldposition nimmt die gewünschte Weltposition an, an der Position, an der der Benutzer seine Mitarbeiter bewohnen möchte.SetWorldPosition takes the desired world position, the position where the user wants to percieve that they inhabit. Wir müssen den Dolly an dieser Position abzüglich der lokalen Position der Hauptkamera platzieren, da dieser Offset jedem Frame hinzugefügt wird.We need to put our dolly at that position minus the local position of the main camera, as that offset will be added each frame.

Ein zweites Skript ruft setworldposition auf.A second script calls SetWorldPosition. Sehen wir uns dieses Skript an.Let's look at that script. Navigieren Sie im Projekt Panel zu assetion\appprefabs\support\script\gamelogic , und doppelklicken Sie auf TeleportScript.cs.In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on TeleportScript.cs.

Dieses Skript ist etwas komplizierter als mixedrealityteleport.This script is a little more involved than MixedRealityTeleport. Das Skript prüft, dass die Y-Schaltfläche auf dem Xbox-Controller gedrückt gehalten werden soll.The script is checking for the Y Button on the Xbox controller to be held down. Wenn die Schaltfläche gedrückt gehalten wird, wird ein teleportcursor gerendert, und das Skript wandelt einen Strahl von der Blick Position des Benutzers um.While the button is held down a teleport cursor is rendered and the script casts a ray from the user's gaze position. Wenn sich dieser Strahl auf eine Oberfläche mit mehr oder weniger zeigenden Zeichen stößt, wird die Oberfläche als eine gute Oberfläche für die teleportierung angesehen, und die Animation des Teleport Cursors wird aktiviert.If that ray collides with a surface that is more or less pointing up, the surface will be considered a good surface to teleport to, and the animation on the teleport cursor will be enabled. Wenn der Strahl nicht mit einer Oberfläche in Konflikt steht, die mehr oder weniger nach oben zeigt, wird die Animation auf dem Cursor deaktiviert.If the ray does not collide with a surface more or less pointing up, then the animation on the cursor will be disabled. Wenn die Y-Schaltfläche losgelassen wird und der berechnete Punkt des Strahls eine gültige Position ist, ruft das Skript setworldposition mit der Position ab, an der sich der Strahl überschneidet.When the Y button is released and the calculated point of the ray is a valid position, the script calls SetWorldPosition with the position the ray intersected.

Nutzen Sie Ihren FortschrittEnjoy your progress

Dieses Mal müssen Sie einen Freund suchen.This time you'll need to find a friend.

Ein Benutzer mit dem hololens-Host hostet wiederum eine Sitzung.Once again, a user with the HoloLens will host a session. Andere Benutzer werden an der Sitzung teilnehmen.Other users will join the session. Die Anwendung platziert die ersten drei Benutzer, um von einem immersiven Headset an einem der drei Pfade auf der Insel beizutreten.The application will place the first three users to join from an immersive headset on one of the three paths on the island. Sie können sich die Insel in diesem Abschnitt ansehen.Feel free to explore the island in this section.

Beachten Sie die folgenden Details:Details to notice:

  1. Sie können Gesichter in den Clouds sehen, was einem eingetauchten Benutzer hilft, zu sehen, welche Richtung ein hololens-Benutzer sucht.You can see faces in the clouds, which helps an immersed user see which direction a HoloLens user is looking.
  2. Die Avatare auf der Insel haben Hals Striche, die sich drehen.The avatars on the island have necks that rotate. Sie gehen nicht darauf ein, was der Benutzer tatsächlich macht (da wir nicht über diese Informationen verfügen), sondern eine schöne benutzerfreundliche Darstellung.They won't follow what the user is doing is real reality (we don't have that information) but it makes for a nice experience.
  3. Wenn der hololens-Benutzer die Insel ansieht, können die eingetauchten Benutzer Ihren Cursor sehen.If the HoloLens user is looking at the Island, the immersed users can see their cursor.
  4. Die Clouds, die die hololens-Benutzer darstellen, wandeln Schatten ein.The clouds that represent the HoloLens users cast shadows.

Kapitel 5-FinaleChapter 5 - Finale

ZieleObjectives

Erstellen Sie eine interaktive Interaktion zwischen den beiden Gerätetypen.Create a collaborative interactive experience between the two device types.

BuildWhat we will build

Wenn ein Benutzer mit einem immersiven Headset in Kapitel 4 in der Nähe eines Rätsels auf der Insel kommt, erhalten die hololens-Benutzer eine QuickInfo mit einem Hinweis auf das Rätsel.Building on chapter 4, when a user with an immersive headset gets near a puzzle on the island, the HoloLens users will get a tool tip with a clue to the puzzle. Sobald alle immersiven Headset-Benutzer ihre Rätsel und den "Ready Pad" im Raketen Raum erhalten haben, wird die-Rakete gestartet.Once all of the immersive headset users get past their puzzles and onto the "ready pad" in the rocket room, the rocket will launch.

SchritteSteps

  • Wählen Sie in Hierarchie die Option " Verwendung von".In Hierarchy, select Usland.
  • Aktivieren Sie im Inspektor in der Ebene-Steuerung die Option Zusammenarbeit aktivieren.In Inspector, in Level Control, check Enable Collaboration.

Durchforsten des CodesDigging into the code

Sehen wir uns nun LevelControl.cs an.Now let us look at LevelControl.cs. Dieses Skript ist der Kern der Spiellogik und behält den Spielzustand bei.This script is the core of the game logic and maintains the game state. Da es sich hierbei um ein Multiplayer-Spiel mit uNet handelt, müssen wir verstehen, wie Daten fließen, zumindest gut genug, um dieses Tutorial zu ändern.Since this is a multiplayer game using UNET we need to understand how data flows, at least well enough to modify this tutorial. Eine ausführlichere Übersicht über das uNet finden Sie in der Unity-Dokumentation.For a more complete overview of UNET, please refer to Unity's documentation.

Navigieren Sie im Projekt Panel zu assetion\appprefabs\support\script\gamelogic , und doppelklicken Sie auf LevelControl.cs.In the project panel, navigate to Assets\AppPrefabs\Support\Scripts\GameLogic and double-click on LevelControl.cs.

Teilen Sie uns mit, wie ein immersives Headset anzeigt, dass Sie für den Raketenstart bereit sind.Let us understand how an immersive headset indicates that they are ready for the rocket launch. Die Bereitschaft der Startbereitschaft wird übermittelt, indem eines von drei boolesche in einer Liste von boolesche festgelegt wird, die den drei Pfaden auf der Insel entsprechen.Rocket Launch readiness is communicated by setting one of three bools in a list of bools that correspond to the three paths on the island. Der boolesche Wert eines Pfads wird festgelegt, wenn sich der Benutzer, der dem Pfad zugewiesen ist, über dem braunen Pad innerhalb des Raketen Raums befindet.A path's bool will be set when the user assigned to the path is on top of the brown pad inside the rocket room. OK, jetzt können Sie die Details anzeigen.Okay, now to the details.

Wir beginnen in der Update ()-Funktion.We will start in the Update() function. Sie werden feststellen, dass es eine "Cheat"-Funktion gibt.You will note that there is a 'cheat' function. Wir haben dies bei der Entwicklung verwendet, um die Reihenfolge der Starts und der zurück Setzung zu testenWe used this in development to test the rocket launch and reset sequence. Dies funktioniert nicht in der mehr Benutzer Funktionalität.It won't work in the multi user experience. Hoffentlich, wenn Sie die folgenden Informationen internalisieren, können Sie die Arbeit durchführen.Hopefully by the time you internalize the following infromation you can make it work. Nachdem wir überprüft haben, um zu überprüfen, ob der lokale Player in den Spiel kommt.After we check to see if we should cheat, we check to see if the local player is immersed. Wir möchten uns darauf konzentrieren, wie wir feststellen, dass wir das Ziel haben.We want to focus on how we find that we're at the goal. Bei der Überprüfung bei if (eingetaucht) gibt es einen aufzurufenden prüfgoal-Vorgang hinter der enablecollaboration bool.Inside of the if (Immersed) check, there is a call to CheckGoal hiding behind the EnableCollaboration bool. Dies entspricht dem Kontrollkästchen, das Sie bei der Ausführung der Schritte für dieses Kapitel geprüft haben.This corresponds to the checkbox you checked while completing the steps for this chapter. Innerhalb von enablecollaboration wird ein Rückruf von checkgoal () angezeigt.Inside of EnableCollaboration we see a call to CheckGoal().

Checkgoal führt einige mathematische Berechnungen durch, um zu sehen, ob Sie mehr oder weniger auf dem Pad stehen.CheckGoal does some math to see if we are more or less standing on the pad. Wenn dies der Fall ist, Debuggen wir ". log", das beim Ziel eingetroffen ist, und dann rufe ich "sendatgoalmessage ()" auf.When we are, we Debug.Log "Arrived at goal" and then we call 'SendAtGoalMessage()'. In sendatgoalmessage wird "playercontroller. sendatgoal" aufgerufen.In SendAtGoalMessage we call playerController.SendAtGoal. Um einige Zeit zu sparen, hier ist der Code:To save you some time, here's the code:

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, das "levelstate. setgoalindex" aufruft, das sich wieder in LevelControl.cs befindet.Note that SendAtGoalMessage calls CmdSendAtGoal, which calls levelState.SetGoalIndex, which is back in LevelControl.cs. Auf den ersten Blick erscheint dies seltsam.At first glance this seems strange. Warum nicht einfach nur setgateindex aufrufen, sondern nicht das seltsame Routing durch den Player Controller?Why not just call SetGoalIndex rather than this strange routing through the player controller? Der Grund hierfür ist, dass wir mit dem Datenmodell übereinstimmen, das uNet verwendet, um Daten synchron zu halten. Um das betrügen und übersetzen zu verhindern, erfordert uNet, dass jedes-Objekt über einen Benutzer verfügt, der über die Berechtigung zum Ändern der synchronisierten Variablen verfügt.The reason is that we are conforming to the data model UNET uses to keep data in sync. To prevent cheating and thrashing, UNET requires that each object has a user who has authority to change the synchronized variables. Außerdem kann nur der Host (der Benutzer, der die Sitzung gestartet hat) Daten direkt ändern.Further, only the host (the user that started the session) can change data directly. Benutzer, die nicht der Host sind, aber über eine Autorität verfügen, müssen einen "Befehl" an den Host senden, um die Variable zu ändern.Users who are not the host, but have authority, need to send a 'command' to the host which will change the variable. Standardmäßig verfügt der Host über eine Autorität für alle Objekte, mit Ausnahme des Objekts, das zur Darstellung des Benutzers erzeugt wird.By default the host has authority over all objects, except for the object spawned to represent the user. In unserem Fall weist dieses Objekt das playercontoller-Skript auf.In our case this object has the playercontroller script. Es gibt eine Möglichkeit, eine Autorität für ein Objekt anzufordern und dann Änderungen vorzunehmen, aber wir wählen die Tatsache aus, dass der Player Controller über eine Self-Authority-und Route-Befehle über den Player Controller verfügt.There is a way to request authority for an object and then make changes, but we choose to leverage the fact that the player controller has self authority and route commands through the player controller.

Anders gesagt: Wenn wir uns an unser Ziel gefunden haben, muss der Spieler den Host informieren, und der Host informiert alle anderen Personen.Said another way, when we've found ourselves at our goal, the player needs to tell the host, and the host will tell everyone else.

Zurück in LevelControl.cs betrachten Sie setgoalindex.Back in LevelControl.cs look at SetGoalIndex. Hier legen wir den Wert eines Werts in einem SyncList (atgoal) fest.Here we are setting the value of a value in a synclist (AtGoal). Beachten Sie, dass wir uns im Kontext des Hosts befinden.Remember that we are in the context of the host while we do this. Ähnlich wie bei einem-Befehl kann ein RPC von dem Host ausgegeben werden, was dazu führt, dass alle Clients Code ausführen.Similar to a command, an RPC is something the host can issue that will cause all clients to run some code. Hier wird "rpccheckallgoals" aufgerufen.Here we call 'RpcCheckAllGoals'. Jeder Client prüft einzeln, ob alle drei atziele festgelegt sind. wenn dies der Fall ist, wird die Ausführung gestartet.Each client will individually check to see if all three AtGoals are set, and if so, launch the rocket.

Nutzen Sie Ihren FortschrittEnjoy your progress

Im vorherigen Kapitel wird die Sitzung wie zuvor gestartet.Building on the previous chapter, we will start the session as before. Wenn die Benutzer im immersiven Headset das "Door" in Ihrem Pfad erreichen, wird eine QuickInfo angezeigt, die nur die hololens-Benutzer sehen können.This time as the users in the immersive headset get to the "door" on their path, a tooltip will appear that only the HoloLens users can see. Die hololens-Benutzer sind dafür verantwortlich, diesen Hinweis an die Benutzer im immersiven Headset zu übermitteln.The HoloLens users are responsible for communicating this clue to the users in the immersive headset. Die Rakete wird in den Speicherplatz gestartet, sobald jeder Avatar auf dem entsprechenden braunen Pad innerhalb des Vulkans verstrichen ist.The rocket will launch to space once each avatar has stepped on its corresponding brown pad inside the volcano. Die Szene wird nach 60 Sekunden zurückgesetzt, damit Sie Sie wiederholen können.The scene will reset after 60 seconds so you can do it again.

Weitere InformationenSee also