Freigeben über


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


Hinweis

Die Tutorials der Mixed Reality Academy wurden unter Berücksichtigung von HoloLens (1. Generation) und Mixed Reality Immersive Headsets entwickelt. Daher ist es uns wichtig, diese Tutorials für Entwickler zu belassen, die noch nach Anleitungen bei der Entwicklung 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 beibehalten, um weiterhin auf den unterstützten Geräten zu arbeiten. Es wird eine neue Reihe von Tutorials geben, die in Zukunft veröffentlicht werden, um zu veranschaulichen, wie für HoloLens 2 entwickelt werden kann. Dieser Hinweis wird mit einem Link zu diesen Tutorials aktualisiert, sobald sie veröffentlicht werden.


Endprodukt -start

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

Azure Notification Hubs ist ein Microsoft-Dienst, mit dem Entwickler gezielte und personalisierte Pushbenachrichtigungen an jede 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 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, Arbeit an die Cloud anstatt an Ihre lokale Anwendung zu delegieren, was 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 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 ist daher sehr flexibel. Weitere Informationen finden Sie auf der SeiteAzure-Tabellen.

Nach Abschluss dieses Kurses verfügen Sie über eine immersive Mixed Reality-Headsetanwendung und eine Desktop-PC-Anwendung, die folgende Aktionen 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 in Form einer Zeichenfolge mit objekt-ID, Typ und Transformationsinformationen (X- und Y-Koordinaten) an die Cloud gesendet.

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

  4. Nach Dem Empfang einer Benachrichtigung, die die Objekt-ID, den Typ und die Transformationsinformationen 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 gewinnen, 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 (VR)-Headsets konzentriert, können Sie das, was Sie in diesem Kurs lernen, auch auf Microsoft HoloLens anwenden. Während Sie den Kurs befolgen, werden Ihnen Hinweise 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 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 entsprechen, was zum Zeitpunkt des Schreibens (Mai 2018) getestet und überprüft wurde. Sie können die neueste Software verwenden, die im Artikel Installieren der Tools aufgeführt ist, obwohl nicht davon ausgegangen werden sollte, dass die Informationen in diesem Kurs perfekt dem entsprechen, was Sie in neuerer Software finden, als die unten aufgeführten.

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

Vorbereitende Schritte

  • Um Probleme beim Erstellen dieses Projekts zu vermeiden, wird dringend empfohlen, das in diesem Tutorial erwähnte Projekt in einem Stammordner oder in der Nähe des Stammordners zu 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 haben Sie in Kapitel 2 keine Berechtigung für den Zugriff auf die App.

Kapitel 1: Erstellen einer Anwendung im Microsoft Developer Portal

Um den Azure Notification Hubs-Dienst verwenden zu können, 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 gewä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 nun erstellt wurde, können Sie mit dem nächsten Kapitel fortfahren.

Kapitel 2: Abrufen der 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 verwenden, um sich anzumelden.
    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 . Sobald 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 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 Lab-Situation durcharbeiten, bitten Sie Ihren Kursleiter oder einen der Betreuer um Hilfe beim Einrichten Ihres neuen Kontos.

  2. Wenn 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 in 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 zugeordnet sind (z. B. diese Labs), in einer gemeinsamen Ressourcengruppe zu speichern.

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

    5. Wählen Sie ein geeignetes Abonnement aus.

    6. Sie müssen auch bestätigen, dass Sie die für diesen Dienst geltenden Geschäftsbedingungen verstanden haben.

    7. Wählen Sie Erstellen aus.

      Geben Sie Dienstdetails ein.

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

  6. Eine Benachrichtigung wird im Portal angezeigt, nachdem die Dienst-instance erstellt wurde.

    Benachrichtigung

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

    Screenshot: Hervorgehobene Schaltfläche

  8. Klicken Sie auf der Übersichtsseite auf der Hälfte der Seite auf Windows (WNS). Im Bereich auf der rechten Seite werden zwei Textfelder angezeigt, für die Ihre Paket-SID und Der Sicherheitsschlüssel aus der zuvor eingerichteten App erforderlich sind.

    neu erstellter Hubs-Dienst

  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 eines Tabellendiensts

Nachdem Sie Ihre Notification Hubs Service-instance erstellt haben, navigieren Sie zurück zu Ihrem Azure-Portal, wo Sie einen Azure Tables-Dienst erstellen, indem Sie eine Speicherressource erstellen.

  1. Wenn Sie noch nicht angemeldet sind, 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 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 den gewünschten Namen für diesen Dienst instance ein (muss in Kleinbuchstaben enthalten 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 Georedundanter Speicher mit Lesezugriff (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 zugeordnet sind (z. B. diese Labs), in einer gemeinsamen Ressourcengruppe zu speichern.

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

    10. Lassen Sie Virtuelle Netzwerkeals 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. Eine Benachrichtigung wird im Portal angezeigt, nachdem die Dienst-instance erstellt wurde. Klicken Sie auf die Benachrichtigungen, um Ihre neue Dienst-instance zu erkunden.

    Benachrichtigung über neuen Speicher

  8. Klicken Sie in der Benachrichtigung auf die Schaltfläche Zu Ressource wechseln, um Ihre neue Dienst-instance zu erkunden. Sie gelangen zur Übersichtsseite ihres neuen Speicherdiensts instance.

    Screenshot: Hervorgehobene Schaltfläche

  9. Klicken Sie auf der Übersichtsseite auf der rechten Seite auf Tabellen.

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

  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, auf der Sie einen Tabellennamen eingeben müssen. Dies ist der Name, den Sie in späteren Kapiteln verwenden, um auf die Daten in Ihrer Anwendung 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 Tabellendienst-Speicherkonto 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ü aufCloud Exploreranzeigen>.

    Cloud-Explorer öffnen

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

    Hinweis

    Wenn das Abonnement, das Sie zum Erstellen Ihrer Speicherkonten verwendet haben, nicht angezeigt wird, stellen Sie sicher, dass Folgendes vorhanden ist:

    • Melden Sie sich mit demselben Konto an, das Sie für das Azure-Portal verwendet haben.

    • Wählen Sie auf der Seite "Kontoverwaltung" Ihr Abonnement 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 auf den Pfeil links davon, um Ihre Konten zu erweitern.

    Öffnen von Speicherkonten

  5. Nach dem Erweitern sollte Ihr neu erstelltes Speicherkonto verfügbar sein. Klicken Sie auf den Pfeil links neben Ihrem Speicher, 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. Ein Fenster wird angezeigt, in dem Sie aufgefordert werden, Entität hinzufügen. 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 hinzuzufügende 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 mit der folgenden Tabelle übereinstimmt.

  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 Zeile mit Daten enthält. Klicken Sie erneut auf das + Symbol (Pluszeichen), 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 gezeigten werte fest.

    Zylinder hinzufügen

  14. Ihre Tabelle sollte jetzt wie unten 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-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, die es Ihrer Azure-Funktion ermöglicht, die benötigten Bibliotheken zu laden.

  1. Öffnen Sie den Editor (drücken Sie die Windows-Taste, und geben Sie Editor ein).

    Editor öffnen

  2. Fügen Sie bei geöffnetem Editor die unten stehende JSON-Struktur ein. Nachdem Sie dies getan haben, speichern Sie es auf Ihrem Desktop als project.json. Es ist wichtig, dass die Benennung korrekt ist: Stellen Sie sicher, dass keine .txt Dateierweiterung vorhanden ist. Diese Datei definiert die Bibliotheken, die Ihre Funktion verwenden wird. Wenn Sie NuGet verwendet haben, wird sie vertraut sein.

    {
    "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. Wenn Sie angemeldet sind, klicken Sie in der oberen linken Ecke auf Neu , suchen Sie nach Funktions-App, und 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 Abonnement aus.

    3. Wählen Sie den für Sie geeigneten Tarif aus. Wenn Sie zum ersten Mal eine Funktions-App Service erstellen, sollte Ihnen ein Free-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 zugeordnet sind (z. B. diese Labs), in einer gemeinsamen Ressourcengruppe zu speichern.

      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. Für den 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 wurde. Dies kann eine Minute dauern.

  8. Eine Benachrichtigung wird im Portal angezeigt, nachdem die 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 Ihre neue Dienst-instance zu erkunden.

    Screenshot:

  11. Klicken Sie auf das + (Plus-)Symbol 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 unten (im blauen Bereich wie unten) befindet.

    Benutzerdefinierte Funktion

  13. Auf der neuen Seite im Fenster werden verschiedene Funktionstypen angezeigt. 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 scrollen (und dieses Bild sieht möglicherweise nicht genau gleich aus, wenn Azure-Portal-Updates durchgeführt 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 (abbildung unten).

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

    2. Geben Sie unter 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 genau den Namen verwenden, den Sie zuvor zum Erstellen Ihres Tabellendiensts verwendet haben (einschließlich der gleichen Groß-/Kleinschreibung).

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

      Screenshot: Abschnitt

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

    Create-Funktion

  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 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 den erstellten Notification Hub-Dienst auf, der alle abonnierten Anwendungen benachrichtigt.

  18. Wenn der Code vorhanden ist, klicken Sie auf Speichern.

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

    Uploadbereich öffnen

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

  21. Navigieren Sie zu der project.json Datei, die Sie zuvor im 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 genau wie die nächste Abbildung (unter Schritt 23) aussehen.

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

    integrate-Funktion

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

    Erweiterten Editor öffnen

  25. Im mittleren Bereich wird eine function.json Datei geöffnet, die durch den folgenden Codeausschnitt ersetzt werden muss. Dies definiert die Funktion, 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 folgendes mit Ihren Informationen übereinstimmt, da sie möglicherweise anders sind (es gibt eine Abbildung unter den folgenden Schritten):

    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 Wert für die Speicherkontoverbindung erstellt wurde.

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

    3. Die Seite Eingaben sollte nun mit der unten angegebenen übereinstimmen und Ihre Informationen anzeigen.

      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 anders sind (es gibt eine Abbildung unter den folgenden Schritten):

    1. Notification Hub-Name: Dies ist der Name Des 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 Popupfenster Verbindung wird angezeigt (siehe Abbildung unten), in dem Sie den Zuvor eingerichteten Namespace des Notification Hubs auswählen müssen.

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

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

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

      Ausgabeupdate

  31. Die Seite Ausgaben sollte nun mit dem unten angegebenen ü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 mit dem Erweiterter Editor erfolgen, vorausgesetzt, Sie haben die vorherigen Schritte ordnungsgemäß ausgeführt.

Screenshot: Seite

  1. An diesem Punkt sollten Sie die Funktion testen, um sicherzustellen, dass sie funktioniert. Gehen Sie dazu wie folgt vor:

    1. Navigieren Sie noch einmal 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 hervorgehobener Option

    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. Es muss außerhalb des Editor ausgeführt werden, nachdem die Anwendung erstellt wurde, indem Visual Studio (oder die bereitgestellte Anwendung) verwendet wird.

Es folgt ein typisches Setup 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: Fenster

  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 Speicherort 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, empfiehlt es sich, die Standardskript Editor auf Visual Studio festgelegt ist, zu überprüfen. Wechseln Sie zu Einstellungen bearbeiten>, und navigieren Sie dann im neuen Fenster zu Externe Tools. Ändern Sie external script Editor in Visual Studio 2017. Schließen Sie das Fenster Einstellungen .

    Festlegen externer VS-Tools

  4. Wechseln Sie als Nächstes zuDateibuildeinstellungen>, 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 während derDateierstellungseinstellungen> folgendes sicher:

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

      Diese Anwendung ist für Ihren Desktop, muss also "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 Zuletzt installiert festgelegt.

    5. Build und Ausführen ist auf Lokaler Computer festgelegt.

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

      1. Wählen Sie hierzu Geöffnete 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 , 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 Spielereinstellungen . 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. Skripterstellungs-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 unter BuildeinstellungenUnity C#-Projekte ist nicht mehr abgeblendet. aktivieren Sie das Kontrollkästchen daneben.

  9. Schließen Sie das Fenster Buildeinstellungen .

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

    Wichtig

    Wenn Sie die Unity-Komponente Einrichten 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 in 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.

Derzeit gibt es ein bekanntes Problem in Unity, bei dem Plug-Ins nach dem Import neu konfiguriert werden müssen. Diese Schritte (4 bis 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 UNITY-Paket von GitHub heruntergeladen haben. Führen Sie anschließend folgende Schritte aus:

  1. Fügen Sie unitypackage mithilfe der Menüoption Assets > Import Package > Custom Package (Benutzerdefiniertes Paket importieren ) zu Unity hinzu.

  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.

    In Paket importieren

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

  4. Wechseln Sie in der Projektansicht unter Plug-Ins 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

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

    Anwenden von Plattform-DLLs

    Hinweis

    Wir kennzeichnen diese speziellen Plug-Ins nur für die Verwendung im Unity-Editor. Dies liegt daran, dass es verschiedene Versionen der gleichen Plug-Ins im WSA-Ordner gibt, die nach dem Export des Projekts aus Unity verwendet werden.

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

    • Microsoft.Data.Services.Client

      set don't process for DLLs (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 als "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 zum Ausführen dieser Anwendung enthalten.

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

  • Lesen von Entitäten in der Azure-Tabelle.
  • Bestimmen Sie mithilfe der Tabellendaten, welche Objekte an welcher Position erstellt werden sollen.

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

  • Registrieren des Linksklick-Ereignisses, 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 im Projektbereich,Ordnererstellen>. Nennen 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 aufC#-Skript erstellen>. 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 AccountKey-Wert 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 innerhalb 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 erzeugen.

        /// <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 Bereich Hierarchie auf die Hauptkamera, damit die zugehörigen 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 zur 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 zuständig ist:

  • Registrieren des Linksklick-Ereignisses, 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 CloudScene-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, die Sie im Azure-Funktions-App Service im Azure-Portal finden, wie in der folgenden Abbildung 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 erkennt und ziehen wird, wodurch wiederum GameObjects in der Szene verschoben wird. Wenn der Benutzer ein Objekt gezogen und gelöscht hat, wird der Name und die Koordinaten des Objekts an die UpdateCloudScene()-Methode übergeben, die den Azure Function App Service 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 Bereich Hierarchie auf die Hauptkamera, damit die zugehörigen Eigenschaften im Inspektor angezeigt werden.

    2. Wählen Sie im geöffneten Ordner Skripts das Skript CloudScene 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 für UWP

Alles, was für den Unity-Abschnitt dieses Projekts benötigt wird, ist 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 (mit neuer Ordner erneut), und nennen Sie ihn NH_Desktop_App.

      Ordnername NH_Desktop_App

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

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

Kapitel 12: Einrichten Mixed Reality Unity-Projekts

Es folgt 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 Speicherort 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, empfiehlt es sich, die Standardskript Editor auf Visual Studio festgelegt ist, zu überprüfen. Wechseln Sie zu Einstellungen bearbeiten>, und navigieren Sie dann im neuen Fenster zu Externe Tools. Ändern Sie external script 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 ändern Sie die Plattform auf Universelle Windows-Plattform, indem Sie auf die Schaltfläche Plattform wechseln klicken.

    Wechseln von Plattformen zu UWP

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

    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 Zuletzt installiert festgelegt.

    5. Build und Ausführen ist auf Lokaler Computer festgelegt.

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

      1. Wählen Sie hierzu Geöffnete 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 , 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 Spielereinstellungen . 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. Skripterstellungs-Back-End sollte .NET sein

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

        API-Kompatibilität

    2. Aktivieren Sie weiter unten im Bereich unter XR-Einstellungen (siehe Veröffentlichungseinstellungen) das Kontrollkästchen Virtual Reality Supported (Virtuelle Realität unterstützt), stellen Sie sicher, dass das Windows Mixed Reality SDK hinzugefügt wurde.

      xr-Einstellungen aktualisieren

    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 abgeblendet: Aktivieren Sie das Kontrollkästchen daneben.

  9. Schließen Sie nach Abschluss dieser Änderungen das Fenster Buildeinstellungen.

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

    Wichtig

    Wenn Sie die Unity-Komponente Einrichten 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 mit 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. Derzeit gibt es ein bekanntes Problem in Unity, bei dem Plug-Ins nach dem Import neu konfiguriert werden müssen. Diese Schritte (4 bis 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 UNITY-Paket heruntergeladen haben. Führen Sie anschließend folgende Schritte aus:

  1. Fügen Sie das unitypackage-Paket, das Sie aus dem obigen Beispiel heruntergeladen haben, mithilfe der Menüoption Assets>Import 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 unter Plug-Ins 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

    Plug-Ins auswählen

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

    Anwenden von Plattformänderungen

    Hinweis

    Sie markieren diese speziellen Plug-Ins so, dass sie nur im Unity-Editor verwendet werden. Dies liegt daran, dass es verschiedene Versionen der gleichen Plug-Ins im WSA-Ordner gibt, die nach dem Export des Projekts aus Unity verwendet werden.

  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 als "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, indem Sie das gleiche Verfahren ausführen, das in Kapitel 9 erläutert wird.

Nachdem Sie dieses Kapitel abgeschlossen haben, wird diese Klasse für beide Unity-Projekte 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.

    Neues C#-Skript mit dem Namen NotificationReceiver erstellen

  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 Den Namen Ihres Notification Hub-Diensts 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 deserialisiert die Benachrichtigung, bei der es sich um die Azure-Tabellenentität handelt, die in der Desktopanwendung verschoben wurde, und verschärbt dann das entsprechende GameObject in der MR-Szene an dieselbe Position.

    Wichtig

    Der Code ist 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 nur erstellt werden, wenn es auskommentiert ist. 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 Bereich Hierarchie auf die Hauptkamera, damit die zugehörigen Eigenschaften im Inspektor angezeigt werden.

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

    Ziehen des Benachrichtigungsempfängerskripts auf die Kamera

    Hinweis

    Wenn Sie dies für die 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 in UWP

Dieses Kapitel ist identisch mit dem Buildprozess für das vorherige Projekt. Alles, was für den Unity-Abschnitt dieses Projekts erforderlich ist, ist nun abgeschlossen, sodass es an der Zeit ist, es über Unity 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 (mit neuer Ordner erneut), und nennen Sie ihn NH_MR_App.

      Erstellen NH_MR_Apps Ordners

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

  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

Beachten Sie, dass nach dem Hinzufügen der folgenden NuGet-Pakete (und aufheben der Auskommentierung des Codes im nächsten Kapitel) der Code, wenn er innerhalb des Unity-Projekts erneut geöffnet wird, Fehler aufweist. 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.

Nachdem der Mixed Reality-Build abgeschlossen wurde, navigieren Sie zu dem 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 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.

    Öffnen des NuGet-Managers

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

    Suchen des Windows Azure-Messagingpakets

  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 ein Häkchen in das Kontrollkästchen neben Project eingefügt, zusammen mit dem Kontrollkästchen neben dem Assembly-CSharp - und UnityMRNotifHub-Projekt .

    alle Projekte markieren

  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 dann auf Installieren.

  6. Sie haben 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 die Auskommentierung eines Teils des Codes in der NotificationReceiver-Klasse aufheben.

Dies umfasst Folgendes:

  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 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 zu Beginn des Labs 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 zu Store, und ordnen Sie App dem Store zu....

    Öffnen der Store-Zuordnung

  3. Ein neues Fenster mit dem Namen Zuordnen Ihrer App zum 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 Computer desktop und die andere in Ihrem immersiven Headset.

Die immersive Headset-App wartet darauf, Änderungen an der Szene zu empfangen (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ösungsplattformx86, Lokaler Computer aus.

  3. Wählen Sie unter Projektmappenkonfigurationdie Option Debuggen aus.

    Screenshot, der zeigt, dass die Projektmappenkonfiguration auf der Symbolleiste 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 Projektmappendatei Ihrer UnityDesktopNotifHub-App in Visual Studio 2017.

  2. Wählen Sie auf der Lösungsplattformx86, Lokaler Computer aus.

  3. Wählen Sie unter Projektmappenkonfigurationdie Option Debuggen aus.

    Screenshot, der zeigt, dass die Projektmappenkonfiguration 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 vorgenommen, serialisiert und an den Funktions-App-Dienst gesendet. Der Funktions-App-Dienst aktualisiert dann die Tabelle zusammen mit dem Notification Hub. Nachdem er ein Update erhalten hat, sendet der Notification Hub 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 und sie in einer Szene verschiebt.

Ihre fertige Azure Notification Hubs-Anwendung

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

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