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


Endprodukt -start

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

Azure Notification Hubs ist ein Microsoft-Dienst, mit dem Entwickler gezielte und personalisierte Pushbenachrichtigungen an jede Plattform senden können, die alle innerhalb der Cloud betrieben 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 SeiteAzure Notification Hubs.

Azure Functions ist ein Microsoft-Dienst, mit dem Entwickler kleine Codeelemente (Funktionen) in Azure ausführen können. Dies bietet eine Möglichkeit zum Delegieren von Arbeit an die Cloud anstelle Ihrer lokalen Anwendung, was viele Vorteile haben kann. Azure Functions unterstützt mehrere Entwicklungssprachen, darunter 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 können, sodass sie überall leicht zugänglich sind. Der Dienst verfügt über ein schemaloses Design, das die Entwicklung von Tabellen nach Bedarf ermöglicht und daher sehr flexibel ist. Weitere Informationen finden Sie auf der Seite Azure-Tabellen.

Nach Abschluss dieses Kurses verfügen Sie über eine immersive Mixed Reality-Headsetanwendung und eine Desktop-PC-Anwendung, die folgende Aufgaben ausführen kann:

  1. Die Desktop-PC-App ermöglicht es dem Benutzer, ein Objekt mit der Maus in den 2D-Raum (X und Y) zu verschieben.

  2. Die Verschiebung von Objekten innerhalb der PC-App wird mithilfe von JSON an die Cloud gesendet, das in Form einer Zeichenfolge erfolgt, die eine Objekt-ID, Typinformationen und Transformationsinformationen (X- und Y-Koordinaten) enthält.

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

  4. Nach Erhalt einer Benachrichtigung, die die Objekt-ID, den Typ und die Transformierungsinformationen enthält, wendet die Mixed Reality-App die empfangenen Informationen auf ihre eigene Szene an.

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

Geräteunterstützung

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

Hinweis

Während sich dieser Kurs hauptsächlich auf Windows Mixed Reality immersiven Headsets (VR) konzentriert, können Sie das, was Sie in diesem Kurs gelernt haben, auch auf Microsoft HoloLens anwenden. Während Sie dem Kurs folgen, werden Ihnen Notizen zu allen Änderungen angezeigt, die Sie möglicherweise zur Unterstützung von HoloLens verwenden müssen. Wenn Sie HoloLens verwenden, können Sie während der Sprachaufnahme ein gewisses Echo bemerken.

Voraussetzungen

Hinweis

Dieses Tutorial richtet sich an Entwickler, die über grundlegende Erfahrungen mit Unity und C# verfügen. Bitte beachten Sie auch, dass die Voraussetzungen und schriftlichen Anweisungen in diesem Dokument das darstellen, was zum Zeitpunkt des Schreibens (Mai 2018) getestet und überprüft wurde. Sie können die neueste Software verwenden, wie im Artikel Installieren der Tools aufgeführt, aber es sollte nicht davon ausgegangen werden, dass die Informationen in diesem Kurs perfekt dem entsprechen, was Sie in neuerer Software finden, als unten aufgeführt.

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

Vorbereitung

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

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. Es wird ein Popup angezeigt, in dem 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 Häkchen angezeigt. Nachdem Sie einen verfügbaren Namen eingefügt haben, klicken Sie unten links im Popup auf die Schaltfläche Produktname reservieren .

    Umkehren eines Namens

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

Kapitel 2: Abrufen der Anmeldeinformationen für neue Apps

Melden Sie sich beim Anwendungsregistrierungsportal an, wo 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 verwenden, um sich anzumelden.
    Dies muss das Microsoft-Konto sein, das Sie im vorherigen Kapitel im Windows Store-Entwicklerportal verwendet haben.

  2. Sie finden Ihre App im Abschnitt Meine Anwendungen . Sobald Sie es gefunden haben, klicken Sie darauf, und Sie werden zu einer neuen Seite weitergeleitet, die den App-Namen plus Registrierung enthält.

    Ihre neu registrierte App

  3. Scrollen Sie auf der Registrierungsseite nach unten, um den Abschnitt Anwendungsgeheimnisse und die Paket-SID für Ihre App zu finden. Kopieren Sie beide zur 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, wo Sie einen Azure Notification Hubs-Dienst erstellen.

  1. Melden Sie sich beim Azure-Portal an.

    Hinweis

    Wenn Sie noch nicht über ein Azure-Konto verfügen, müssen Sie eines erstellen. Wenn Sie dieses Tutorial in einer Unterrichts- oder Laborsituation befolgen, bitten Sie Ihren Kursleiter oder einen der Experten um Hilfe beim Einrichten Ihres neuen Kontos.

  2. Nachdem Sie angemeldet sind, klicken Sie in der oberen linken Ecke auf Neu , suchen Sie nach Notification Hub, und klicken Sie auf DIE EINGABETASTE.

    Suchen nach Notification Hub

    Hinweis

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

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

    Erstellen von Notification Hubs instance

  4. Nachdem Sie auf Erstellen geklickt haben:

    1. Fügen Sie den gewünschten Namen für diesen Dienst instance ein.

    2. Geben Sie einen Namespace an, den Sie dieser App zuordnen können.

    3. Wählen Sie einen Standort aus.

    4. Wählen Sie eine Ressourcengruppe aus, oder erstellen Sie eine neue. Eine Ressourcengruppe bietet eine Möglichkeit zum Überwachen, Steuern des Zugriffs, Bereitstellen und Verwalten der Abrechnung für eine Sammlung von Azure-Ressourcen. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Labs) 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 für diesen Dienst geltenden Geschäftsbedingungen verstanden haben.

    7. Klicken Sie auf Erstellen.

      Geben Sie Dienstdetails ein.

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

  6. Eine Benachrichtigung wird im Portal angezeigt, sobald der Dienst instance erstellt wurde.

    Benachrichtigung

  7. Klicken Sie in der Benachrichtigung auf die Schaltfläche Zu Ressource wechseln, um Ihren neuen Dienst instance zu erkunden. Sie werden zu Ihrem neuen Notification Hub-Dienst instance weitergeleitet.

    Screenshot: Schaltfläche

  8. Klicken Sie auf der Übersichtsseite auf der Hälfte der Seite auf Windows (WNS). Der Bereich auf der rechten Seite ändert sich in zwei Textfelder, die Ihre Paket-SID und den Sicherheitsschlüssel aus der zuvor eingerichteten App erfordern.

    Neu erstellter Hubdienst

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

    Kopieren von Sicherheitsdetails

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

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

  1. Melden Sie sich beim Azure-Portal an, wenn Sie noch nicht angemeldet sind.

  2. Klicken Sie nach der Anmeldung oben links auf Neu , suchen Sie nach Speicherkonto, und klicken Sie auf DIE EINGABETASTE.

    Hinweis

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

  3. Wählen Sie in der Liste Speicherkonto – Blob, Datei, Tabelle, Warteschlange aus.

    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 instance dieses Diensts zu erstellen.

    Erstellen von Speicher-instance

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

    1. Fügen Sie ihren gewünschten Namen für diesen Dienst instance ein (muss klein geschrieben sein).

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

    3. Wählen Sie unter Kontoart im Dropdownmenü Speicher (universell v1) aus.

    4. Wählen Sie einen geeigneten Standort aus.

    5. Wählen Sie im Dropdownmenü Replikationdie Option Read-access-geo-redundant storage (RA-GRS) aus.

    6. Klicken Sie unter Leistung auf Standard.

    7. Wählen Sie im Abschnitt Sichere Übertragung erforderlichdie 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 zum Überwachen, Steuern des Zugriffs, Bereitstellen und Verwalten der Abrechnung für eine Sammlung von Azure-Ressourcen. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Labs) 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.

      Geben Sie Speicherdetails ein.

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

  7. Eine Benachrichtigung wird im Portal angezeigt, sobald der Dienst instance erstellt wurde. Klicken Sie auf die Benachrichtigungen, um Ihre neue Dienst-instance zu erkunden.

    Neue Speicherbenachrichtigung

  8. Klicken Sie in der Benachrichtigung auf die Schaltfläche Zu Ressource wechseln, um Ihren neuen Dienst instance zu erkunden. Sie werden zur Übersichtsseite des neuen Speicherdiensts instance weitergeleitet.

    Screenshot: Schaltfläche

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

    Screenshot: Auswahl von Tabellen

  10. Der Bereich auf der rechten Seite wird geändert, um die Tabellendienstinformationen anzuzeigen, wobei Sie eine neue Tabelle hinzufügen müssen. Klicken Sie dazu links oben auf + die Schaltfläche Tabelle.

    Tabellen öffnen

  11. Es wird eine neue Seite angezeigt, in der 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 entsprechenden Namen ein, und klicken Sie auf OK.

    Neue Tabelle erstellen

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

    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>.

    Cloud-Explorer öffnen

  3. Die Cloud-Explorer wird als angedocktes Element geöffnet (gedulden Sie sich, da das Laden einige Zeit in Anspruch nehmen kann).

    Hinweis

    Wenn das Abonnement, das Sie zum Erstellen Ihrer Speicherkonten verwendet haben, nicht sichtbar ist, stellen Sie sicher, dass Sie über Folgendes verfügen:

    • Melden Sie sich bei demselben Konto wie das Konto an, 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 nach Speicherkonten , und klicken Sie links neben dem Pfeil, um Ihre Konten zu erweitern.

    Öffnen von Speicherkonten

  5. Nach der Erweiterung sollte Ihr neu erstelltes Speicherkonto verfügbar sein. Klicken Sie links neben Ihrem Speicher auf den Pfeil, und suchen Sie 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

  6. Die 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. Es wird ein Fenster angezeigt, in dem Sie zum Hinzufügen von Entität aufgefordert werden. Sie erstellen insgesamt drei Entitäten mit jeweils mehreren Eigenschaften. Sie werden feststellen, dass PartitionKey und RowKey bereits bereitgestellt wurden, da diese von der Tabelle verwendet werden, um Ihre Daten zu finden.

    Partitions- und Zeilenschlüssel

  8. Aktualisieren Sie den Wert von PartitionKey und RowKey wie folgt (denken Sie daran, dies für jede hinzugefügte Zeileneigenschaft zu tun, obwohl Sie den RowKey jedes Mal inkrementieren):

    Richtige Werte hinzufügen

  9. Klicken Sie auf Eigenschaft hinzufügen , um zusätzliche Datenzeilen hinzuzufügen. Stellen Sie sicher, dass Ihre erste leere Tabelle der folgenden Tabelle entspricht.

  10. Klicken Sie anschließend auf OK.

    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 den unten gezeigten entsprechen.

    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 gezeigten fest.

    Zylinder hinzufügen

  14. Ihre Tabelle sollte nun wie unten aussehen.

    Tabelle abgeschlossen

  15. Sie haben dieses Kapitel abgeschlossen. Achten Sie darauf, dass Sie speichern.

Kapitel 6: Erstellen einer Azure-Funktions-App

Erstellen Sie eine Azure-Funktions-App, die von der Desktopanwendung aufgerufen wird, um den Tabellendienst zu aktualisieren und eine Benachrichtigung über den Notification Hub 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 die Windows-TASTE, und geben Sie editor ein).

    Editor öffnen

  2. Fügen Sie bei geöffnetem Editor die folgende JSON-Struktur ein. Nachdem Sie dies getan haben, speichern Sie es auf Ihrem Desktop als project.json. Es ist wichtig, dass die Benennung richtig ist: Stellen Sie sicher, dass sie KEINE .txt Dateierweiterung hat. 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-Portal an.

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

    Suchen nach Funktions-App

    Hinweis

    Das Wort Neu wurde in neueren Portalen möglicherweise durch Ressource erstellen 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-instance

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

    1. Fügen Sie unter App-Name den gewünschten Namen für diesen Dienst instance ein.

    2. Wählen Sie ein Abonnementaus.

    3. Wählen Sie den für Sie geeigneten Tarif aus. Wenn Sie zum ersten Mal eine Funktion App Service erstellen, sollte Ihnen ein kostenloser Tarif zur Verfügung stehen.

    4. Wählen Sie eine Ressourcengruppe aus, oder erstellen Sie eine neue. Eine Ressourcengruppe bietet eine Möglichkeit zum Überwachen, Steuern des Zugriffs, Bereitstellen und Verwalten der Abrechnung für eine Sammlung von Azure-Ressourcen. Es wird empfohlen, alle Azure-Dienste, die einem einzelnen Projekt (z. B. diesen Labs) 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 unter Betriebssystem auf Windows, da dies die beabsichtigte Plattform ist.

    6. Wählen Sie einen Hostingplan aus (in diesem Tutorial wird ein Verbrauchsplan verwendet.

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

    8. Im Abschnitt Speichermüssen Sie den Speicherdienst auswählen, den Sie im vorherigen Schritt erstellt haben.

    9. Sie benötigen Application Insights in dieser App nicht. Lassen Sie sie also aus.

    10. Klicken Sie auf Erstellen.

      Neue instance erstellen

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

  8. Eine Benachrichtigung wird im Portal angezeigt, sobald der Dienst instance erstellt wurde.

    neue Benachrichtigung

  9. Klicken Sie auf die Benachrichtigungen, um Ihre neue Dienst-instance zu erkunden.

  10. Klicken Sie in der Benachrichtigung auf die Schaltfläche Zu Ressource wechseln, um Ihren neuen Dienst instance zu erkunden.

    Screenshot:

  11. Klicken Sie auf das + Symbol (plus) neben Funktionen, um neu zu erstellen.

    Neue Funktion hinzufügen

  12. Im zentralen Bereich wird das Fenster Funktionserstellung angezeigt. Ignorieren Sie die Informationen in der oberen Hälfte des Bereichs, 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 auf der Seite weiter nach unten scrollen (und dieses Bild sieht möglicherweise nicht genau gleich aus, wenn Updates im Azure-Portal stattgefunden haben), sie suchen jedoch nach einem Element namens HTTP PUT.

  14. Das HTTP PUT-Fenster wird angezeigt, in dem Sie die Funktion konfigurieren müssen (abbildung unten).

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

    2. Geben Sie unter Name einen entsprechenden Namen ein.

    3. Wählen Sie im Dropdownmenü Authentifizierungsebenedie Option Funktion aus.

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

    5. Verwenden Sie im Abschnitt Speicherkontoverbindung das Dropdownmenü, und wählen Sie dort Ihr Speicherkonto aus. Wenn es nicht vorhanden ist, klicken Sie neben dem Abschnittstitel auf den Link Neuer Link, um einen weiteren 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.

    Funktion erstellen

  16. Nachdem Sie auf Erstellen geklickt haben, werden Sie zum Funktions-Editor weitergeleitet.

    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 erhält 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, der alle abonnierten Anwendungen benachrichtigt.

  18. Klicken Sie auf Speichern, wenn der Code vorhanden ist.

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

    Uploadbereich öffnen

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

  21. Navigieren Sie zu der Datei project.json , die Sie zuvor in Editor erstellt haben, und klicken Sie darauf, 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 genauso aussehen wie das nächste Bild (unter Schritt 23).

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

    Funktion integrieren

  24. Klicken Sie auf der nächsten Seite oben rechts auf Erweiterter Editor (wie unten).

    Erweiterter Editor öffnen

  25. Im mittleren Bereich wird eine Datei function.json 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 in der folgenden Abbildung aussehen:

    zurück zum Standard-Editor

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

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

    Tabelleneingaben

  29. Stellen Sie sicher, dass die folgenden Informationen mit Ihren Informationen übereinstimmen, da sie möglicherweise unterschiedlich sind (unter den folgenden Schritten finden Sie eine Abbildung):

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

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

      Screenshot: Fenster

      1. Wählen Sie Ihr Speicherkonto aus, das Sie zuvor zum Hosten der Funktions-Apps erstellt haben.

      2. Sie werden feststellen, dass der Speicherkontoverbindungswert erstellt wurde.

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

    3. Die Seite Eingaben sollte nun mit den folgenden Informationen übereinstimmen .

      Eingaben abgeschlossen

  30. Klicken Sie als Nächstes unter Ausgaben auf Azure Notification Hub (Benachrichtigung). Stellen Sie sicher, dass Die folgenden Informationen mit Ihren Informationen übereinstimmen, da sie möglicherweise unterschiedlich sind (es gibt eine Abbildung unter den folgenden Schritten):

    1. Notification Hub-Name: Dies ist der Name Ihres Notification Hub-Diensts instance, den Sie zuvor erstellt haben.

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

      Überprüfen von Ausgaben

    3. Das Popup "Verbindung " wird angezeigt (siehe Abbildung unten), in dem Sie den Namespace des Notification Hubs auswählen müssen, den Sie zuvor eingerichtet haben.

    4. Wählen Sie im mittleren Dropdownmenü Ihren Notification Hub-Namen aus.

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

    6. Klicken Sie auf die Schaltfläche Auswählen , um zurückzugehen.

      Ausgabeupdate

  31. Die Seite Ausgaben sollte nun mit dem folgenden übereinstimmen, aber stattdessen mit Ihren Informationen. Stellen Sie sicher, dass Sie auf Speichern klicken.

Warnung

Bearbeiten Sie den Notification Hub-Namen nicht direkt (dies sollte alles mithilfe der Erweiterter Editor erfolgen, sofern Sie die vorherigen Schritte ordnungsgemäß ausgeführt haben.

Screenshot: Seite

  1. An diesem Punkt sollten Sie die Funktion testen, um sicherzustellen, dass sie funktioniert. Dazu ist Folgendes erforderlich:

    1. Navigieren Sie erneut zur Funktionsseite:

      Screenshot: Seite

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

      Screenshot der Funktionsseite mit hervorgehobenem

    3. Fügen Sie in das 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 unter Ihrem Funktionscode angezeigt.

      Screenshot: Ausgabeprotokolle des Tests im Konsolenbereich

    Warnung

    Wenn der obige Test fehlschlägt, müssen Sie überprüfen, ob Sie die oben genannten Schritte genau ausgeführt 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 nach dem Erstellen der Anwendung mithilfe von Visual Studio (oder der bereitgestellten Anwendung) ausgeführt werden.

Im Folgenden wird ein typischer Aufbau für die Entwicklung mit Unity und Mixed Reality gezeigt. Daher ist es 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 und UnityDesktopNotifHub einfügen. Stellen Sie sicher, dass der Projekttyp auf 3D festgelegt ist. Legen Sie den Speicherort auf einen für Sie geeigneten Ort fest (denken Sie daran, dass näher an Stammverzeichnissen besser ist). Klicken Sie dann auf Projekt erstellen.

    Projekt erstellen

  3. Wenn Unity geöffnet ist, lohnt es sich, zu überprüfen, ob der Standardskript-Editor auf Visual Studio festgelegt ist. Navigieren Sie zuBearbeitungseinstellungen>, 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. Navigieren Sie als Nächstes zuDateibuildeinstellungen>, und wählen Sie Universelle Windows-Plattform aus, und klicken Sie dann auf die Schaltfläche Plattform wechseln, um Ihre Auswahl anzuwenden.

    Wechseln von Plattformen

  5. Stellen Sie folgendes sicher, während Sie sich noch in denDateibuildeinstellungen> befinden:

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

      Diese Anwendung ist für Ihren Desktop vorgesehen, daher muss "Any Device" (Beliebiges Gerät) sein.

    2. Buildtyp ist auf D3D festgelegt.

    3. SDK ist auf Latest installed (Neueste Installation) festgelegt.

    4. Visual Studio-Version ist auf Latest installed (Neueste Installation) festgelegt.

    5. Build and Run ist auf Lokaler 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: Neuer Ordner

      3. Öffnen Sie den neu erstellten Ordner Scenes , und geben Sie dann im Textfeld Dateiname:NH_Desktop_Scene ein, und drücken Sie dann Speichern.

        neue NH_Desktop_Scene

    7. Die restlichen Einstellungen in Buildeinstellungen sollten vorerst als Standard beibehalten werden.

  6. Klicken Sie im selben Fenster auf die Schaltfläche Playereinstellungen . Dadurch wird der zugehörige Bereich in dem 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 :

      1. Die Skriptruntimeversion sollte experimentell (.NET 4.6-Äquivalent) sein.

      2. Skript-Back-End sollte .NET sein

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

        4.6 NET-Version

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

      • InternetClient

        Screenshot, der die Auswahl von InternetClient unter Funktionen zeigt.

  8. Zurück in den Buildeinstellungenunity C#-Projekte ist nicht mehr ausgegraut. aktivieren Sie das Kontrollkästchen neben diesem.

  9. Schließen Sie das Fenster Buildeinstellungen.

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

    Wichtig

    Wenn Sie die Unity-Einrichtungskomponente für dieses Projekt (Desktop-App) überspringen und direkt mit dem Code fortfahren möchten, können Sie dieses UNITY-Paket herunterladen, es als benutzerdefiniertes Paket in Ihr Projekt importieren und dann mit 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 findest du unter 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 müssen. Diese Schritte (4 bis 7 in diesem Abschnitt) sind nicht mehr erforderlich, nachdem der Fehler behoben wurde.

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 unitypackage zu Unity hinzu, indem Sie die Menüoption Assets > Import Package > Custom Package (Benutzerdefiniertes Paket importieren ) verwenden.

  2. Im eingeblendeten Feld Unity-Paket importieren können Sie unter Plug-In-Speicher> alles auswählen. Deaktivieren Sie alles andere, da es für diesen Kurs nicht benötigt wird.

    Importieren in Paket

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

  4. Wechseln Sie in der Projektansicht unter Plugins zum Ordner Storage, und wählen Sie nur die folgenden Plug-Ins aus:

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

Deaktivieren Sie Beliebige Plattform.

  1. Wenn Sie diese spezifischen Plug-Ins ausgewählt haben, deaktivieren SieBeliebige Plattform , und deaktivieren SieWSAPlayer , und klicken Sie dann auf Anwenden.

    Anwenden von Plattform-DLLs

    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 Storage-Plug-In nur Folgendes aus:

    • Microsoft.Data.Services.Client

      set nicht für dlls verarbeiten

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

    keine Verarbeitung anwenden

    Hinweis

    Wir markieren dieses Plug-In als "Nicht verarbeiten", da der Unity-Assemblypatcher Schwierigkeiten bei der Verarbeitung dieses Plug-Ins hat. Das Plug-In funktioniert weiterhin, auch wenn 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:

  • Liest Entitäten innerhalb der Azure-Tabelle.
  • Bestimmen Sie mithilfe der Tabellendaten, welche Objekte an welcher Position spawnen sollen.

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 Ordner erstellen>befindet. Nennen Sie den Ordner Skripts.

    Ordner

    Skriptordner erstellen 2

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

  3. Klicken Sie mit der rechten Maustaste in den Ordner Skripts, und klicken Sie aufC#-Skripterstellen>. Nennen Sie das Skript TableToScene.

    Screenshot: Erstellen des neuen Skripts 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 Wert accountName durch Ihren Azure Storage-Dienstnamen und den Wert "accountKey " durch den Schlüsselwert im Azure Storage-Dienst im Azure-Portal (siehe Abbildung unten).

    Abrufen des Kontoschlüssels

  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 der TableToScene-Klasse die -Methode hinzu, die die Werte aus der Azure-Tabelle abruft, und verwenden Sie sie zum Spawnen der entsprechenden Grundtypen in der Szene.

        /// <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 Klasse definieren, die von der Anwendung zum Serialisieren und Deserialisieren der Tabellenentitäten verwendet wird.

        /// <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 ihre Eigenschaften im Inspektor angezeigt werden.

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

    Hinzufügen eines Skripts zu Standard Kamera

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 , und klicken Sie auf Erstellen, C#-Skript. Nennen Sie das Skript CloudScene.

    Screenshot: Erstellen des neuen Skripts 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 Wert azureFunctionEndpoint durch Ihre Azure-Funktions-App-URL im Azure-App Service im Azure-Portal, wie in der folgenden Abbildung gezeigt:

    Funktions-URL abrufen

  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 innerhalb der Update() -Methode den folgenden Code hinzu, der die Mauseingabe erkennt und ziehen wird, wodurch wiederum GameObjects in der Szene verschoben wird. Wenn der Benutzer ein Objekt gezogen und gelöscht hat, übergibt er den Namen und die Koordinaten des Objekts an die UpdateCloudScene()-Methode, die den Azure Function App-Dienst aufruft, wodurch die Azure-Tabelle aktualisiert und die Benachrichtigung ausgelöst wird.

        /// <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 ihre Eigenschaften im Inspektor angezeigt werden.

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

      Ziehen Eines Cloudskripts auf Standard Kamera

Kapitel 11: Erstellen des Desktopprojekts in UWP

Alles, was für den Unity-Abschnitt dieses Projekts benötigt wird, wurde nun abgeschlossen.

  1. Navigieren Sie zu Buildeinstellungen (Dateibuildeinstellungen>).

  2. Klicken Sie im Fenster Buildeinstellungen auf Erstellen.

    Screenshot: Fenster

  3. Ein Explorer Fenster wird angezeigt, in dem Sie aufgefordert werden, einen Speicherort zum Erstellen anzugeben. Erstellen Sie einen neuen Ordner (indem Sie oben links auf Neuer Ordner klicken), und nennen Sie ihn BUILDS.

    Neuer Ordner für build

    1. Öffnen Sie den neuen ORDNER BUILDS , und erstellen Sie einen weiteren Ordner (erneut mithilfe von Neuer Ordner ), und benennen Sie ihn NH_Desktop_App.

      Ordnername NH_Desktop_App

    2. Mit ausgewählter NH_Desktop_App . Klicken Sie auf Ordner auswählen. Die Erstellung des Projekts dauert etwa eine Minute.

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

Kapitel 12: Einrichten Mixed Reality Unity-Projekts

Das Folgende ist 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: Fenster

  2. Sie müssen nun einen Unity-Projektnamen angeben und UnityMRNotifHub einfügen. Stellen Sie sicher, dass der Projekttyp auf 3D festgelegt ist. Legen Sie den Speicherort auf einen für Sie geeigneten Ort fest (denken Sie daran, dass näher an Stammverzeichnissen besser ist). Klicken Sie dann auf Projekt erstellen.

    Name UnityMRNotifHub

  3. Wenn Unity geöffnet ist, lohnt es sich, zu überprüfen, ob der Standardskript-Editor auf Visual Studio festgelegt ist. Navigieren 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 zuDateibuildeinstellungen>, und wechseln Sie auf die Plattform Universelle Windows-Plattform, indem Sie auf die Schaltfläche Plattform wechseln klicken.

    Wechseln von Plattformen zu UWP

  5. Wechseln Sie zuDateibuildeinstellungen>, und stellen Sie folgendes sicher:

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

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

    2. Buildtyp ist auf D3D festgelegt.

    3. SDK ist auf Latest installed (Neueste Installation) festgelegt.

    4. Visual Studio-Version ist auf Latest installed (Neueste Installation) festgelegt.

    5. Build and Run ist auf Lokaler 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: Fenster

      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: Hervorgehobener

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

        neue Szene – NH_MR_Scene

    7. Die restlichen Einstellungen in Buildeinstellungen sollten vorerst als Standard beibehalten werden.

  6. Klicken Sie im selben Fenster auf die Schaltfläche Playereinstellungen . Dadurch wird der zugehörige Bereich in dem 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 :

      1. Die Skriptruntimeversion sollte experimentell (.NET 4.6-Äquivalent) sein.

      2. Skript-Back-End sollte .NET sein

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

        API-Kompatibilität

    2. Wählen Sie weiter unten im Bereich unter XR-Einstellungen (unter Veröffentlichungseinstellungen) den Kontrollkästchen Virtual Reality Unterstützt aus, stellen Sie sicher, dass das Windows Mixed Reality SDK hinzugefügt wurde.

      Aktualisieren von xr-Einstellungen

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

      • InternetClient

        Screenshot: Registerkarte

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

  9. Nachdem diese Änderungen vorgenommen wurden, schließen Sie das Fenster Buildeinstellungen.

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

    Wichtig

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

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

Sie verwenden die 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 müssen. Diese Schritte (4 bis 7 in diesem Abschnitt) sind nicht mehr erforderlich, nachdem der Fehler behoben wurde.

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 das unitypackage, das Sie aus dem obigen Beispiel heruntergeladen haben, mithilfe der Menüoption AssetsImport PackageCustom Package (Benutzerdefiniertes> Paket > importieren) zu Unity hinzu.

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

    Importpaket

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

  4. Wechseln Sie in der Projektansicht zum Ordner Storage unter Plug-Ins , 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 SieBeliebige Plattform , und deaktivieren SieWSAPlayer , und klicken Sie dann auf Übernehmen.

    Anwenden von Plattformänderungen

    Hinweis

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

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

    • Microsoft.Data.Services.Client

      Auswählen des Datendienstclients

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

    nicht verarbeiten

    Hinweis

    Sie markieren dieses Plug-In mit "Nicht verarbeiten", da der Unity-Assemblypatcher Probleme mit 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, indem Sie dasselbe Verfahren ausführen, das in Kapitel 9 beschrieben wurde.

Nachdem Sie dieses Kapitel abgeschlossen haben, wird für 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 Notification Hub bei der Initialisierung.
  • Lauschen auf Benachrichtigungen vom Notification Hub.
  • Deserialisieren der Objektdaten aus 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 , und klicken Sie auf Erstellen, C#-Skript. Nennen Sie das Skript NotificationReceiver.

    create new c#scriptname 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 Wert hubName durch Ihren Notification Hub-Dienstnamen und den Wert hubListenEndpoint durch den Endpunktwert, der im Azure-Portal auf der Registerkarte Zugriffsrichtlinien, Azure Notification Hub Service, zu finden ist (siehe Abbildung unten).

    Notification Hubs-Richtlinienendpunkt 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 von der Notification Hub-Bibliothek empfangen kann, ohne mit dem Hauptthread in Konflikt zu geraten:

        /// <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. Es wird die Benachrichtigung deserialisiert, 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 die gleiche Position verschoben.

    Wichtig

    Der Code wird auskommentiert, da der Code auf die Azure Messaging-Bibliothek verweist, die Sie nach dem Erstellen des Unity-Projekts mithilfe des NuGet-Paket-Managers in Visual Studio hinzufügen. Daher kann das Unity-Projekt nicht erstellt werden, es sei denn, es ist 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 ihre Eigenschaften im Inspektor angezeigt werden.

  12. Wählen Sie im geöffneten Ordner Skripts das Skript NotificationReceiver aus, und ziehen Sie es auf die Hauptkamera. Das Ergebnis sollte wie folgt aussehen:

    Ziehen Sie das Benachrichtigungsempfängerskript auf die Kamera

    Hinweis

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

    • Flags löschen: Einfarbig
    • Hintergrund: Schwarz

Kapitel 16: Erstellen des Mixed Reality-Projekts in UWP

Dieses Kapitel ist identisch mit dem Buildprozess für das vorherige Projekt. Alles, was für den Unity-Abschnitt dieses Projekts benötigt wird, wurde nun abgeschlossen, daher ist es an der Zeit, es von Unity aus zu erstellen.

  1. Navigieren Sie zu Buildeinstellungen (Dateibuildeinstellungen> ).

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

  3. Klicken Sie anschließend auf Erstellen.

    Screenshot: Fenster

  4. Ein Explorer Fenster wird angezeigt, in dem Sie aufgefordert werden, einen Speicherort zum Erstellen anzugeben. Erstellen Sie einen neuen Ordner (indem Sie oben links auf Neuer Ordner klicken), und nennen Sie ihn BUILDS.

    Ordner

    1. Öffnen Sie den neuen ORDNER BUILDS , und erstellen Sie einen weiteren Ordner (erneut mit Neuer Ordner ), und benennen Sie ihn NH_MR_App.

      Erstellen NH_MR_Apps Ordners

    2. Mit ausgewählter NH_MR_App . Klicken Sie auf Ordner auswählen. Die Erstellung des Projekts dauert etwa eine Minute.

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

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

Warnung

Bitte denken Sie daran, dass der Code beim erneuten Öffnen innerhalb des Unity-Projekts Fehler aufweist, sobald Sie die folgenden NuGet-Pakete hinzugefügt haben (und den Code im nächsten Kapitel auskommentieren). Wenn Sie die Bearbeitung im Unity-Editor fortsetzen möchten, müssen Sie diesen fehlerhaften Code kommentieren und die Auskommentierung später wieder aufheben, sobald Sie wieder in Visual Studio sind.

Navigieren Sie nach Abschluss des Mixed Reality-Builds zum Mixed Reality-Projekt, das Sie erstellt haben, und doppelklicken Sie in diesem Ordner auf die Projektmappendatei (SLN), um Ihre Projektmappe mit Visual Studio 2017 zu öffnen. Sie müssen nun das NuGet-Paket WindowsAzure.Messaging.managed hinzufügen. Dies ist eine Bibliothek, die zum Empfangen von Benachrichtigungen vom Notification Hub 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 aus (wie unten dargestellt), und aktivieren Sie im Fenster auf der rechten Seite das Kontrollkästchen neben Projekt. Dadurch wird neben Projekt ein Kontrollkästchen aktiviert, zusammen mit dem Kontrollkästchen neben dem Projekt Assembly-CSharp und UnityMRNotifHub .

    Alle Projekte ankreuzen

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

  6. Sie haben nun 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-Klasseauskommentieren.

Dies schließt Folgendes ein:

  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 unkommentiert haben (da der Code nicht kompiliert wird, wenn Sie dies 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 bei diesen unkommentiert sicher, dass Sie speichern, und fahren Sie mit dem nächsten Kapitel fort.

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

Sie müssen das Mixed Reality-Projekt nun der Store-App zuordnen, in der Sie zu Beginn des Labs erstellt haben.

  1. Öffnen Sie die Projektmappe.

  2. Klicken Sie mit der rechten Maustaste auf das Projekt der UWP-App im Projektmappen-Explorer Bereich, wechseln Sie zu Store und App dem Store zuordnen....

    Open Store-Zuordnung

  3. Ein neues Fenster mit dem Namen Zuordnen Ihrer App mit dem Windows Store wird angezeigt. Klicken Sie auf Weiter.

    zum nächsten Bildschirm wechseln

  4. Es werden 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 Tutorials erstellt haben, und wählen Sie ihn aus. Klicken Sie dann auf Weiter.

    Suchen und Auswählen ihres Geschäftsnamens

  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 enthält, die ausgeführt werden, eine auf Ihrem Computerdesktop und die andere in Ihrem immersiven Headset.

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

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

  1. Öffnen Sie die Projektmappendatei Ihrer UnityMRNotifHub-App in Visual Studio 2017.

  2. Wählen Sie auf der Lösungsplattformdie Option x86, Lokaler Computer aus.

  3. Wählen Sie in der Projektmappenkonfigurationdebuggen aus.

    Screenshot, der zeigt, dass die Projektmappenkonfiguration auf der Symbolleiste auf

  4. Navigieren 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 Projektmappendatei Ihrer UnityDesktopNotifHub-App in Visual Studio 2017.

  2. Wählen Sie auf der Lösungsplattformdie Option x86, Lokaler Computer aus.

  3. Wählen Sie in der Projektmappenkonfigurationdebuggen aus.

    Screenshot: Projektmappenkonfiguration, die auf

  4. Navigieren 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 vorgenommen, serialisiert und an den Funktions-App-Dienst gesendet. Der Funktions-App-Dienst aktualisiert dann die Tabelle zusammen mit dem Notification Hub. Nachdem ein Update empfangen wurde, sendet der Notification Hub die aktualisierten Daten direkt an alle registrierten Anwendungen (in diesem Fall die immersive Headset-App), wodurch die eingehenden Daten deserialisiert und die neuen Positionsdaten auf die lokalen Objekte angewendet werden, wobei sie in szene verschoben werden.

Abgeschlossene Azure Notification Hubs-Anwendung

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

Endprodukt

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 die Bewegung der GameObjects hinzufügen und die aktualisierte Szene in Ihrer Desktop-App anzeigen?