Teilen über


HoloLens (1. Generation) und Azure 308: Geräteübergreifende Benachrichtigungen


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 wird eine neue Reihe von Lernprogrammen geben, die in Zukunft veröffentlicht werden, die zeigen, wie sie für HoloLens 2 entwickelt werden. Dieser Hinweis wird mit einem Link zu diesen Lernprogrammen aktualisiert, wenn sie veröffentlicht werden.


Endprodukt - Start

In diesem Kurs erfahren Sie, wie Sie einer Mixed Reality-Anwendung mithilfe von Azure Notification Hubs, Azure Tables und Azure Functions Benachrichtigungshubs Funktionen hinzufügen.

Azure Notification Hubs ist ein Microsoft-Dienst, mit dem Entwickler gezielte und personalisierte Pushbenachrichtigungen an eine beliebige Plattform senden können, die alle in der Cloud unterstützt werden. Dies kann Es Entwicklern ermöglichen, je nach Szenario mit Endbenutzern zu kommunizieren oder sogar zwischen verschiedenen Anwendungen zu kommunizieren. Weitere Informationen finden Sie auf der Azure Notification Hubs-Seite.

Azure Functions ist ein Microsoft-Dienst, mit dem Entwickler kleine Codeteile ,Funktionen' in Azure ausführen können. Dies bietet eine Möglichkeit, Arbeit an die Cloud zu delegieren, anstatt an Ihre lokale Anwendung, die viele Vorteile haben kann. Azure Functions unterstützt mehrere Entwicklungssprachen, einschließlich C#, F#, Node.js, Java und PHP. Weitere Informationen finden Sie auf der Seite "Azure Functions".

Azure Tables ist ein Microsoft-Clouddienst, mit dem Entwickler strukturierte Nicht-SQL-Daten in der Cloud speichern und überall darauf zugreifen können. Der Service verfügt über ein schemaloses Design, das die Entwicklung von Tabellen nach Bedarf ermöglicht und somit sehr flexibel ist. Weitere Informationen finden Sie auf der Seite "Azure Tables"

Nachdem Sie diesen Kurs abgeschlossen haben, verfügen Sie über eine immersive Mixed Reality-Headset-Anwendung und eine Desktop-PC-Anwendung, die folgende Aktionen ausführen kann:

  1. Mit der Desktop-PC-App kann der Benutzer mithilfe der Maus ein Objekt im 2D-Raum (X und Y) verschieben.

  2. Die Bewegung von Objekten innerhalb der PC-App wird mithilfe von JSON an die Cloud gesendet, die sich in Form einer Zeichenfolge befindet, die eine Objekt-ID, einen Typ und eine Transformationsinformationen (X- und Y-Koordinaten) enthält.

  3. Die Mixed Reality-App, die über eine identische Szene mit der Desktop-App verfügt, empfängt Benachrichtigungen zur Objektbewegung vom Notification Hubs-Dienst (die gerade von der Desktop-PC-App aktualisiert wurde).

  4. Beim Empfang einer Benachrichtigung, die die Objekt-ID, den Typ und die Transformationsinformationen enthält, wendet die Mixed Reality-App die empfangenen Informationen auf eine eigene Szene an.

In Ihrer Anwendung liegt es an Ihnen, wie Sie die Ergebnisse in Ihr Design integrieren. Dieser Kurs wurde entwickelt, um Ihnen zu vermitteln, wie Sie einen Azure-Dienst in Ihr Unity-Projekt integrieren. Es ist Ihre Aufgabe, das Wissen zu nutzen, das Sie aus diesem Kurs gewinnen, um Ihre Mixed Reality-Anwendung zu verbessern. Dieser Kurs ist ein eigenständiges Lernprogramm, das keine anderen Mixed Reality Labs direkt beinhaltet.

Unterstützung für Geräte

Kurs HoloLens Immersive Headsets
MR und Azure 308: Geräteübergreifende Benachrichtigungen ✔️ ✔️

Hinweis

Während sich dieser Kurs in erster Linie auf immersive Windows Mixed Reality-Headsets (VR) konzentriert, können Sie auch das, was Sie in diesem Kurs lernen, auf Microsoft HoloLens anwenden. Während Sie den Kurs befolgen, werden Notizen zu allen Änderungen angezeigt, die Sie möglicherweise zur Unterstützung von HoloLens verwenden müssen. Wenn Sie HoloLens verwenden, bemerken Sie möglicherweise ein Echo während der Sprachaufnahme.

Voraussetzungen

Hinweis

Dieses Lernprogramm wurde für Entwickler entwickelt, die grundlegende Erfahrung mit Unity und C# haben. Bitte beachten Sie auch, dass die Voraussetzungen und schriftlichen Anweisungen in diesem Dokument das zum Zeitpunkt der Schriftlichkeit (Mai 2018) getestet und überprüft wurden. Sie sind kostenlos, die neueste Software zu verwenden, wie im Artikel "Tools installieren" aufgeführt, aber es sollte nicht angenommen werden, dass die Informationen in diesem Kurs perfekt mit dem übereinstimmen, was Sie in neuerer Software finden als die unten aufgeführten.

Wir empfehlen die folgende Hardware und Software für diesen Kurs:

Vor der Installation

  • Um Probleme beim Erstellen dieses Projekts zu vermeiden, wird dringend empfohlen, das in diesem Lernprogramm erwähnte Projekt in einem Stamm- oder Near-Root-Ordner zu erstellen (lange Ordnerpfade können zu Buildzeit zu Problemen führen).
  • Sie müssen der Besitzer Ihres Microsoft-Entwicklerportals und Ihres Anwendungsregistrierungsportals sein, andernfalls verfügen Sie nicht über die Berechtigung für den Zugriff auf die App in Kapitel 2.

Kapitel 1 – Erstellen einer Anwendung im Microsoft Developer Portal

Um den Azure Notification Hubs-Dienst zu verwenden, müssen Sie eine Anwendung im Microsoft Developer Portal erstellen, da Ihre Anwendung registriert werden muss, damit sie Benachrichtigungen senden und empfangen kann.

  1. Melden Sie sich beim Microsoft Developer Portal an.

    Sie müssen sich bei Ihrem Microsoft-Konto anmelden.

  2. Klicken Sie im Dashboard auf "Neue App erstellen".

    Erstellen einer App

  3. Ein Popup wird angezeigt, wobei Sie einen Namen für Ihre neue App reservieren müssen. Fügen Sie im Textfeld einen geeigneten Namen ein; wenn der ausgewählte Name verfügbar ist, wird rechts neben dem Textfeld ein Teilstrich angezeigt. Nachdem Sie einen verfügbaren Namen eingefügt haben, klicken Sie unten links im Popup auf die Schaltfläche "Produktnamen reservieren".

    Umkehren eines Namens

  4. Nachdem die App jetzt erstellt wurde, können Sie zum nächsten Kapitel wechseln.

Kapitel 2 – Abrufen ihrer anmeldeinformationen für neue Apps

Melden Sie sich beim Anwendungsregistrierungsportal an, in dem Ihre neue App aufgeführt wird, und rufen Sie die Anmeldeinformationen ab, die zum Einrichten des Notification Hubs-Diensts im Azure-Portal verwendet werden.

  1. Navigieren Sie zum Anwendungsregistrierungsportal.

    Anwendungsregistrierungsportal

    Warnung

    Sie müssen Ihr Microsoft-Konto für die Anmeldung verwenden.
    Dies muss das Microsoft-Konto sein, das Sie im vorherigen Kapitel mit dem Windows Store-Entwicklerportal verwendet haben.

  2. Sie finden Ihre App im Abschnitt "Meine Anwendungen ". Nachdem Sie es gefunden haben, klicken Sie darauf, und Sie gelangen zu einer neuen Seite mit dem App-Namen plus Registrierung.

    Ihre neu registrierte App

  3. Scrollen Sie nach unten auf der Registrierungsseite, um den Abschnitt "Anwendungsgeheimnisse " und die Paket-SID für Ihre App zu finden. Kopieren Sie beide für die Verwendung beim Einrichten des Azure Notification Hubs-Diensts im nächsten Kapitel.

    Anwendungsgeheimnisse

Kapitel 3 – Einrichten des Azure-Portals: Erstellen des Notification Hubs-Diensts

Nachdem Ihre App-Anmeldeinformationen abgerufen wurden, müssen Sie zum Azure-Portal wechseln, in dem Sie einen Azure Notification Hubs-Dienst erstellen.

  1. Melden Sie sich beim Azure-Portalan.

    Hinweis

    Wenn Sie noch nicht über ein Azure-Konto verfügen, müssen Sie ein Konto erstellen. Wenn Sie diesem Lernprogramm in einer Unterrichts- oder Laborsituation folgen, bitten Sie Ihren Kursleiter oder einen der Betreuer, Hilfe beim Einrichten Ihres neuen Kontos zu erhalten.

  2. Nachdem Sie angemeldet sind, klicken Sie in der oberen linken Ecke auf "Neu", suchen Sie nach dem Benachrichtigungshub, und klicken Sie auf "EINGABETASTE".

    Nach Benachrichtigungshub suchen

    Hinweis

    Das Wort "Neu" wurde möglicherweise durch "Ressource erstellen" in neueren Portalen ersetzt.

  3. Die neue Seite enthält eine Beschreibung des Notification Hubs-Diensts . Wählen Sie unten links in dieser Eingabeaufforderung die Schaltfläche "Erstellen " aus, um eine Zuordnung zu diesem Dienst zu erstellen.

    Erstellen einer Benachrichtigungshubs-Instanz

  4. Nachdem Sie auf "Erstellen" geklickt haben:

    1. Fügen Sie ihren gewünschten Namen für diese Dienstinstanz ein.

    2. Stellen Sie einen Namespace bereit, den Sie dieser App zuordnen können.

    3. Wählen Sie einen Speicherortaus.

    4. Wählen Sie eine Ressourcengruppe aus, oder erstellen Sie eine neue. Eine Ressourcengruppe bietet eine Möglichkeit, die Abrechnung für eine Sammlung von Azure-Ressourcen zu überwachen, zu steuern, den Zugriff zu steuern, bereitzustellen und zu verwalten. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Laboren) zugeordnet sind, unter einer gemeinsamen Ressourcengruppe zu halten.

      Wenn Sie mehr über Azure-Ressourcengruppen erfahren möchten, folgen Sie diesem Link zum Verwalten einer Ressourcengruppe.

    5. Wählen Sie ein entsprechendes Abonnement aus.

    6. Sie müssen auch bestätigen, dass Sie die auf diesen Dienst angewendeten Allgemeinen Geschäftsbedingungen verstanden haben.

    7. Klicken Sie auf Erstellen.

      Eingeben von Dienstdetails

  5. Nachdem Sie auf "Erstellen" geklickt haben, müssen Sie warten, bis der Dienst erstellt wurde. Dies kann eine Minute dauern.

  6. Sobald die Dienstinstanz erstellt wurde, wird im Portal eine Benachrichtigung angezeigt.

    notification

  7. Klicken Sie in der Benachrichtigung auf die Schaltfläche "Zur Ressource wechseln", um Ihre neue Dienstinstanz zu erkunden. Sie werden zu Ihrer neuen Notification Hub-Dienstinstanz weitergeleitet.

    Screenshot der im Benachrichtigungsfenster hervorgehobenen Schaltfläche

  8. Klicken Sie auf der Übersichtsseite in der Mitte der Seite auf Windows (WNS). Der Bereich auf der rechten Seite ändert sich so, dass zwei Textfelder angezeigt werden, für die ihre Paket-SID und der Sicherheitsschlüssel von der zuvor eingerichteten App erforderlich sind.

    neu erstellte Hubs-Dienst

  9. Nachdem Sie die Details in die richtigen Felder kopiert haben, klicken Sie auf " Speichern", und Sie erhalten eine Benachrichtigung, wenn der Benachrichtigungshub erfolgreich aktualisiert wurde.

    Sicherheitsdetails nach unten kopieren

Kapitel 4 – Einrichten des Azure-Portals: Erstellen eines Tabellendiensts

Navigieren Sie nach dem Erstellen Ihrer Notification Hubs-Dienstinstanz zurück zu Ihrem Azure-Portal, in dem Sie einen Azure Tables Service erstellen, indem Sie eine Speicherressource erstellen.

  1. Falls noch nicht angemeldet, melden Sie sich beim Azure-Portal an.

  2. Klicken Sie nach der Anmeldung in der oberen linken Ecke auf "Neu ", suchen Sie nach "Speicherkonto", und klicken Sie auf " EINGABETASTE".

    Hinweis

    Das Wort "Neu" wurde möglicherweise durch "Ressource erstellen" in neueren Portalen ersetzt.

  3. Wählen Sie "Speicherkonto" aus – BLOB, Datei, Tabelle, Warteschlange aus der Liste.

    Nach Speicherkonto suchen

  4. Die neue Seite enthält eine Beschreibung des Speicherkontodiensts . Wählen Sie unten links in dieser Eingabeaufforderung die Schaltfläche "Erstellen " aus, um eine Instanz dieses Diensts zu erstellen.

    Speicherinstanz erstellen

  5. Nachdem Sie auf " Erstellen" geklickt haben, wird ein Bereich angezeigt:

    1. Fügen Sie ihren gewünschten Namen für diese Dienstinstanz ein (muss alle Kleinbuchstaben sein).

    2. Klicken Sie für das Bereitstellungsmodell auf "Ressourcen-Manager".

    3. Wählen Sie für "Kontotyp" im Dropdownmenü "Speicher" (allgemeine Version 1) aus.

    4. Wählen Sie einen geeigneten Speicherort aus.

    5. Wählen Sie für das Dropdownmenü "Replikation " die Option "Read-access-geo-redundant storage (RA-GRS)" aus.

    6. Klicken Sie auf "Standard" für "Leistung".

    7. Wählen Sie im abschnitt "Sichere Übertragung erforderlich" die Option "Deaktiviert" aus.

    8. Wählen Sie im Dropdownmenü "Abonnement " ein entsprechendes Abonnement aus.

    9. Wählen Sie eine Ressourcengruppe aus, oder erstellen Sie eine neue. Eine Ressourcengruppe bietet eine Möglichkeit, die Abrechnung für eine Sammlung von Azure-Ressourcen zu überwachen, zu steuern, den Zugriff zu steuern, bereitzustellen und zu verwalten. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Laboren) zugeordnet sind, unter einer gemeinsamen Ressourcengruppe zu halten.

      Wenn Sie mehr über Azure-Ressourcengruppen erfahren möchten, folgen Sie diesem Link zum Verwalten einer Ressourcengruppe.

    10. Lassen Sie virtuelle Netzwerke als deaktiviert, wenn dies eine Option für Sie ist.

    11. Klicken Sie auf Erstellen.

      Eingeben von Speicherdetails

  6. Nachdem Sie auf "Erstellen" geklickt haben, müssen Sie warten, bis der Dienst erstellt wurde. Dies kann eine Minute dauern.

  7. Sobald die Dienstinstanz erstellt wurde, wird im Portal eine Benachrichtigung angezeigt. Klicken Sie auf die Benachrichtigungen, um Ihre neue Dienstinstanz zu erkunden.

    Neue Speicherbenachrichtigung

  8. Klicken Sie in der Benachrichtigung auf die Schaltfläche "Zur Ressource wechseln", um Ihre neue Dienstinstanz zu erkunden. Sie werden zur neuen Übersichtsseite der Speicherdienstinstanz weitergeleitet.

    Screenshot der Schaltfläche

  9. Klicken Sie auf der Übersichtsseite rechts auf "Tabellen".

    Screenshot, der zeigt, wo Tabellen ausgewählt werden sollen.

  10. Der Bereich auf der rechten Seite ändert sich, um die Tabellendienstinformationen anzuzeigen, wobei Sie eine neue Tabelle hinzufügen müssen. Klicken Sie dazu auf die + Schaltfläche "Tabelle " in der oberen linken Ecke.

    Öffnen von Tabellen

  11. Es wird eine neue Seite angezeigt, wobei Sie einen Tabellennamen eingeben müssen. Dies ist der Name, den Sie verwenden, um auf die Daten in Ihrer Anwendung in späteren Kapiteln zu verweisen. Fügen Sie einen geeigneten Namen ein, und klicken Sie auf "OK".

    Neue Tabelle erstellen

  12. Nachdem die neue Tabelle erstellt wurde, können Sie sie auf der Seite "Tabellendienst " (unten) sehen.

    Neue Tabelle erstellt

Kapitel 5 – Abschließen der Azure-Tabelle in Visual Studio

Nachdem Ihr Tabellendienstspeicherkonto eingerichtet wurde, ist es an der Zeit, Daten hinzuzufügen, die zum Speichern und Abrufen von Informationen verwendet werden. Die Bearbeitung Ihrer Tabellen kann über Visual Studio erfolgen.

  1. Öffnen Sie Visual Studio.

  2. Klicken Sie im Menü auf "Cloud Explorer anzeigen>".

    Öffnen des Cloud-Explorers

  3. Der Cloud Explorer wird als angedocktes Element geöffnet (seien Sie geduldig, da das Laden möglicherweise Zeit in Anspruch nimmt).

    Hinweis

    Wenn das Abonnement, das Sie zum Erstellen Ihrer Speicherkonten verwendet haben, nicht sichtbar ist, stellen Sie sicher, dass Sie folgendes haben:

    • Angemeldet am gleichen Konto wie das Konto, das Sie für das Azure-Portal verwendet haben.

    • Wählen Sie Ihr Abonnement auf der Kontoverwaltungsseite aus (Möglicherweise müssen Sie einen Filter aus Ihren Kontoeinstellungen anwenden):

      Abonnement suchen

  4. Ihre Azure-Clouddienste werden angezeigt. Suchen Sie Speicherkonten , und klicken Sie auf den Pfeil links davon, um Ihre Konten zu erweitern.

    Speicherkonten öffnen

  5. Nach der Erweiterung sollte Ihr neu erstelltes Speicherkonto verfügbar sein. Klicken Sie auf den Pfeil links neben Ihrem Speicher, und suchen Sie dann nach dem Erweitern nach Tabellen , und klicken Sie auf den Pfeil daneben, um die Tabelle anzuzeigen, die Sie im letzten Kapitel erstellt haben. Doppelklicken Sie auf Ihre Tabelle.

    Tabelle mit geöffneten Szenenobjekten

  6. Ihre Tabelle wird in der Mitte des Visual Studio-Fensters geöffnet. Klicken Sie auf das Tabellensymbol mit dem + (Plus) darauf.

    Neue Tabelle hinzufügen

  7. Ein Fenster wird angezeigt, in dem Sie aufgefordert werden, eine Entität hinzuzufügen. Sie erstellen insgesamt drei Entitäten mit mehreren Eigenschaften. Sie werden feststellen, dass PartitionKey und RowKey bereits bereitgestellt werden, da diese von der Tabelle verwendet werden, um Ihre Daten zu finden.

    Partitions- und Zeilenschlüssel

  8. Aktualisieren Sie den Wert des PartitionKey und RowKey wie folgt (denken Sie daran, dies für jede hinzuzufügende Zeileneigenschaft zu tun, wobei der RowKey jedes Mal erhöht wird):

    korrekte Werte hinzufügen

  9. Klicken Sie auf " Eigenschaft hinzufügen", um zusätzliche Datenzeilen hinzuzufügen. Stellen Sie ihre erste leere Tabelle mit der folgenden Tabelle überein.

  10. Klicken Sie auf OK, wenn Sie fertig sind.

    Klicken Sie auf 'OK', wenn Sie fertig sind.

    Warnung

    Stellen Sie sicher, dass Sie den Typ der Einträge "X", "Y" und "Z" in "Double" geändert haben.

  11. Sie werden feststellen, dass ihre Tabelle jetzt eine Datenzeile enthält. Klicken Sie erneut auf das + Symbol (Plus), um eine weitere Entität hinzuzufügen.

    erste Zeile

  12. Erstellen Sie eine zusätzliche Eigenschaft, und legen Sie dann die Werte der neuen Entität so fest, dass sie mit den unten gezeigten übereinstimmen.

    Cube hinzufügen

  13. Wiederholen Sie den letzten Schritt, um eine weitere Entität hinzuzufügen. Legen Sie die Werte für diese Entität auf die unten angezeigten Werte fest.

    Zylinder hinzufügen

  14. Ihre Tabelle sollte nun wie die nachstehende aussehen.

    Tabelle abgeschlossen

  15. Sie haben dieses Kapitel abgeschlossen. Stellen Sie sicher, dass Sie speichern.

Kapitel 6 – Erstellen einer Azure-Funktions-App

Erstellen Sie eine Azure Function App, die von der Desktopanwendung aufgerufen wird, um den Tabellendienst zu aktualisieren und eine Benachrichtigung über den Benachrichtigungshub zu senden.

Zunächst müssen Sie eine Datei erstellen, mit der Ihre Azure-Funktion die benötigten Bibliotheken laden kann.

  1. Öffnen Sie Editor (drücken Sie windows-TASTE, und geben Sie Editor ein).

    Editor öffnen

  2. Fügen Sie bei geöffneter Editor-Struktur die JSON-Struktur darunter ein. Nachdem Sie dies getan haben, speichern Sie sie auf Ihrem Desktop als project.json. Es ist wichtig, dass die Benennung korrekt ist: Stellen Sie sicher, dass sie nicht über eine .txt Dateierweiterung verfügt. Diese Datei definiert die Bibliotheken, die Ihre Funktion verwendet, wenn Sie NuGet verwendet haben, wird sie vertraut aussehen.

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "7.0.0",
            "Microsoft.Azure.NotificationHubs" : "1.0.9",
            "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0"
        }
        }
    }
    }
    
  3. Melden Sie sich beim Azure-Portalan.

  4. Nachdem Sie angemeldet sind, klicken Sie in der oberen linken Ecke auf "Neu ", und suchen Sie nach Der Funktions-App, drücken Sie die EINGABETASTE.

    Suchen nach Funktions-App

    Hinweis

    Das Wort "Neu" wurde möglicherweise durch "Ressource erstellen" in neueren Portalen ersetzt.

  5. Die neue Seite enthält eine Beschreibung des Funktions-App-Diensts . Wählen Sie unten links in dieser Eingabeaufforderung die Schaltfläche "Erstellen " aus, um eine Zuordnung zu diesem Dienst zu erstellen.

    Funktions-App-Instanz

  6. Nachdem Sie auf "Erstellen" geklickt haben, geben Sie Folgendes ein:

    1. Fügen Sie für den App-Namen ihren gewünschten Namen für diese Dienstinstanz ein.

    2. Wählen Sie ein Abonnementaus.

    3. Wählen Sie das für Sie geeignete Preisniveau aus, wenn Sie zum ersten Mal einen Funktions-App-Dienst erstellen, sollte ihnen eine kostenlose Stufe zur Verfügung stehen.

    4. Wählen Sie eine Ressourcengruppe aus, oder erstellen Sie eine neue. Eine Ressourcengruppe bietet eine Möglichkeit, die Abrechnung für eine Sammlung von Azure-Ressourcen zu überwachen, zu steuern, den Zugriff zu steuern, bereitzustellen und zu verwalten. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Laboren) zugeordnet sind, unter einer gemeinsamen Ressourcengruppe zu halten.

      Wenn Sie mehr über Azure-Ressourcengruppen erfahren möchten, folgen Sie diesem Link zum Verwalten einer Ressourcengruppe.

    5. Klicken Sie für das Betriebssystem auf Windows, da dies die beabsichtigte Plattform ist.

    6. Wählen Sie einen Hostingplan aus (dieses Lernprogramm verwendet einen Verbrauchsplan.

    7. Wählen Sie einen Speicherort aus (wählen Sie denselben Speicherort wie der speicher aus, den Sie im vorherigen Schritt erstellt haben)

    8. Für den Abschnitt "Speicher " müssen Sie den Speicherdienst auswählen, den Sie im vorherigen Schritt erstellt haben.

    9. Sie benötigen keine Application Insights in dieser App, daher können Sie sie verlassen.

    10. Klicken Sie auf Erstellen.

      neue Instanz erstellen

  7. Nachdem Sie auf " Erstellen " geklickt haben, müssen Sie warten, bis der Dienst erstellt wurde, kann dies eine Minute dauern.

  8. Sobald die Dienstinstanz erstellt wurde, wird im Portal eine Benachrichtigung angezeigt.

    Neue Benachrichtigung

  9. Klicken Sie auf die Benachrichtigungen, um Ihre neue Dienstinstanz zu erkunden.

  10. Klicken Sie in der Benachrichtigung auf die Schaltfläche "Zur Ressource wechseln", um Ihre neue Dienstinstanz zu erkunden.

    Screenshot:

  11. Klicken Sie auf das + (Plus)-Symbol neben "Funktionen", um "Neu erstellen" zu erstellen.

    Neue Funktion hinzufügen

  12. Innerhalb des zentralen Bereichs wird das Fenster zum Erstellen von Funktionen angezeigt. Ignorieren Sie die Informationen in der oberen Hälfte des Panels, und klicken Sie auf " Benutzerdefinierte Funktion", die sich in der Nähe des unteren Bereichs befindet (im blauen Bereich wie unten).

    Benutzerdefinierte Funktion

  13. Die neue Seite im Fenster zeigt verschiedene Funktionstypen an. Scrollen Sie nach unten, um die violetten Typen anzuzeigen, und klicken Sie auf HTTP PUT-Element .

    http put link

    Wichtig

    Möglicherweise müssen Sie weiter unten auf der Seite scrollen (und dieses Bild sieht möglicherweise nicht genau so aus, wenn Azure Portal-Updates vorgenommen wurden), sie suchen jedoch nach einem Element namens HTTP PUT.

  14. Das HTTP PUT-Fenster wird angezeigt, in dem Sie die Funktion konfigurieren müssen (siehe unten für das Bild).

    1. Wählen Sie für "Sprache " im Dropdownmenü C# aus.

    2. Geben Sie für "Name " einen geeigneten Namen ein.

    3. Wählen Sie im Dropdownmenü "Authentifizierungsebene" die Option "Funktion" aus.

    4. Für den Abschnitt "Tabellenname " müssen Sie den genauen Namen verwenden, den Sie zuvor zum Erstellen des Tabellendiensts verwendet haben (einschließlich desselben Großbuchstabens).

    5. Verwenden Sie im Abschnitt "Speicherkontoverbindung " das Dropdownmenü, und wählen Sie dort Ihr Speicherkonto aus. Wenn sie nicht vorhanden ist, klicken Sie neben dem Abschnittstitel auf den neuen Link, um einen anderen Bereich anzuzeigen, in dem Ihr Speicherkonto aufgeführt werden soll.

      Screenshot des Abschnitts

  15. Klicken Sie auf " Erstellen ", und Sie erhalten eine Benachrichtigung, dass Ihre Einstellungen erfolgreich aktualisiert wurden.

    Create-Funktion

  16. Nachdem Sie auf "Erstellen" geklickt haben, werden Sie an den Funktions-Editor umgeleitet.

    Funktionscode aktualisieren

  17. Fügen Sie den folgenden Code in den Funktions-Editor ein (ersetzen Sie den Code in der Funktion):

    #r "Microsoft.WindowsAzure.Storage"
    
    using System;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Table;
    using Microsoft.Azure.NotificationHubs;
    using Newtonsoft.Json;
    
    public static async Task Run(UnityGameObject gameObj, CloudTable table, IAsyncCollector<Notification> notification, TraceWriter log)
    {
        //RowKey of the table object to be changed
        string rowKey = gameObj.RowKey;
    
        //Retrieve the table object by its RowKey
        TableOperation operation = TableOperation.Retrieve<UnityGameObject>("UnityPartitionKey", rowKey); 
    
        TableResult result = table.Execute(operation);
    
        //Create a UnityGameObject so to set its parameters
        UnityGameObject existingGameObj = (UnityGameObject)result.Result; 
    
        existingGameObj.RowKey = rowKey;
        existingGameObj.X = gameObj.X;
        existingGameObj.Y = gameObj.Y;
        existingGameObj.Z = gameObj.Z;
    
        //Replace the table appropriate table Entity with the value of the UnityGameObject
        operation = TableOperation.Replace(existingGameObj); 
    
        table.Execute(operation);
    
        log.Verbose($"Updated object position");
    
        //Serialize the UnityGameObject
        string wnsNotificationPayload = JsonConvert.SerializeObject(existingGameObj);
    
        log.Info($"{wnsNotificationPayload}");
    
        var headers = new Dictionary<string, string>();
    
        headers["X-WNS-Type"] = @"wns/raw";
    
        //Send the raw notification to subscribed devices
        await notification.AddAsync(new WindowsNotification(wnsNotificationPayload, headers)); 
    
        log.Verbose($"Sent notification");
    }
    
    // This UnityGameObject represent a Table Entity
    public class UnityGameObject : TableEntity
    {
        public string Type { get; set; }
        public double X { get; set; }
        public double Y { get; set; }
        public double Z { get; set; }
        public string RowKey { get; set; }
    }
    

    Hinweis

    Mithilfe der enthaltenen Bibliotheken empfängt die Funktion den Namen und die Position des Objekts, das in der Unity-Szene verschoben wurde (als C#-Objekt namens UnityGameObject). Dieses Objekt wird dann verwendet, um die Objektparameter in der erstellten Tabelle zu aktualisieren. Anschließend ruft die Funktion ihren erstellten Notification Hub-Dienst auf, wodurch alle abonnierten Anwendungen benachrichtigt werden.

  18. Klicken Sie mit dem Code an der Stelle auf " Speichern".

  19. Klicken Sie als Nächstes auf das < Symbol (Pfeil) auf der rechten Seite der Seite.

    Öffnen des Uploadbereichs

  20. Ein Bereich wird von rechts nach rechts geschoben. Klicken Sie in diesem Bereich auf "Hochladen", und ein Dateibrowser wird angezeigt.

  21. Navigieren Sie zu der zuvor in Editor erstellten project.json Datei, und klicken Sie dann auf die Schaltfläche "Öffnen". Diese Datei definiert die Bibliotheken, die Ihre Funktion verwendet.

    json hochladen

  22. Wenn die Datei hochgeladen wurde, wird sie im Bereich auf der rechten Seite angezeigt. Wenn Sie darauf klicken, wird sie im Funktions-Editor geöffnet. Es muss genau so aussehen wie das nächste Bild (unter Schritt 23).

  23. Klicken Sie dann im Bereich auf der linken Seite unter "Funktionen" auf den Link "Integrieren" .

    Integrationsfunktion

  24. Klicken Sie auf der nächsten Seite in der oberen rechten Ecke auf den erweiterten Editor (wie unten).

    Erweiterter Editor öffnen

  25. Im mittleren Bereich wird eine function.json Datei geöffnet, die durch den folgenden Codeausschnitt ersetzt werden muss. Dadurch wird die Funktion definiert, die Sie erstellen, und die Parameter, die an die Funktion übergeben werden.

    {
    "bindings": [
        {
        "authLevel": "function",
        "type": "httpTrigger",
        "methods": [
            "get",
            "post"
        ],
        "name": "gameObj",
        "direction": "in"
        },
        {
        "type": "table",
        "name": "table",
        "tableName": "SceneObjectsTable",
        "connection": "mrnothubstorage_STORAGE",
        "direction": "in"
        },
        {
        "type": "notificationHub",
        "direction": "out",
        "name": "notification",
        "hubName": "MR_NotHub_ServiceInstance",
        "connection": "MRNotHubNS_DefaultFullSharedAccessSignature_NH",
        "platform": "wns"
        }
    ]
    }
    
  26. Ihr Editor sollte nun wie das folgende Bild aussehen:

    zurück zum Standard-Editor

  27. Möglicherweise stellen Sie fest, dass die eingabeparameter, die Sie gerade eingefügt haben, möglicherweise nicht ihren Tabellen- und Speicherdetails entsprechen und daher mit Ihren Informationen aktualisiert werden müssen. Tun Sie dies hier nicht, da sie als Nächstes behandelt wird. Klicken Sie einfach auf den Link "Standard-Editor " in der oberen rechten Ecke der Seite, um zurück zu gelangen.

  28. Klicken Sie im Standard-Editor unter "Eingaben" auf "Azure Table Storage (Tabelle)".

    Tabelleneingaben

  29. Stellen Sie sicher, dass die folgenden Übereinstimmungen mit Ihren Informationen übereinstimmen, da sie unterschiedlich sein können (es gibt ein Bild unter den folgenden Schritten):

    1. Tabellenname: der Name der Tabelle, die Sie in Ihrem Azure Storage-, Tabellendienst erstellt haben.

    2. Verbindung mit Speicherkonto: Klicken Sie auf "Neu", das neben dem Dropdownmenü angezeigt wird, und rechts neben dem Fenster wird ein Bereich angezeigt.

      Screenshot des Fensters

      1. Wählen Sie Ihr Speicherkonto aus, das Sie zuvor erstellt haben, um die Funktions-Apps zu hosten.

      2. Sie werden feststellen, dass der Verbindungswert des Speicherkontos erstellt wurde.

      3. Stellen Sie sicher, dass Sie "Speichern" drücken, sobald Sie fertig sind.

    3. Die Eingabeseite sollte nun mit der folgenden Übereinstimmend übereinstimmen, wobei Ihre Informationen angezeigt werden.

      Eingaben abgeschlossen

  30. Klicken Sie als Nächstes auf Azure Notification Hub (Benachrichtigung) – unter "Ausgaben". Stellen Sie sicher, dass Folgendes Ihren Informationen entspricht, da sie möglicherweise anders sind (es gibt ein Bild unter den folgenden Schritten):

    1. Name des Benachrichtigungshubs: Dies ist der Name Ihrer Notification Hub-Dienstinstanz , die Sie zuvor erstellt haben.

    2. Namespaceverbindung des Notification Hubs: Klicken Sie auf "Neu", das neben dem Dropdownmenü angezeigt wird.

      Überprüfen von Ausgaben

    3. Das Popup "Verbindung " wird angezeigt (siehe abbildung unten), wo Sie den Namespace des Benachrichtigungshubs auswählen müssen, den Sie zuvor eingerichtet haben.

    4. Wählen Sie ihren Benachrichtigungshubnamen im mittleren Dropdownmenü aus.

    5. Legen Sie das Dropdownmenü "Richtlinie" auf "DefaultFullSharedAccessSignature" fest.

    6. Klicken Sie auf die Schaltfläche "Auswählen ", um zurück zu gelangen.

      Ausgabeaktualisierung

  31. Die Seite "Ausgaben" sollte nun mit der folgenden Übereinstimmend übereinstimmen, aber stattdessen mit Ihren Informationen. Stellen Sie sicher, dass Sie "Speichern" drücken.

Warnung

Bearbeiten Sie den Namen des Benachrichtigungshubs nicht direkt (dies sollte alles mit dem Erweiterter Editor erfolgen, sofern Sie die vorherigen Schritte richtig ausgeführt haben.

Screenshot der Seite

  1. An diesem Punkt sollten Sie die Funktion testen, um sicherzustellen, dass sie funktioniert. Gehen Sie hierzu folgendermaßen vor:

    1. Navigieren Sie erneut zur Funktionsseite:

      Screenshot der Seite

    2. Klicken Sie auf der Funktionsseite auf die Registerkarte "Test " ganz rechts auf der Seite, um das Blatt "Test " zu öffnen:

      Screenshot der Seite

    3. Fügen Sie im Textfeld "Anforderungstext " des Blatts den folgenden Code ein:

      {  
          "Type":null,
          "X":3,
          "Y":0,
          "Z":1,
          "PartitionKey":null,
          "RowKey":"Obj2",
          "Timestamp":"0001-01-01T00:00:00+00:00",
          "ETag":null
      }
      
    4. Wenn der Testcode vorhanden ist, klicken Sie unten rechts auf die Schaltfläche "Ausführen ", und der Test wird ausgeführt. Die Ausgabeprotokolle des Tests werden im Konsolenbereich unterhalb des Funktionscodes angezeigt.

      Screenshot der Ausgabeprotokolle des Tests im Konsolenbereich.

    Warnung

    Wenn der obige Test fehlschlägt, müssen Sie überprüfen, ob Sie die oben genannten Schritte genau befolgt haben, insbesondere die Einstellungen im Integrationsbereich.

Kapitel 7 – Einrichten des Desktop Unity-Projekts

Wichtig

Die Desktopanwendung, die Sie jetzt erstellen, funktioniert nicht im Unity-Editor. Sie muss außerhalb des Editors ausgeführt werden, und zwar nach dem Erstellen der Anwendung mithilfe von Visual Studio (oder der bereitgestellten Anwendung).

Im Folgenden sehen Sie eine typische Einrichtung für die Entwicklung mit Unity und Mixed Reality und ist daher eine gute Vorlage für andere Projekte.

Richten Sie Ihr immersives Mixed Reality-Headset ein, und testen Sie es.

Hinweis

Für diesen Kurs benötigen Sie keine Motion Controller. Wenn Sie Unterstützung beim Einrichten des immersiven Headsets benötigen, folgen Sie diesem Link zum Einrichten von Windows Mixed Reality.

  1. Öffnen Sie Unity , und klicken Sie auf "Neu".

    Screenshot des Fensters

  2. Sie müssen einen Unity-Projektnamen angeben, UnityDesktopNotifHub einfügen. Stellen Sie sicher, dass der Projekttyp auf 3D festgelegt ist. Legen Sie den Speicherort an einer für Sie geeigneten Stelle fest (denken Sie daran, dass die Stammverzeichnisse besser sind). Klicken Sie dann auf "Projekt erstellen".

    Erstellen des Projekts

  3. Wenn Unity geöffnet ist, lohnt es sich, den Standardmäßigen Skript-Editor auf Visual Studio festzulegen. Wechseln Sie zu "Einstellungen bearbeiten>", und navigieren Sie dann im neuen Fenster zu "Externe Tools". Ändern Sie den externen Skript-Editor in Visual Studio 2017. Schließen Sie das Fenster Einstellungen.

    Festlegen externer VS-Tools

  4. Wechseln Sie als Nächstes zu "Dateibuildeinstellungen>", und wählen Sie Universelle Windows-Plattform aus, und klicken Sie dann auf die Schaltfläche "Plattform wechseln", um Ihre Auswahl anzuwenden.

    Plattformen wechseln

  5. Stellen Sie sicher>, dass:

    1. Zielgerät ist auf "Beliebiges Gerät" festgelegt.

      Diese Anwendung ist für Ihren Desktop vorgesehen, daher muss es sich um ein beliebiges Gerät handeln .

    2. Buildtyp ist auf D3D festgelegt

    3. SDK ist auf "Neueste Installation" festgelegt.

    4. Visual Studio-Version ist auf "Neueste Installation" festgelegt.

    5. Build und Ausführung ist auf den lokalen Computer festgelegt.

    6. Hier lohnt es sich, die Szene zu speichern und dem Build hinzuzufügen.

      1. Wählen Sie dazu "Offene Szenen hinzufügen" aus. Ein Speicherfenster wird angezeigt.

        Screenshot, der die hervorgehobene Option

      2. Erstellen Sie einen neuen Ordner für diese Und jede zukünftige Szene, und wählen Sie dann die Schaltfläche "Neuer Ordner " aus, um einen neuen Ordner zu erstellen, nennen Sie ihn "Szenen".

        Screenshot eines neuen Szenenordners, der mit hervorgehobenem Ordner

      3. Öffnen Sie den neu erstellten Ordner "Szenen", und drücken Sie dann im Feld "Dateiname:" NH_Desktop_Scene, und drücken Sie dann "Speichern".

        neue NH_Desktop_Scene

    7. Die übrigen Einstellungen in den Buildeinstellungen sollten jetzt als Standard beibehalten werden.

  6. Klicken Sie im selben Fenster auf die Schaltfläche "Spielereinstellungen ", wird dadurch der zugehörige Bereich im Bereich geöffnet, in dem sich der Inspektor befindet.

  7. In diesem Bereich müssen einige Einstellungen überprüft werden:

    1. Auf der Registerkarte "Andere Einstellungen" folgendes:

      1. Skripting-Runtime-Version sollte experimental sein (.NET 4.6-Entsprechung)

      2. Scripting Back-End sollte .NET sein

      3. API-Kompatibilitätsstufe sollte .NET 4.6 sein

        4.6 Net-Version

    2. Aktivieren Sie auf der Registerkarte "Veröffentlichungseinstellungen " unter "Funktionen" Folgendes:

      • InternetClient

        Screenshot, der internetClient unter

  8. Zurück in Buildeinstellungen Unity C#-Projekte ist nicht mehr abgeblentet. Aktivieren Sie das Kontrollkästchen neben diesem.

  9. Schließen Sie das Fenster Buildeinstellungen.

  10. Speichern Sie Ihre Szene und Projektdatei >speichern Szene / Datei>speichern Projekt.

    Wichtig

    Wenn Sie die Unity Set up-Komponente für dieses Projekt (Desktop-App) überspringen und direkt in Code fortfahren möchten, können Sie dieses Unitypackage herunterladen, es als benutzerdefiniertes Paket in Ihr Projekt importieren und dann von Kapitel 9 fortfahren. Sie müssen weiterhin die Skriptkomponenten hinzufügen.

Kapitel 8 – Importieren der DLLs in Unity

Sie verwenden Azure Storage für Unity (das selbst das .Net SDK für Azure nutzt). Weitere Informationen hierzu folgen diesem Link zu Azure Storage für Unity.

Es gibt derzeit ein bekanntes Problem in Unity, das erfordert, dass Plug-Ins nach dem Import neu konfiguriert werden. Diese Schritte (4 - 7 in diesem Abschnitt) sind nach der Behebung des Fehlers nicht mehr erforderlich.

Um das SDK in Ihr eigenes Projekt zu importieren, stellen Sie sicher, dass Sie das neueste Unitypackage von GitHub heruntergeladen haben. Gehen Sie nun wie folgt vor:

  1. Fügen Sie das UNITY-Paket mithilfe der Menüoption "Benutzerdefiniertes > Paket > importieren" zu Unity hinzu.

  2. Im Popupfeld "Unity-Paket importieren" können Sie alles unter Plug-In-Speicher> auswählen. Deaktivieren Sie alles andere, da es für diesen Kurs nicht erforderlich ist.

    In Paket importieren

  3. Klicken Sie auf die Schaltfläche "Importieren ", um dem Projekt die Elemente hinzuzufügen.

  4. Wechseln Sie in der Project-Ansicht zum Speicherordner unter Plugins, und wählen Sie nur die folgenden Plug-Ins aus:

    • Microsoft.Data.Edm
    • Microsoft.Data.OData
    • Microsoft.WindowsAzure.Storage
    • Newtonsoft.Json
    • System.Spatial

Deaktivieren der Option

  1. Wenn diese spezifischen Plug-Ins ausgewählt sind, deaktivieren Sie "Beliebige Plattform", und deaktivieren Sie "WSAPlayer" und klicken Sie dann auf "Übernehmen".

    Plattform-DLLs anwenden

    Hinweis

    Wir markieren diese speziellen Plug-Ins, die nur im Unity-Editor verwendet werden sollen. Dies liegt daran, dass es verschiedene Versionen derselben Plug-Ins im WSA-Ordner gibt, die verwendet werden, nachdem das Projekt aus Unity exportiert wurde.

  2. Wählen Sie im Ordner "Speicher-Plug-In " nur Folgendes aus:

    • Microsoft.Data.Services.Client

      set don't process for dlls

  3. Aktivieren Sie das Kontrollkästchen "Nicht verarbeiten " unter "Plattformeinstellungen ", und klicken Sie auf " Übernehmen".

    keine Verarbeitung anwenden

    Hinweis

    Wir markieren dieses Plug-In "Nicht verarbeiten", da der Unity-Assemblypatcher Schwierigkeiten bei der Verarbeitung dieses Plug-Ins hat. Das Plug-In funktioniert weiterhin, obwohl es nicht verarbeitet wird.

Kapitel 9 – Erstellen der TableToScene-Klasse im Desktop Unity-Projekt

Sie müssen nun die Skripts erstellen, die den Code enthalten, um diese Anwendung auszuführen.

Das erste Skript, das Sie erstellen müssen, ist TableToScene, das für Folgendes verantwortlich ist:

  • Lesen von Entitäten innerhalb der Azure-Tabelle.
  • Bestimmen Sie mithilfe der Tabellendaten, welche Objekte spawnen sollen, und in welcher Position.

Das zweite Skript, das Sie erstellen müssen, ist CloudScene, das für Folgendes verantwortlich ist:

  • Registrieren des Linksklickereignisses, damit der Benutzer Objekte in die Szene ziehen kann.
  • Serialisieren der Objektdaten aus dieser Unity-Szene und Senden an die Azure-Funktions-App.

So erstellen Sie diese Klasse:

  1. Klicken Sie mit der rechten Maustaste auf den Ressourcenordner, der sich im Projektbereich befindet, "Ordner erstellen>". Benennen Sie den Ordner Skripts.

    Ordner

    Ordner

  2. Doppelklicken Sie auf den soeben erstellten Ordner, um ihn zu öffnen.

  3. Klicken Sie mit der rechten Maustaste in den Ordner "Skripts", und klicken Sie auf "C#-Skript erstellen>". Nennen Sie das Skript TableToScene.

    Screenshot, der zeigt, wie das neue Skript TableToScene umbenennen

  4. Doppelklicken Sie auf das Skript, um es in Visual Studio 2017 zu öffnen.

  5. Fügen Sie die folgenden Namespaces hinzu:

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Table;
    using UnityEngine;
    
  6. Fügen Sie in der Klasse die folgenden Variablen ein:

        /// <summary>    
        /// allows this class to behave like a singleton
        /// </summary>    
        public static TableToScene instance;
    
        /// <summary>    
        /// Insert here you Azure Storage name     
        /// </summary>    
        private string accountName = " -- Insert your Azure Storage name -- ";
    
        /// <summary>    
        /// Insert here you Azure Storage key    
        /// </summary>    
        private string accountKey = " -- Insert your Azure Storage key -- ";
    

    Hinweis

    Ersetzen Sie den AccountName-Wert durch Ihren Azure Storage Service-Namen und accountKey-Wert durch den Schlüsselwert, der im Azure Storage-Dienst im Azure-Portal gefunden wurde (siehe Abbildung unten).

    Kontoschlüssel abrufen

  7. Fügen Sie nun die Methoden Start() und Awake() hinzu, um die Klasse zu initialisieren.

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {  
            // Call method to populate the scene with new objects as 
            // pecified in the Azure Table
            PopulateSceneFromTableAsync();
        }
    
  8. Fügen Sie in der TableToScene-Klasse die Methode hinzu, die die Werte aus der Azure-Tabelle abruft, und verwenden Sie sie, um die entsprechenden Grundtypen in der Szene zu spawnen.

        /// <summary>    
        /// Populate the scene with new objects as specified in the Azure Table    
        /// </summary>    
        private async void PopulateSceneFromTableAsync()
        {
            // Obtain credentials for the Azure Storage
            StorageCredentials creds = new StorageCredentials(accountName, accountKey);
    
            // Storage account
            CloudStorageAccount account = new CloudStorageAccount(creds, useHttps: true);
    
            // Storage client
            CloudTableClient client = account.CreateCloudTableClient(); 
    
            // Table reference
            CloudTable table = client.GetTableReference("SceneObjectsTable");
    
            TableContinuationToken token = null;
    
            // Query the table for every existing Entity
            do
            {
                // Queries the whole table by breaking it into segments
                // (would happen only if the table had huge number of Entities)
                TableQuerySegment<AzureTableEntity> queryResult = await table.ExecuteQuerySegmentedAsync(new TableQuery<AzureTableEntity>(), token); 
    
                foreach (AzureTableEntity entity in queryResult.Results)
                {
                    GameObject newSceneGameObject = null;
                    Color newColor;
    
                    // check for the Entity Type and spawn in the scene the appropriate Primitive
                    switch (entity.Type)
                    {
                        case "Cube":
                            // Create a Cube in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
                            newColor = Color.blue;
                            break;
    
                        case "Sphere":
                            // Create a Sphere in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                            newColor = Color.red;
                            break;
    
                        case "Cylinder":
                            // Create a Cylinder in the scene
                            newSceneGameObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                            newColor = Color.yellow;
                            break;
                        default:
                            newColor = Color.white;
                            break;
                    }
    
                    newSceneGameObject.name = entity.RowKey;
    
                    newSceneGameObject.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse"))
                    {
                        color = newColor
                    };
    
                    //check for the Entity X,Y,Z and move the Primitive at those coordinates
                    newSceneGameObject.transform.position = new Vector3((float)entity.X, (float)entity.Y, (float)entity.Z);
                }
    
                // if the token is null, it means there are no more segments left to query
                token = queryResult.ContinuationToken;
            }
    
            while (token != null);
        }
    
  9. Außerhalb der TableToScene-Klasse müssen Sie die von der Anwendung verwendete Klasse definieren, um die Tabellenentitäten zu serialisieren und deserialisieren.

        /// <summary>
        /// This objects is used to serialize and deserialize the Azure Table Entity
        /// </summary>
        [System.Serializable]
        public class AzureTableEntity : TableEntity
        {
            public AzureTableEntity(string partitionKey, string rowKey)
                : base(partitionKey, rowKey) { }
    
            public AzureTableEntity() { }
            public string Type { get; set; }
            public double X { get; set; }
            public double Y { get; set; }
            public double Z { get; set; }
        }
    
  10. Stellen Sie sicher, dass Sie speichern, bevor Sie zum Unity-Editor zurückkehren.

  11. Klicken Sie im Hierarchiebereich auf die Hauptkamera, damit die zugehörigen Eigenschaften im Inspektor angezeigt werden.

  12. Wählen Sie im geöffneten Ordner "Skripts" die Datei "TableToScene" aus, und ziehen Sie sie auf die Hauptkamera. Das Ergebnis sollte wie folgt sein:

    Hinzufügen eines Skripts zur Hauptkamera

Kapitel 10 – Erstellen der CloudScene-Klasse im Desktop Unity-Projekt

Das zweite Skript, das Sie erstellen müssen, ist CloudScene, das für Folgendes verantwortlich ist:

  • Registrieren des Linksklickereignisses, damit der Benutzer Objekte in die Szene ziehen kann.

  • Serialisieren der Objektdaten aus dieser Unity-Szene und Senden an die Azure-Funktions-App.

So erstellen Sie das zweite Skript:

  1. Klicken Sie mit der rechten Maustaste in den Ordner "Skripts ", klicken Sie auf " Erstellen", "C#-Skript". Benennen des Skripts "CloudScene"

    Screenshot, der zeigt, wie das neue Skript CloudScene umbenennen

  2. Fügen Sie die folgenden Namespaces hinzu:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.Networking;
    
  3. Fügen Sie die folgenden Variablen ein:

        /// <summary>
        /// Allows this class to behave like a singleton
        /// </summary>
        public static CloudScene instance;
    
        /// <summary>
        /// Insert here you Azure Function Url
        /// </summary>
        private string azureFunctionEndpoint = "--Insert here you Azure Function Endpoint--";
    
        /// <summary>
        /// Flag for object being moved
        /// </summary>
        private bool gameObjHasMoved;
    
        /// <summary>
        /// Transform of the object being dragged by the mouse
        /// </summary>
        private Transform gameObjHeld;
    
        /// <summary>
        /// Class hosted in the TableToScene script
        /// </summary>
        private AzureTableEntity azureTableEntity;
    
  4. Ersetzen Sie den AzureFunctionEndpoint-Wert durch Ihre Azure Function App-URL, die im Azure Function App Service im Azure-Portal enthalten ist, wie in der abbildung unten dargestellt:

    Get-Funktions-URL

  5. Fügen Sie nun die Methoden Start() und Awake() hinzu, um die Klasse zu initialisieren.

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // initialise an AzureTableEntity
            azureTableEntity = new AzureTableEntity();
        }
    
  6. Fügen Sie in der Update() -Methode den folgenden Code hinzu, der die Mauseingabe und das Ziehen erkennt, wodurch gameObjects wiederum in der Szene verschoben werden. Wenn der Benutzer ein Objekt gezogen und abgelegt hat, wird der Name und die Koordinaten des Objekts an die Methode UpdateCloudScene()übergeben, der den Azure Function App-Dienst aufruft, der die Azure-Tabelle aktualisiert und die Benachrichtigung auslöst.

        /// <summary>
        /// Update is called once per frame
        /// </summary>
        void Update()
        {
            //Enable Drag if button is held down
            if (Input.GetMouseButton(0))
            {
                // Get the mouse position
                Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10);
    
                Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePosition);
    
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    
                RaycastHit hit;
    
                // Raycast from the current mouse position to the object overlapped by the mouse
                if (Physics.Raycast(ray, out hit))
                {
                    // update the position of the object "hit" by the mouse
                    hit.transform.position = objPos;
    
                    gameObjHasMoved = true;
    
                    gameObjHeld = hit.transform;
                }
            }
    
            // check if the left button mouse is released while holding an object
            if (Input.GetMouseButtonUp(0) && gameObjHasMoved)
            {
                gameObjHasMoved = false;
    
                // Call the Azure Function that will update the appropriate Entity in the Azure Table
                // and send a Notification to all subscribed Apps
                Debug.Log("Calling Azure Function");
    
                StartCoroutine(UpdateCloudScene(gameObjHeld.name, gameObjHeld.position.x, gameObjHeld.position.y, gameObjHeld.position.z));
            }
        }
    
  7. Fügen Sie nun die UpdateCloudScene() -Methode wie folgt hinzu:

        private IEnumerator UpdateCloudScene(string objName, double xPos, double yPos, double zPos)
        {
            WWWForm form = new WWWForm();
    
            // set the properties of the AzureTableEntity
            azureTableEntity.RowKey = objName;
    
            azureTableEntity.X = xPos;
    
            azureTableEntity.Y = yPos;
    
            azureTableEntity.Z = zPos;
    
            // Serialize the AzureTableEntity object to be sent to Azure
            string jsonObject = JsonConvert.SerializeObject(azureTableEntity);
    
            using (UnityWebRequest www = UnityWebRequest.Post(azureFunctionEndpoint, jsonObject))
            {
                byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonObject);
    
                www.uploadHandler = new UploadHandlerRaw(jsonToSend);
    
                www.uploadHandler.contentType = "application/json";
    
                www.downloadHandler = new DownloadHandlerBuffer();
    
                www.SetRequestHeader("Content-Type", "application/json");
    
                yield return www.SendWebRequest();
    
                string response = www.responseCode.ToString();
            }
        }
    
  8. Speichern sie den Code, und kehren Sie zu Unity zurück.

  9. Ziehen Sie das CloudScene-Skript auf die Hauptkamera.

    1. Klicken Sie im Hierarchiebereich auf die Hauptkamera, damit die zugehörigen Eigenschaften im Inspektor angezeigt werden.

    2. Wählen Sie mit geöffnetem Ordner "Skripts" das CloudScene-Skript aus, und ziehen Sie es auf die Hauptkamera. Das Ergebnis sollte wie folgt sein:

      Ziehen des Cloudskripts auf die Hauptkamera

Kapitel 11 – Erstellen des Desktopprojekts zu UWP

Alles, was für den Unity-Abschnitt dieses Projekts erforderlich ist, wurde nun abgeschlossen.

  1. Navigieren Sie zu Buildeinstellungen (Dateibuildeinstellungen>).

  2. Klicken Sie im Fenster "Buildeinstellungen " auf "Erstellen".

    Screenshot des Fensters

  3. In einem Explorer Fenster wird ein Popupfenster angezeigt, in dem Sie aufgefordert werden, einen Speicherort zum Erstellen einzufordern. Erstellen Sie einen neuen Ordner (indem Sie in der oberen linken Ecke auf "Neuer Ordner" klicken), und nennen Sie ihn BUILDS.

    Neuer Ordner für Build

    1. Öffnen Sie den neuen BUILDS-Ordner, und erstellen Sie einen anderen Ordner (erneut unter Verwendung des neuen Ordners), und nennen Sie ihn NH_Desktop_App.

      Ordnername NH_Desktop_App

    2. Wenn die NH_Desktop_App ausgewählt ist. klicken Sie auf "Ordner auswählen". Das Projekt dauert eine Minute oder so, bis das Projekt erstellt wird.

  4. Nach dem Build wird Explorer angezeigt, der den Speicherort Ihres neuen Projekts anzeigt. Es muss jedoch nicht geöffnet werden, da Sie zuerst das andere Unity-Projekt in den nächsten Kapiteln erstellen müssen.

Kapitel 12 – Einrichten des Mixed Reality Unity-Projekts

Im Folgenden sehen Sie eine typische Einrichtung für die Entwicklung mit mixed Reality und ist daher eine gute Vorlage für andere Projekte.

  1. Öffnen Sie Unity , und klicken Sie auf "Neu".

    Screenshot des Fensters

  2. Sie müssen jetzt einen Unity-Projektnamen angeben, UnityMRNotifHub einfügen. Stellen Sie sicher, dass der Projekttyp auf 3D festgelegt ist. Legen Sie den Speicherort an einer für Sie geeigneten Stelle fest (denken Sie daran, dass die Stammverzeichnisse besser sind). Klicken Sie dann auf "Projekt erstellen".

    Name UnityMRNotifHub

  3. Wenn Unity geöffnet ist, lohnt es sich, den Standardmäßigen Skript-Editor auf Visual Studio festzulegen. Wechseln Sie zu "Einstellungen bearbeiten>", und navigieren Sie dann im neuen Fenster zu "Externe Tools". Ändern Sie den externen Skript-Editor in Visual Studio 2017. Schließen Sie das Fenster Einstellungen.

    Festlegen des externen Editors auf VS

  4. Wechseln Sie als Nächstes zu "Dateibuildeinstellungen>", und wechseln Sie zu Universelle Windows-Plattform, indem Sie auf die Schaltfläche "Plattform wechseln" klicken.

    Wechseln von Plattformen zu UWP

  5. Wechseln Sie zu "Dateibuildeinstellungen>", und stellen Sie sicher, dass:

    1. Zielgerät ist auf "Beliebiges Gerät" festgelegt.

      Legen Sie für Microsoft HoloLens das Zielgerät auf HoloLens fest.

    2. Buildtyp ist auf D3D festgelegt

    3. SDK ist auf "Neueste Installation" festgelegt.

    4. Visual Studio-Version ist auf "Neueste Installation" festgelegt.

    5. Build und Ausführung ist auf den lokalen Computer festgelegt.

    6. Hier lohnt es sich, die Szene zu speichern und dem Build hinzuzufügen.

      1. Wählen Sie dazu "Offene Szenen hinzufügen" aus. Ein Speicherfenster wird angezeigt.

        Screenshot des Fensters

      2. Erstellen Sie einen neuen Ordner für diese Und jede zukünftige Szene, und wählen Sie dann die Schaltfläche "Neuer Ordner " aus, um einen neuen Ordner zu erstellen, nennen Sie ihn "Szenen".

        Screenshot mit hervorgehobener Option

      3. Öffnen Sie den neu erstellten Ordner "Szenen", und drücken Sie dann im Feld "Dateiname": "Textfeld", geben Sie NH_MR_Scene ein, und drücken Sie dann "Speichern".

        neue Szene - NH_MR_Scene

    7. Die übrigen Einstellungen in den Buildeinstellungen sollten jetzt als Standard beibehalten werden.

  6. Klicken Sie im selben Fenster auf die Schaltfläche "Spielereinstellungen ", wird dadurch der zugehörige Bereich im Bereich geöffnet, in dem sich der Inspektor befindet.

    Spielereinstellungen öffnen

  7. In diesem Bereich müssen einige Einstellungen überprüft werden:

    1. Auf der Registerkarte "Andere Einstellungen" folgendes:

      1. Skripting-Runtime-Version sollte experimental sein (.NET 4.6-Entsprechung)

      2. Scripting Back-End sollte .NET sein

      3. API-Kompatibilitätsstufe sollte .NET 4.6 sein

        API-Kompatibilität

    2. Klicken Sie weiter unten im Panel unter "XR-Einstellungen" (unter "Veröffentlichungseinstellungen" zu finden), und vergewissern Sie sich, dass das Windows Mixed Reality SDK hinzugefügt wird.

      XR-Einstellungen aktualisieren

    3. Aktivieren Sie auf der Registerkarte "Veröffentlichungseinstellungen " unter "Funktionen" Folgendes:

      • InternetClient

        Screenshot der Registerkarte

  8. Zurück in den Buildeinstellungen ist Unity C#-Projekte nicht mehr abgeblentet: Aktivieren Sie das Kontrollkästchen neben diesem.

  9. Schließen Sie mit diesen Änderungen das Fenster "Buildeinstellungen".

  10. Speichern Sie Ihre Szene und Projektdatei >speichern Szene / Datei>speichern Projekt.

    Wichtig

    Wenn Sie die Unity Set up-Komponente für dieses Projekt (Mixed Reality-App) überspringen und direkt in Code fortfahren möchten, können Sie dieses Unitypackage herunterladen, es als benutzerdefiniertes Paket in Ihr Projekt importieren und dann von Kapitel 14 fortfahren. Sie müssen weiterhin die Skriptkomponenten hinzufügen.

Kapitel 13 – Importieren der DLLs im Mixed Reality Unity-Projekt

Sie verwenden Azure Storage für Unity-Bibliothek (die das .Net SDK für Azure verwendet). Folgen Sie diesem Link zur Verwendung von Azure Storage mit Unity. Es gibt derzeit ein bekanntes Problem in Unity, das erfordert, dass Plug-Ins nach dem Import neu konfiguriert werden. Diese Schritte (4 - 7 in diesem Abschnitt) sind nach der Behebung des Fehlers nicht mehr erforderlich.

Um das SDK in Ihr eigenes Projekt zu importieren, stellen Sie sicher, dass Sie das neueste Unitypackage heruntergeladen haben. Gehen Sie nun wie folgt vor:

  1. Fügen Sie die .unitypackage, die Sie aus der obigen Version heruntergeladen haben, zu Unity hinzu, indem Sie die Menüoption "Paketimportpaket>>importieren" verwenden.

  2. Im Popupfeld "Unity-Paket importieren" können Sie alles unter Plug-In-Speicher> auswählen.

    Importpaket

  3. Klicken Sie auf die Schaltfläche "Importieren ", um dem Projekt die Elemente hinzuzufügen.

  4. Wechseln Sie in der Project-Ansicht zum Speicherordner unter Plugins, und wählen Sie nur die folgenden Plug-Ins aus:

    • Microsoft.Data.Edm
    • Microsoft.Data.OData
    • Microsoft.WindowsAzure.Storage
    • Newtonsoft.Json
    • System.Spatial

    Plug-Ins auswählen

  5. Wenn diese spezifischen Plug-Ins ausgewählt sind, deaktivieren Sie "Beliebige Plattform", und deaktivieren Sie "WSAPlayer" und klicken Sie dann auf "Übernehmen".

    Plattformänderungen anwenden

    Hinweis

    Sie markieren diese speziellen Plug-Ins, die nur im Unity-Editor verwendet werden sollen. Dies liegt daran, dass es verschiedene Versionen derselben Plug-Ins im WSA-Ordner gibt, die verwendet werden, nachdem das Projekt aus Unity exportiert wurde.

  6. Wählen Sie im Ordner "Speicher-Plug-In " nur Folgendes aus:

    • Microsoft.Data.Services.Client

      Auswählen des Datendiensteclients

  7. Aktivieren Sie das Kontrollkästchen "Nicht verarbeiten " unter "Plattformeinstellungen ", und klicken Sie auf " Übernehmen".

    Nicht verarbeiten

    Hinweis

    Sie markieren dieses Plug-In "Nicht verarbeiten", da der Unity-Assemblypatcher Schwierigkeiten bei der Verarbeitung dieses Plug-Ins hat. Das Plug-In funktioniert weiterhin, obwohl es nicht verarbeitet wird.

Kapitel 14 – Erstellen der TableToScene-Klasse im Mixed Reality Unity-Projekt

Die TableToScene-Klasse ist identisch mit der in Kapitel 9 erläuterten Klasse. Erstellen Sie dieselbe Klasse im Mixed Reality Unity-Projekt nach dem in Kapitel 9 erläuterten Verfahren.

Nachdem Sie dieses Kapitel abgeschlossen haben, haben beide Unity-Projekte diese Klasse auf der Hauptkamera eingerichtet.

Kapitel 15 – Erstellen der NotificationReceiver-Klasse im Mixed Reality Unity-Projekt

Das zweite Skript, das Sie erstellen müssen, ist NotificationReceiver, das für Folgendes zuständig ist:

  • Registrieren der App beim Benachrichtigungshub bei der Initialisierung.
  • Lauschen auf Benachrichtigungen, die vom Benachrichtigungshub stammen.
  • Deserialisieren der Objektdaten von empfangenen Benachrichtigungen.
  • Verschieben Sie die GameObjects in der Szene basierend auf den deserialisierten Daten.

So erstellen Sie das NotificationReceiver-Skript :

  1. Klicken Sie mit der rechten Maustaste in den Ordner "Skripts ", klicken Sie auf " Erstellen", "C#-Skript". Nennen Sie das Skript NotificationReceiver.

    neues c#-Skript erstellenname it NotificationReceiver

  2. Doppelklicken Sie auf das Skript, um es zu öffnen.

  3. Fügen Sie die folgenden Namespaces hinzu:

    //using Microsoft.WindowsAzure.Messaging;
    using Newtonsoft.Json;
    using System;
    using System.Collections;
    using UnityEngine;
    
    #if UNITY_WSA_10_0 && !UNITY_EDITOR
    using Windows.Networking.PushNotifications;
    #endif
    
  4. Fügen Sie die folgenden Variablen ein:

        /// <summary>
        /// allows this class to behave like a singleton
        /// </summary>
        public static NotificationReceiver instance;
    
        /// <summary>
        /// Value set by the notification, new object position
        /// </summary>
        Vector3 newObjPosition;
    
        /// <summary>
        /// Value set by the notification, object name
        /// </summary>
        string gameObjectName;
    
        /// <summary>
        /// Value set by the notification, new object position
        /// </summary>
        bool notifReceived;
    
        /// <summary>
        /// Insert here your Notification Hub Service name 
        /// </summary>
        private string hubName = " -- Insert the name of your service -- ";
    
        /// <summary>
        /// Insert here your Notification Hub Service "Listen endpoint"
        /// </summary>
        private string hubListenEndpoint = "-Insert your Notification Hub Service Listen endpoint-";
    
  5. Ersetzen Sie den HubName-Wert durch ihren Namen des Notification Hub Service und den HubListenEndpoint-Wert durch den Endpunktwert, der auf der Registerkarte "Zugriffsrichtlinien", Azure Notification Hub Service, im Azure-Portal gefunden wurde (siehe abbildung unten).

    Richtlinienendpunkt für Benachrichtigungshubs einfügen

  6. Fügen Sie nun die Methoden Start() und Awake() hinzu, um die Klasse zu initialisieren.

        /// <summary>
        /// Triggers before initialization
        /// </summary>
        void Awake()
        {
            // static instance of this class
            instance = this;
        }
    
        /// <summary>
        /// Use this for initialization
        /// </summary>
        void Start()
        {
            // Register the App at launch
            InitNotificationsAsync();
    
            // Begin listening for notifications
            StartCoroutine(WaitForNotification());
        }
    
  7. Fügen Sie die WaitForNotification-Methode hinzu, damit die App Benachrichtigungen aus der Notification Hub Library empfangen kann, ohne mit dem Hauptthread zusammenzustoßen:

        /// <summary>
        /// This notification listener is necessary to avoid clashes 
        /// between the notification hub and the main thread   
        /// </summary>
        private IEnumerator WaitForNotification()
        {
            while (true)
            {
                // Checks for notifications each second
                yield return new WaitForSeconds(1f);
    
                if (notifReceived)
                {
                    // If a notification is arrived, moved the appropriate object to the new position
                    GameObject.Find(gameObjectName).transform.position = newObjPosition;
    
                    // Reset the flag
                    notifReceived = false;
                }
            }
        }
    
  8. Die folgende Methode, InitNotificationAsync(), registriert die Anwendung bei der Initialisierung beim Notification Hub Service. Der Code ist auskommentiert, da Unity das Projekt nicht erstellen kann. Sie entfernen die Kommentare, wenn Sie das Azure Messaging Nuget-Paket in Visual Studio importieren.

        /// <summary>
        /// Register this application to the Notification Hub Service
        /// </summary>
        private async void InitNotificationsAsync()
        {
            // PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
            // NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint);
    
            // Registration result = await hub.RegisterNativeAsync(channel.Uri);
    
            // If registration was successful, subscribe to Push Notifications
            // if (result.RegistrationId != null)
            // {
            //     Debug.Log($"Registration Successful: {result.RegistrationId}");
            //     channel.PushNotificationReceived += Channel_PushNotificationReceived;
            // }
        }
    
  9. Der folgende Handler, Channel_PushNotificationReceived(), wird jedes Mal ausgelöst, wenn eine Benachrichtigung empfangen wird. Sie wird die Benachrichtigung deserialisieren, bei der es sich um die Azure-Tabellenentität handelt, die in der Desktopanwendung verschoben wurde, und dann das entsprechende GameObject in der MR-Szene an dieselbe Position verschieben.

    Wichtig

    Der Code wird auskommentiert, da der Code auf die Azure Messaging-Bibliothek verweist, die Sie nach dem Erstellen des Unity-Projekts mithilfe der Nuget-Paket-Manager in Visual Studio hinzufügen. Daher kann das Unity-Projekt nicht erstellt werden, es sei denn, es wird auskommentiert. Beachten Sie, dass Sie diesen Code erneut kommentieren müssen, wenn Sie Ihr Projekt erstellen und dann zu Unity zurückkehren möchten.

        ///// <summary>
        ///// Handler called when a Push Notification is received
        ///// </summary>
        //private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)    
        //{
        //    Debug.Log("New Push Notification Received");
        //
        //    if (args.NotificationType == PushNotificationType.Raw)
        //    {
        //        //  Raw content of the Notification
        //        string jsonContent = args.RawNotification.Content;
        //
        //        // Deserialise the Raw content into an AzureTableEntity object
        //        AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent);
        //
        //        // The name of the Game Object to be moved
        //        gameObjectName = ate.RowKey;          
        //
        //        // The position where the Game Object has to be moved
        //        newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z);
        //
        //        // Flag thats a notification has been received
        //        notifReceived = true;
        //    }
        //}
    
  10. Denken Sie daran, Ihre Änderungen zu speichern, bevor Sie zum Unity-Editor zurückkehren.

  11. Klicken Sie im Hierarchiebereich auf die Hauptkamera, damit die zugehörigen Eigenschaften im Inspektor angezeigt werden.

  12. Wenn der Ordner "Skripts" geöffnet ist, wählen Sie das NotificationReceiver-Skript aus, und ziehen Sie es auf die Hauptkamera. Das Ergebnis sollte wie folgt sein:

    Skript des Benachrichtigungsempfängers auf die Kamera ziehen

    Hinweis

    Wenn Sie dies für microsoft HoloLens entwickeln, müssen Sie die Kamerakomponente der Hauptkamera aktualisieren, damit:

    • Flags löschen: Volltonfarbe
    • Hintergrund: Schwarz

Kapitel 16 – Erstellen des Mixed Reality-Projekts zu UWP

Dieses Kapitel ist identisch mit dem Erstellungsprozess für das vorherige Projekt. Alles, was für den Unity-Abschnitt dieses Projekts erforderlich ist, wurde jetzt abgeschlossen, daher ist es an der Zeit, es aus Unity zu erstellen.

  1. Navigieren Sie zu Buildeinstellungen ( Dateibuildeinstellungen>).

  2. Stellen Sie im Menü "Buildeinstellungen" sicher, dass Unity C#-Projekte* markiert ist (wodurch Sie die Skripts in diesem Projekt nach dem Build bearbeiten können).

  3. Klicken Sie anschließend auf "Erstellen".

    Screenshot des Fensters

  4. In einem Explorer Fenster wird ein Popupfenster angezeigt, in dem Sie aufgefordert werden, einen Speicherort zum Erstellen einzufordern. Erstellen Sie einen neuen Ordner (indem Sie in der oberen linken Ecke auf "Neuer Ordner" klicken), und nennen Sie ihn BUILDS.

    Erstellen eines Builds-Ordners

    1. Öffnen Sie den neuen BUILDS-Ordner, und erstellen Sie einen anderen Ordner (mithilfe des neuen Ordners erneut), und nennen Sie ihn NH_MR_App.

      NH_MR_Apps Ordner erstellen

    2. Wenn die NH_MR_App ausgewählt ist. klicken Sie auf "Ordner auswählen". Das Projekt dauert eine Minute oder so, bis das Projekt erstellt wird.

  5. Nach dem Build wird am Speicherort des neuen Projekts ein Explorer-Fenster geöffnet.

Kapitel 17 – Hinzufügen von NuGet-Paketen zur UnityMRNotifHub-Lösung

Warnung

Denken Sie daran, dass nach dem Hinzufügen der folgenden NuGet-Pakete (und aufheben der Auskommentierung des Codes im nächsten Kapitel) der Code, wenn er im Unity-Projekt erneut geöffnet wird, Fehler anzeigt. Wenn Sie im Unity-Editor zurückkehren und die Bearbeitung fortsetzen möchten, benötigen Sie einen Kommentar, der fehlerhaften Code ist, und dann die Kommentare später wieder aufheben, sobald Sie wieder in Visual Studio sind.

Nachdem der Mixed Reality-Build abgeschlossen wurde, navigieren Sie zum Mixed Reality-Projekt, das Sie erstellt haben, und doppelklicken Sie auf die Projektmappendatei (.sln) in diesem Ordner, um Ihre Projektmappe mit Visual Studio 2017 zu öffnen. Sie müssen nun das WindowsAzure.Messaging.managed NuGet-Paket hinzufügen. Dies ist eine Bibliothek, die zum Empfangen von Benachrichtigungen vom Benachrichtigungshub verwendet wird.

So importieren Sie das NuGet-Paket:

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Ihre Lösung.

  2. Klicken Sie auf "NuGet-Pakete verwalten".

    Nuget-Manager öffnen

  3. Wählen Sie die Registerkarte "Durchsuchen" aus, und suchen Sie nach "WindowsAzure.Messaging.managed".

    Windows Azure Messaging-Paket suchen

  4. Wählen Sie das Ergebnis (wie unten dargestellt) aus, und aktivieren Sie im Fenster rechts das Kontrollkästchen neben Project. Dadurch wird ein Kontrollkästchen neben Project zusammen mit dem Kontrollkästchen neben dem Assembly-CSharp - und UnityMRNotifHub-Projekt platziert.

    Alle Projekte ankreuzen

  5. Die anfänglich bereitgestellte Version ist möglicherweise nicht mit diesem Projekt kompatibel. Klicken Sie daher neben "Version" auf das Dropdownmenü, und klicken Sie auf Version 0.1.7.9, und klicken Sie dann auf "Installieren".

  6. Sie haben jetzt die Installation des NuGet-Pakets abgeschlossen. Suchen Sie den kommentierten Code, den Sie in die NotificationReceiver-Klasse eingegeben haben, und entfernen Sie die Kommentare..

Kapitel 18 – Bearbeiten der UnityMRNotifHub-Anwendung, NotificationReceiver-Klasse

Nachdem Sie die NuGet-Pakete hinzugefügt haben, müssen Sie einen Teil des Codes in der NotificationReceiver-Klasse aufheben.

Dies umfasst:

  1. Der Namespace oben:

    using Microsoft.WindowsAzure.Messaging;
    
  2. Der gesamte Code innerhalb der InitNotificationsAsync() -Methode:

        /// <summary>
        /// Register this application to the Notification Hub Service
        /// </summary>
        private async void InitNotificationsAsync()
        {
            PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
            NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint);
    
            Registration result = await hub.RegisterNativeAsync(channel.Uri);
    
            // If registration was successful, subscribe to Push Notifications
            if (result.RegistrationId != null)
            {
                Debug.Log($"Registration Successful: {result.RegistrationId}");
                channel.PushNotificationReceived += Channel_PushNotificationReceived;
            }
        }
    

Warnung

Der obige Code enthält einen Kommentar: Stellen Sie sicher, dass Sie diesen Kommentar nicht versehentlich nicht kommentiert haben (da der Code nicht kompiliert wird, wenn Sie es haben!).

  1. Und schließlich das Channel_PushNotificationReceived-Ereignis :

        /// <summary>
        /// Handler called when a Push Notification is received
        /// </summary>
        private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args)
        {
            Debug.Log("New Push Notification Received");
    
            if (args.NotificationType == PushNotificationType.Raw)
            {
                //  Raw content of the Notification
                string jsonContent = args.RawNotification.Content;
    
                // Deserialize the Raw content into an AzureTableEntity object
                AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent);
    
                // The name of the Game Object to be moved
                gameObjectName = ate.RowKey;
    
                // The position where the Game Object has to be moved
                newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z);
    
                // Flag thats a notification has been received
                notifReceived = true;
            }
        }
    

Stellen Sie mit diesen unkommentiert sicher, dass Sie speichern, und fahren Sie dann mit dem nächsten Kapitel fort.

Kapitel 19 – Zuordnen des Mixed Reality-Projekts zur Store-App

Sie müssen nun das Mixed Reality-Projekt der Store-App zuordnen, die Sie am Anfang des Labors erstellt haben.

  1. Öffnen Sie die Projektmappe.

  2. Klicken Sie im Bereich Projektmappen-Explorer mit der rechten Maustaste auf das UWP-App-Projekt, wechseln Sie zum Store, und verknüpfen Sie die App mit dem Store....

    Open Store-Zuordnung

  3. Ein neues Fenster wird mit dem Namen "Ihre App dem Windows Store zuordnen" angezeigt. Klicken Sie auf Weiter.

    Zum nächsten Bildschirm wechseln

  4. Es wird alle Anwendungen geladen, die dem Konto zugeordnet sind, das Sie angemeldet haben. Wenn Sie nicht bei Ihrem Konto angemeldet sind, können Sie sich auf dieser Seite anmelden .

  5. Suchen Sie den Store-App-Namen, den Sie zu Beginn dieses Lernprogramms erstellt haben, und wählen Sie ihn aus. Klicken Sie dann auf Weiter.

    Suchen und Auswählen ihres Storenamens

  6. Klicken Sie auf Zuordnen.

    Zuordnen der App

  7. Ihre App ist jetzt der Store-App zugeordnet . Dies ist erforderlich, um Benachrichtigungen zu aktivieren.

Kapitel 20 – Bereitstellen von UnityMRNotifHub- und UnityDesktopNotifHub-Anwendungen

Dieses Kapitel kann mit zwei Personen einfacher sein, da das Ergebnis beide Apps umfasst, die auf Ihrem Computer Desktop ausgeführt werden, und das andere innerhalb Ihres immersiven Headsets.

Die immersive Headset-App wartet darauf, Änderungen an der Szene (Positionsänderungen der lokalen GameObjects) zu erhalten, und die Desktop-App nimmt Änderungen an ihrer lokalen Szene (Positionsänderungen) vor, die für die MR-App freigegeben werden. Es ist sinnvoll, die MR-App zuerst bereitzustellen, gefolgt von der Desktop-App, damit der Empfänger mit der Überwachung beginnen kann.

So stellen Sie die UnityMRNotifHub-App auf Ihrem lokalen Computer bereit:

  1. Öffnen Sie die Lösungsdatei Ihrer UnityMRNotifHub-App in Visual Studio 2017.

  2. Wählen Sie in der Lösungsplattform x86, lokaler Computer aus.

  3. Wählen Sie in der Lösungskonfiguration "Debuggen" aus.

    Screenshot der Lösungskonfiguration, die auf

  4. Wechseln Sie zum Menü " Erstellen", und klicken Sie auf " Lösung bereitstellen", um die Anwendung auf Ihren Computer querzuladen.

  5. Ihre App sollte nun in der Liste der installierten Apps angezeigt werden, die zum Starten bereit sind.

So stellen Sie die UnityDesktopNotifHub-App auf dem lokalen Computer bereit:

  1. Öffnen Sie die Lösungsdatei Ihrer UnityDesktopNotifHub-App in Visual Studio 2017.

  2. Wählen Sie in der Lösungsplattform x86, lokaler Computer aus.

  3. Wählen Sie in der Lösungskonfiguration "Debuggen" aus.

    Screenshot, der die Lösungskonfiguration auf

  4. Wechseln Sie zum Menü " Erstellen", und klicken Sie auf " Lösung bereitstellen", um die Anwendung auf Ihren Computer querzuladen.

  5. Ihre App sollte nun in der Liste der installierten Apps angezeigt werden, die zum Starten bereit sind.

  6. Starten Sie die Mixed Reality-Anwendung, gefolgt von der Desktopanwendung.

Wenn beide Anwendungen ausgeführt werden, verschieben Sie ein Objekt in der Desktopszene (mit der linken Maustaste). Diese Positionsänderungen werden lokal, serialisiert und an den Funktions-App-Dienst gesendet. Der Funktions-App-Dienst aktualisiert dann die Tabelle zusammen mit dem Benachrichtigungshub. Nachdem sie ein Update erhalten haben, sendet der Benachrichtigungshub die aktualisierten Daten direkt an alle registrierten Anwendungen (in diesem Fall die immersive Headset-App), die dann die eingehenden Daten deserialisiert und die neuen Positionsdaten auf die lokalen Objekte anwendet, um sie in Szene zu verschieben.

Ihre Azure Notification Hubs-Anwendung abgeschlossen

Herzlichen Glückwunsch, Sie haben eine Mixed Reality-App erstellt, die den Azure Notification Hubs-Dienst nutzt und die Kommunikation zwischen Apps ermöglicht.

Endprodukt -End

Zusatzübungen

Übung 1

Können Sie herausfinden, wie Sie die Farbe der GameObjects ändern und diese Benachrichtigung an andere Apps senden, die die Szene anzeigen?

Übung 2

Können Sie Ihrer MR-App Bewegungen von GameObjects hinzufügen und die aktualisierte Szene in Ihrer Desktop-App anzeigen?