HoloLens (eerste generatie) en Azure 308: meldingen over apparaten


Notitie

De Mixed Reality Academy-zelfstudies zijn ontworpen met HoloLens (eerste generatie) en Mixed Reality In immersive Headsets in gedachten. Daarom vinden we het belangrijk om deze zelfstudies te laten staan voor ontwikkelaars die nog op zoek zijn naar richtlijnen voor het ontwikkelen van deze apparaten. Deze zelfstudies worden niet bijgewerkt met de nieuwste toolsets of interacties die worden gebruikt voor HoloLens 2. Ze blijven behouden om te blijven werken op de ondersteunde apparaten. Er is een nieuwe reeks zelfstudies die in de toekomst worden geplaatst, waarin wordt gedemonstreerd hoe u ontwikkelt voor HoloLens 2. Deze kennisgeving wordt bijgewerkt met een koppeling naar deze zelfstudies wanneer ze worden geplaatst.


eindproduct - start

In deze cursus leert u hoe u Notification Hubs-mogelijkheden kunt toevoegen aan een mixed reality-toepassing met behulp van Azure Notification Hubs, Azure Tables en Azure Functions.

Azure Notification Hubs is een Microsoft-service waarmee ontwikkelaars gerichte en gepersonaliseerde pushmeldingen kunnen verzenden naar elk platform, allemaal mogelijk gemaakt in de cloud. Hierdoor kunnen ontwikkelaars effectief communiceren met eindgebruikers of zelfs communiceren tussen verschillende toepassingen, afhankelijk van het scenario. Ga naar de pagina Azure Notification Hubs voor meer informatie.

Azure Functions is een Microsoft-service waarmee ontwikkelaars kleine stukjes code, 'functies', in Azure kunnen uitvoeren. Dit biedt een manier om werk te delegeren naar de cloud, in plaats van uw lokale toepassing, wat veel voordelen kan hebben. Azure Functions ondersteunt verschillende ontwikkeltalen, waaronder # C, # F, Node.js, Java en PHP. Ga voor meer informatie naar Azure Functions pagina.

Azure Tables is een Microsoft-cloudservice waarmee ontwikkelaars gestructureerde niet-SQL in de cloud kunnen opslaan, zodat ze gemakkelijk overal toegankelijk zijn. De service maakt gebruik van een schemaloos ontwerp, waardoor tabellen naar behoefte kunnen worden gevolteld en dus zeer flexibel is. Ga naar de pagina Azure Tables voor meer informatie

Nadat u deze cursus hebt voltooid, hebt u een mixed reality immersive headset toepassing en een desktop-pc-toepassing, waarmee u het volgende kunt doen:

  1. Met de desktop-pc-app kan de gebruiker een object in 2D-ruimte (X en Y) verplaatsen met behulp van de muis.

  2. De verplaatsing van objecten binnen de pc-app wordt met behulp van JSON naar de cloud verzonden. Deze heeft de vorm van een tekenreeks met een object-id, type en transformatie-informatie (X- en Y-coördinaten).

  3. De mixed reality-app, die een identieke scène heeft voor de desktop-app, ontvangt meldingen met betrekking tot objectverplaatsing van de Notification Hubs-service (die zojuist is bijgewerkt door de desktop-pc-app).

  4. Bij ontvangst van een melding, die de object-id, het type en de transformatie-informatie bevat, wordt de ontvangen mixed reality app toegepast op een eigen scène.

In uw toepassing is het aan u om te weten hoe u de resultaten integreert met uw ontwerp. Deze cursus is ontworpen om u te leren hoe u een Azure-service integreert met uw Unity-Project. Het is uw taak om de kennis die u van deze cursus hebt op te doen, te gebruiken om uw mixed reality verbeteren. Deze cursus is een zelfstandige zelfstudie, die niet rechtstreeks betrekking heeft op andere Mixed Reality Labs.

Ondersteuning voor apparaten

Cursus HoloLens Immersive headsets
MR en Azure 308: meldingen over apparaten ✔️ ✔️

Notitie

Hoewel deze cursus voornamelijk gericht is op Windows Mixed Reality immersive (VR)-headsets, kunt u ook toepassen wat u in deze cursus leert om te Microsoft HoloLens. Terwijl u de cursus volgt, ziet u notities over wijzigingen die u mogelijk moet gebruiken om ondersteuning te HoloLens. Wanneer u HoloLens, ziet u mogelijk een echo tijdens spraakopname.

Vereisten

Notitie

Deze zelfstudie is ontworpen voor ontwikkelaars die basiservaring hebben met Unity en C#. Houd er ook rekening mee dat de vereisten en geschreven instructies in dit document staan voor wat is getest en geverifieerd op het moment van schrijven (mei 2018). U kunt de nieuwste software gebruiken, zoals vermeld in het artikel Hulpprogramma's installeren, maar u mag er niet van uitgaan dat de informatie in deze cursus perfect aansluit bij wat u in nieuwere software vindt dan wat hieronder wordt vermeld.

Voor deze cursus raden we de volgende hardware en software aan:

Voordat u begint

  • Om problemen met het bouwen van dit project te voorkomen, wordt u ten zeerste aangeraden om het project dat in deze zelfstudie wordt vermeld, te maken in een hoofdmap of in de buurt van de hoofdmap (lange mappaden kunnen problemen veroorzaken tijdens het bouwen).
  • U moet de eigenaar van uw Microsoft-ontwikkelaar-portal en de portal voor toepassingsregistratie zijn, anders hebt u geen toegang tot de app in hoofdstuk 2.

Hoofdstuk 1: Een toepassing maken in de Microsoft-ontwikkelaar-portal

Als u de Azure Notification Hubs-service wilt gebruiken, moet u een toepassing maken in de Microsoft-ontwikkelaar-portal, omdat uw toepassing moet worden geregistreerd, zodat deze meldingen kan verzenden en ontvangen.

  1. Meld u aan bij Microsoft-ontwikkelaar Portal.

    U moet zich aanmelden bij uw Microsoft-account.

  2. Klik in het dashboard op Een nieuwe app maken.

    een app maken

  3. Er wordt een pop-up weergegeven, waarin u een naam voor uw nieuwe app moet reserveren. Voeg in het tekstvak een geschikte naam in; Als de gekozen naam beschikbaar is, wordt rechts van het tekstvak een vinkje weergegeven. Zodra u een beschikbare naam hebt ingevoegd, klikt u linksonder in het pop-upvenster op de knop Productnaam reserveren.

    een naam omkeren

  4. Nu de app is gemaakt, bent u klaar om naar het volgende hoofdstuk te gaan.

Hoofdstuk 2: uw nieuwe apps-referenties ophalen

Meld u aan bij de portal voor toepassingsregistratie, waar uw nieuwe app wordt weergegeven, en haal de referenties op die worden gebruikt voor het instellen van de Notification Hubs-service in de Azure-portal.

  1. Navigeer naar de portal voor toepassingsregistratie.

    portal voor toepassingsregistratie

    Waarschuwing

    U moet uw Microsoft-account gebruiken om u aan te melden.
    Dit moet het Microsoft-account zijn dat u in het vorige hoofdstukhebt gebruikt, met de Windows Store Developer-portal.

  2. U vindt uw app in de sectie Mijn toepassingen. Wanneer u deze hebt gevonden, klikt u erop en wordt u naar een nieuwe pagina met de naam van de app plus Registratie gezet.

    uw zojuist geregistreerde app

  3. Schuif omlaag op de registratiepagina om de sectie Toepassingsgeheimen en de pakket-SID voor uw app te zoeken. Kopieer beide voor gebruik met het instellen van de Azure Notification Hubs Service in het volgende hoofdstuk.

    toepassingsgeheimen

Hoofdstuk 3: Azure Portal instellen: een Notification Hubs service

Als de referenties voor uw apps zijn opgehaald, gaat u naar Azure Portal, waar u een Azure Notification Hubs Service maakt.

  1. Meld u aan bij Azure Portal.

    Notitie

    Als u nog geen Azure-account hebt, moet u er een maken. Als u deze zelfstudie volgt in een leslokaal- of labsituatie, vraagt u uw docent of een van de proctors om hulp bij het instellen van uw nieuwe account.

  2. Wanneer u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek en zoekt u naar Notification Hub en klikt u op Enter.

    zoeken naar Notification Hub

    Notitie

    Het woord Nieuw _ is mogelijk vervangen door _Een resource maken, in nieuwere portals.

  3. De nieuwe pagina geeft een beschrijving van de Notification Hubs service. Selecteer linksonder in deze prompt de knop Maken om een associatie met deze service te maken.

    Notification Hubs-exemplaar maken

  4. Zodra u op Maken hebt geklikt:

    1. Voeg de gewenste naam in voor dit service-exemplaar.

    2. Geef een naamruimte op die u aan deze app kunt koppelen.

    3. Selecteer een locatie.

    4. Kies een resourcegroep of maak een nieuwe. Een resourcegroep biedt een manier om de toegang te bewaken, te beheren, de facturering voor een verzameling Azure-assets in terichten en te beheren. Het is raadzaam om alle Azure-services die zijn gekoppeld aan één project (bijvoorbeeld deze labs) onder een gemeenschappelijke resourcegroep te houden.

      Als u meer wilt weten over Azure-resourcegroepen, volgt u deze koppeling over het beheren van een resourcegroep.

    5. Selecteer een geschikt abonnement.

    6. U moet ook bevestigen dat u de voorwaarden hebt begrepen die op deze service zijn toegepast.

    7. Selecteer Maken.

      Servicedetails invullen

  5. Nadat u op Maken hebt geklikt, moet u wachten tot de service is gemaakt. Dit kan een minuut duren.

  6. Er wordt een melding weergegeven in de portal zodra het service-exemplaar is gemaakt.

    melding

  7. Klik op de knop Ga naar resource in de melding om uw nieuwe service-exemplaar te verkennen. U wordt naar uw nieuwe Notification Hub-service-exemplaar overgebracht.

    naar de resource gaan

  8. Klik op de overzichtspagina halverwege de pagina op Windows (WNS). In het deelvenster aan de rechterkant worden twee tekstvelden weergegeven, waarvoor uw pakket-SID en beveiligingssleutel zijn vereist vanuit de app die u eerder hebt ingesteld.

    nieuw gemaakte hubs-service

  9. Nadat u de gegevens in de juiste velden hebt gekopieerd, klikt u op Opslaan en ontvangt u een melding wanneer de Notification Hub is bijgewerkt.

    beveiligingsdetails kopiëren

Hoofdstuk 4 - Azure Portal instellen: Table Service maken

Nadat u uw Notification Hubs Service-exemplaar hebt gemaakt, gaat u terug naar azure portal, waar u een Azure Tables Service maakt door een Storage maken.

  1. Meld u aan bij Azure Portal als u zich nog niet hebt aangemeld.

  2. Nadat u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek en zoekt u naar Storage account en klikt u op Enter.

    Notitie

    Het woord Nieuw _ is mogelijk vervangen door _Een resource maken, in nieuwere portals.

  3. Selecteer Storage-account - blob, bestand, tabel, wachtrij in de lijst.

    zoeken naar opslagaccount

  4. De nieuwe pagina geeft een beschrijving van de Storage accountservice. Selecteer linksonder in deze prompt de knop Maken om een exemplaar van deze service te maken.

    opslag-exemplaar maken

  5. Nadat u op Maken hebt geklikt, wordt er een deelvenster weergegeven:

    1. Voeg de gewenste Naam in voor dit service-exemplaar (mag alleen kleine letters zijn).

    2. Klik bij Implementatiemodel op Resource Manager.

    3. Bij Soort account selecteert u in de vervolgkeuzelijst Storage (algemeen gebruik v1).

    4. Selecteer een geschikte locatie.

    5. Selecteer in de vervolgkeuzelijst Replicatie de optie Read-access-geo-redundant storage (RA-GRS).

    6. Klik voor Prestaties op Standaard.

    7. Selecteer in de sectie Veilige overdracht vereist de optie Uitgeschakeld.

    8. Selecteer een geschikt abonnement in de vervolgkeuzelijst Abonnement.

    9. Kies een resourcegroep of maak een nieuwe. Een resourcegroep biedt een manier om de toegang te bewaken, te beheren, de facturering voor een verzameling Azure-assets in terichten en te beheren. Het is raadzaam om alle Azure-services die zijn gekoppeld aan één project (bijvoorbeeld deze labs) onder een gemeenschappelijke resourcegroep te houden.

      Als u meer wilt weten over Azure-resourcegroepen, volgt u deze koppeling over het beheren van een resourcegroep.

    10. Laat Virtuele netwerken op Uitgeschakeld als dit een optie voor u is.

    11. Klik op Create.

      opslaggegevens invullen

  6. Nadat u op Maken hebt geklikt, moet u wachten tot de service is gemaakt. Dit kan een minuut duren.

  7. Er wordt een melding weergegeven in de portal zodra het service-exemplaar is gemaakt. Klik op de meldingen om uw nieuwe service-exemplaar te verkennen.

    nieuwe opslagmelding

  8. Klik op de knop Ga naar resource in de melding om uw nieuwe service-exemplaar te verkennen. U wordt naar de nieuwe overzichtspagina van Storage service-exemplaar doorvernomen.

    naar de resource gaan

  9. Klik op de overzichtspagina aan de rechterkant op Tabellen.

  10. Het deelvenster aan de rechterkant wordt gewijzigd om de tabelservicegegevens weer te geven, waarin u een nieuwe tabel moet toevoegen. Klik hiervoor op de knop + Tabel in de linkerbovenhoek.

    tabellen openen

  11. Er wordt een nieuwe pagina weergegeven, waarin u een tabelnaam moet invoeren. Dit is de naam die u gebruikt om te verwijzen naar de gegevens in uw toepassing in latere hoofdstukken. Voeg een geschikte naam in en klik op OK.

    nieuwe tabel maken

  12. Zodra de nieuwe tabel is gemaakt, kunt u deze zien op de pagina Tabelservice (onderaan).

    nieuwe tabel gemaakt

Hoofdstuk 5: De Azure-tabel voltooien in Visual Studio

Nu uw Table Service Storage-account is ingesteld, is het tijd om er gegevens aan toe te voegen, die worden gebruikt om informatie op te slaan en op te halen. Het bewerken van uw tabellen kan worden uitgevoerd via Visual Studio.

  1. Open Visual Studio.

  2. Klik in het menu op > Cloud Explorer weergeven.

    Cloud Explorer openen

  3. De Cloud Explorer wordt geopend als een gedokt item (wacht even, aangezien het laden tijd kan duren).

    Notitie

    Als het abonnement dat u hebt gebruikt om uw Storage accounts te maken niet zichtbaar is, controleert u of u het volgende hebt:

    • Aangemeld bij hetzelfde account als het account dat u hebt gebruikt voor Azure Portal.

    • U hebt uw abonnement geselecteerd op de pagina Accountbeheer (mogelijk moet u een filter toepassen op basis van uw accountinstellingen):

      abonnement zoeken

  4. Uw Azure-cloudservices worden weergegeven. Zoek Storage accounts en klik op de pijl links van de accounts om uw accounts uit te vouwen.

    opslagaccounts openen

  5. Zodra het account is uitgebreid, moet uw zojuist Storage account beschikbaar zijn. Klik op de pijl links van uw opslag en zodra deze is uit uitgebreid, gaat u naar Tabellen en klikt u op de pijl erboven om de tabel weer te geven die u in het vorige hoofdstuk hebt gemaakt. Dubbelklik op uw tabel.

    tabel met scèneobjecten openen

  6. Uw tabel wordt geopend in het midden van uw Visual Studio venster. Klik op het tabelpictogram met + het (plus) erop.

    nieuwe tabel toevoegen

  7. Er wordt een venster weergegeven met de vraag om Entiteit toevoegen. U maakt in totaal drie entiteiten, elk met verschillende eigenschappen. U ziet dat PartitionKey en RowKey al zijn opgegeven, omdat deze door de tabel worden gebruikt om uw gegevens te vinden.

    partitie- en rijsleutel

  8. Werk de waarde van de PartitionKey en RowKey als volgt bij (vergeet niet om dit te doen voor elke rij-eigenschap die u toevoegt, maar vereenvoudig de RowKey elke keer):

    juiste waarden toevoegen

  9. Klik op Eigenschap toevoegen om extra rijen met gegevens toe te voegen. Zorg ervoor dat uw eerste lege tabel overeen komt met de onderstaande tabel.

  10. Klik op OK wanneer u klaar bent.

    klik op OK wanneer u klaar bent

    Waarschuwing

    Zorg ervoor dat u de vermeldingen Type van de X, Y en Z hebt gewijzigd in Double.

  11. U ziet dat uw tabel nu een rij met gegevens heeft. Klik nogmaals + op het pictogram (plus) om een andere entiteit toe te voegen.

    eerste rij

  12. Maak een extra eigenschap en stel de waarden van de nieuwe entiteit in op basis van de onderstaande waarden.

    kubus toevoegen

  13. Herhaal de laatste stap om een andere entiteit toe te voegen. Stel de waarden voor deze entiteit in op de waarden die hieronder worden weergegeven.

    cilinder toevoegen

  14. Uw tabel moet er nu uitzien als de onderstaande tabel.

    tabel voltooid

  15. U hebt dit hoofdstuk voltooid. Zorg ervoor dat u op slaan.

Hoofdstuk 6: Een Azure-functie-app maken

Maak een Azure-functie-app die wordt aangeroepen door de bureaubladtoepassing om de Tabelservice bij te werken en een melding te verzenden via de Notification Hub.

Eerst moet u een bestand maken waarmee uw Azure-functie de bibliotheken kan laden die u nodig hebt.

  1. Open Kladblok (druk Windows toets en typ Kladblok).

    Kladblok openen

  2. Als Kladblok geopend, voegt u de onderstaande JSON-structuur in. Zodra u dat hebt gedaan, kunt u het op uw bureaublad opslaan als project.jsop. Het is belangrijk dat de naam juist is: zorg ervoor dat deze GEEN .txt heeft. Dit bestand definieert de bibliotheken die door uw functie worden gebruikt. Als u NuGet hebt gebruikt, ziet dit er vertrouwd uit.

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "7.0.0",
            "Microsoft.Azure.NotificationHubs" : "1.0.9",
            "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0"
        }
        }
    }
    }
    
  3. Meld u aan bij Azure Portal.

  4. Wanneer u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek en zoekt u naar Functie-app en drukt u op Enter.

    zoeken naar functie-app

    Notitie

    Het woord Nieuw is mogelijk vervangen door Een resource maken in nieuwere portals.

  5. De nieuwe pagina geeft een beschrijving van de functie-app-service. Selecteer linksonder in deze prompt de knop Maken om een verband met deze service te maken.

    functie-app-exemplaar

  6. Nadat u op Maken hebt geklikt, vult u het volgende in:

    1. Voeg bij App-naam de gewenste naam in voor dit service-exemplaar.

    2. Selecteer een Abonnement.

    3. Selecteer de prijscategorie die geschikt is voor u. Als dit de eerste keer is dat u een Functie-App Service, moet er een gratis laag voor u beschikbaar zijn.

    4. Kies een resourcegroep of maak een nieuwe. Een resourcegroep biedt een manier om de toegang te bewaken, te beheren, facturering voor een verzameling Azure-assets in terichten en te beheren. Het is raadzaam om alle Azure-services die zijn gekoppeld aan één project (zoals deze labs) onder een algemene resourcegroep te houden.

      Als u meer wilt weten over Azure-resourcegroepen, volgt u deze koppeling over het beheren van een resourcegroep.

    5. Klik voor besturingssysteem op Windows, omdat dit het beoogde platform is.

    6. Selecteer een hostingplan (in deze zelfstudie wordt gebruik gemaakt van een verbruiksplan).

    7. Selecteer een locatie (kies dezelfde locatie als de opslag die u in de vorige stap hebt gemaakt)

    8. Voor de Storage moet u de service Storage u in de vorige stap hebt gemaakt.

    9. U hebt application Insights nodig in deze app. Laat deze daarom op Uit.

    10. Klik op Create.

      nieuw exemplaar maken

  7. Nadat u op Maken hebt geklikt, moet u wachten tot de service is gemaakt. Dit kan een minuut duren.

  8. Er wordt een melding weergegeven in de portal zodra het service-exemplaar is gemaakt.

    nieuwe melding

  9. Klik op de meldingen om uw nieuwe service-exemplaar te verkennen.

  10. Klik op de knop Ga naar resource in de melding om uw nieuwe service-exemplaar te verkennen.

    naar de resource gaan

  11. Klik op + het pictogram (plus) naast Functies om nieuwe te maken.

    nieuwe functie toevoegen

  12. In het centrale deelvenster wordt het venster Functie maken weergegeven. Negeer de informatie in de bovenste helft van het deelvenster en klik op Aangepaste functie , die zich onderaan bevindt (in het blauwe gebied, zoals hieronder).

    aangepaste functie

  13. Op de nieuwe pagina in het venster worden verschillende functietypen weergegeven. Schuif omlaag om de paarse typen weer te zien en klik op het HTTP PUT-element.

    http put-koppeling

    Belangrijk

    Mogelijk moet u verder omlaag schuiven op de pagina (en deze afbeelding ziet er mogelijk niet precies hetzelfde uit als er updates zijn uitgevoerd in de Azure-portal), maar u zoekt naar een element met de naam HTTP PUT.

  14. Het HTTP PUT-venster wordt weergegeven, waarin u de functie moet configureren (zie hieronder voor de afbeelding).

    1. Voor Taal selecteert u C in het vervolgkeuzemenu. #

    2. Voer bij Naam een geschikte naam in.

    3. Selecteer in het vervolgkeuzemenu Verificatieniveau de optie Functie .

    4. Voor de sectie Tabelnaam moet u de exacte naam gebruiken die u eerder hebt gebruikt om uw Table-service te maken (inclusief dezelfde lettercase).

    5. Gebruik in Storage de vervolgkeuzelijst accountverbinding het vervolgkeuzemenu en selecteer uw opslagaccount. Als deze niet bestaat, klikt u op de hyperlink Nieuw naast de sectietitel om een ander deelvenster weer te geven waarin uw opslagaccount moet worden weergegeven.

      nieuwe opslag

  15. Klik op Maken en u ontvangt een melding dat uw instellingen zijn bijgewerkt.

    functie maken

  16. Nadat u op Maken hebt geklikt, wordt u omgeleid naar de functie-editor.

    functiecode bijwerken

  17. Voeg de volgende code in de functie-editor in (vervang de code in de functie ):

    #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; }
    }
    

    Notitie

    Met behulp van de opgenomen bibliotheken ontvangt de functie de naam en locatie van het object dat is verplaatst in de Unity-scène (als een C#-object met de naam UnityGameObject). Dit object wordt vervolgens gebruikt om de objectparameters in de gemaakte tabel bij te werken. Hierna maakt de functie een aanroep naar de gemaakte Notification Hub-service, die alle geabonneerde toepassingen waarschuwt.

  18. Klik met de code op Opslaan.

  19. Klik vervolgens op < het pictogram (pijl) aan de rechterkant van de pagina.

    deelvenster Uploaden openen

  20. Er schuift vanaf de rechterkant een paneel naar binnen. Klik in dat deelvenster op Upload en er wordt een bestandsbrowser weergegeven.

  21. Navigeer naar en klik op het project.js bestand dat u eerder in Kladblok hebt gemaakt en klik vervolgens op de knop Openen. Dit bestand definieert de bibliotheken die door uw functie worden gebruikt.

    json uploaden

  22. Wanneer het bestand is geüpload, wordt het weergegeven in het deelvenster aan de rechterkant. Als u erop klikt, wordt deze geopend in de functie-editor. Deze moet er precies hetzelfde uitzien als de volgende afbeelding (onder stap 23).

  23. Klik vervolgens in het deelvenster aan de linkerkant onder Functies op de koppeling Integreren.

    functie integreren

  24. Klik op de volgende pagina in de rechterbovenhoek op Geavanceerde editor (zoals hieronder).

    geavanceerde editor openen

  25. Een function.jsbestand wordt geopend in het middelste deelvenster, dat moet worden vervangen door het volgende codefragment. Hiermee definieert u de functie die u bouwt en de parameters die aan de functie worden doorgegeven.

    {
    "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. Uw editor moet er nu uitzien zoals in de onderstaande afbeelding:

    terug naar standaardeditor

  27. Mogelijk ziet u dat de invoerparameters die u zojuist hebt ingevoegd mogelijk niet overeenkomen met uw tabel- en opslaggegevens en moeten daarom worden bijgewerkt met uw gegevens. Doe dit hier niet, aangezien dit hierna wordt behandeld. Klik op de koppeling Standaardeditor in de rechterbovenhoek van de pagina om terug te gaan.

  28. Klik in de Standard-editor op Azure Table Storage (tabel), onder Invoer.

    Tabelinvoer

  29. Zorg ervoor dat de volgende gegevens overeenkomen met uw gegevens, aangezien deze mogelijk anders zijn (er is een afbeelding onder de volgende stappen):

    1. Tabelnaam: de naam van de tabel die u hebt gemaakt in uw Azure Storage, Tables-service.

    2. Storage accountverbinding: klik op Nieuw, dat naast de vervolgkeuzelijst wordt weergegeven, waarna rechts van het venster een deelvenster wordt weergegeven.

      nieuwe opslag

      1. Selecteer uw Storage account , dat u eerder hebt gemaakt om de functie-apps te hosten.

      2. U ziet dat de Storage accountverbindingswaarde is gemaakt.

      3. Zorg ervoor dat u op Opslaan drukt wanneer u klaar bent.

    3. De pagina Invoer moet nu overeenkomen met het onderstaande, met uw gegevens.

      invoer is voltooid

  30. Klik vervolgens op Azure Notification Hub (melding) - onder Uitvoer. Zorg ervoor dat de volgende gegevens overeenkomen met uw gegevens, aangezien deze kunnen verschillen (er is een afbeelding onder de volgende stappen):

    1. Notification Hub-naam: dit is de naam van uw Notification Hub-service-exemplaar dat u eerder hebt gemaakt.

    2. Notification Hubs naamruimteverbinding: klik op Nieuw, dat naast de vervolgkeuzelijst wordt weergegeven.

      uitvoer controleren

    3. De pop-up Verbinding wordt weergegeven (zie de onderstaande afbeelding), waarin u de naamruimte van de Notification Hub moet selecteren die u eerder hebt ingesteld.

    4. Selecteer uw Notification Hub-naam in het middelste vervolgkeuzemenu.

    5. Stel de vervolgkeuzelijst Beleid in op DefaultFullSharedAccessSignature.

    6. Klik op de knop Selecteren om terug te gaan.

      uitvoerupdate

  31. De pagina Uitvoer moet nu overeenkomen met de onderstaande, maar in plaats daarvan met uw gegevens. Zorg ervoor dat u op Opslaan drukt.

Waarschuwing

Bewerk de naam van de Notification Hub niet rechtstreeks (dit moet allemaal worden gedaan met behulp van de Geavanceerde editor, mits u de vorige stappen correct hebt uitgevoerd.

voltooide uitvoer

  1. Op dit moment moet u de functie testen om te controleren of deze werkt. Om dit te doen:

    1. Navigeer nog een keer naar de functiepagina:

      voltooide uitvoer

    2. Klik op de functiepagina op het tabblad Testen aan de rechterkant van de pagina om de blade Testen te openen:

      voltooide uitvoer

    3. Plak in het tekstvak Aanvraagtekst van de blade de onderstaande code:

      {  
          "Type":null,
          "X":3,
          "Y":0,
          "Z":1,
          "PartitionKey":null,
          "RowKey":"Obj2",
          "Timestamp":"0001-01-01T00:00:00+00:00",
          "ETag":null
      }
      
    4. Als de testcode is uitgevoerd, klikt u rechtsonder op de knop Uitvoeren om de test uit te voeren. De uitvoerlogboeken van de test worden weergegeven in het consolegebied, onder uw functiecode.

      voltooide uitvoer

    Waarschuwing

    Als de bovenstaande test mislukt, moet u controleren of u de bovenstaande stappen exact hebt gevolgd, met name de instellingen in het integratiepaneel.

Hoofdstuk 7: Desktop Unity-Project

Belangrijk

De bureaubladtoepassing die u nu maakt, werkt niet in de Unity Editor. Het moet buiten de Editor worden uitgevoerd, na het bouwen van de toepassing, met behulp van Visual Studio (of de geïmplementeerde toepassing).

Hier volgt een typische set voor het ontwikkelen met Unity en mixed reality, en als zodanig is een goede sjabloon voor andere projecten.

Stel uw gegevens in en test mixed reality immersive headset.

Notitie

Voor deze cursus hebt u geen bewegingscontrollers nodig. Als u ondersteuning nodig hebt bij het instellen van de immersive headset, volgt u deze koppeling over het instellen van Windows Mixed Reality.

  1. Open Unity en klik op New.

    nieuw Unity-project

  2. U moet een Unity-naam Project, voeg UnityDesktopNotifHub in. Zorg ervoor dat het projecttype is ingesteld op 3D. Stel de Locatie in op een locatie die geschikt is voor u (onthoud dat dichter bij de hoofddirecties beter is). Klik vervolgens op Project maken.

    project maken

  3. Als Unity is geopend, is het de moeite waard om te controleren of de standaard scripteditor is ingesteld op Visual Studio. Ga naar Voorkeuren > bewerken en navigeer in het nieuwe venster naar Externe hulpprogramma's. Wijzig External Script Editor in Visual Studio 2017. Sluit het venster Voorkeuren.

    externe VS-hulpprogramma's instellen

  4. Ga vervolgens naar Bestands bouwen Instellingen selecteer Universal Windows Platform en klik vervolgens op de knop Platform wisselen > om uw selectie toe te passen.

    switch-platformen

  5. Zorg ervoor dat, terwijl u zich nog Instellingen > bestandsbouw, voor het volgende zorgt:

    1. Doelapparaat is ingesteld op Elk apparaat

      Deze toepassing is voor uw bureaublad, dus moet Elk apparaat zijn

    2. Buildtype is ingesteld op D3D

    3. SDK is ingesteld op Meest recent geïnstalleerd

    4. Visual Studio versie is ingesteld op Meest recent geïnstalleerd

    5. Bouwen en uitvoeren is ingesteld op Lokale machine

    6. Hier is het de moeite waard om de scène op te slaan en toe te voegen aan de build.

      1. Selecteer hiervoor Open scenes toevoegen. Er wordt een venster opslaan weergegeven.

        open scènes toevoegen

      2. Maak een nieuwe map voor deze scène en een toekomstige scène en selecteer vervolgens de knop Nieuwe map om een nieuwe map te maken met de naam Scènes.

        map nieuwe scènes

      3. Open de zojuist gemaakte map Scènes en typ NH _ Desktop _ Scene in het tekstveld Bestandsnaam. Druk vervolgens op Opslaan.

        nieuwe NH_Desktop_Scene

    7. De overige instellingen, in Build Instellingen, moeten voor nu standaard worden gebruikt.

  6. In hetzelfde venster klikt u op de Instellingen speler. Hiermee wordt het bijbehorende deelvenster geopend in de ruimte waar de Inspector zich bevindt.

  7. In dit deelvenster moeten enkele instellingen worden geverifieerd:

    1. Op het tabblad Overige Instellingen:

      1. Scripting Runtime Version should be Experimental (.NET 4.6 Equivalent) (Scripting Runtime-versie moet experimenteel zijn (.NET 4.6 Equivalent)

      2. Scriptback-end moet .NET zijn

      3. Api-compatibiliteitsniveau moet .NET 4.6 zijn

        4.6 net-versie

    2. Controleer op het tabblad Instellingen onder Mogelijkheden het volgende:

      • InternetClient

        internetclient tikken

  8. Terug in Build Instellingen Unity C # Projects niet langer grijs; vink het selectievakje er naast aan.

  9. Sluit het venster Build Settings.

  10. Sla uw scène op en Project > Bestandscène opslaan/Bestand > opslaan Project.

    Belangrijk

    Als u het Unity Set up-onderdeel voor dit project (desktop-app) wilt overslaan en direct in code wilt doorgaan, kunt u dit .unitypackagedownloaden, het importeren in uw project als een aangepast pakket envervolgens doorgaan vanaf hoofdstuk 9. U moet nog steeds de scriptonderdelen toevoegen.

Hoofdstuk 8: De DLL's importeren in Unity

U gebruikt Azure Storage voor Unity (die zelf gebruik maakt van de .NET SDK voor Azure). Volg voor meer informatie deze koppeling over Azure Storage voor Unity.

Er is momenteel een bekend probleem in Unity waardoor invoegvoegingen na het importeren opnieuw moeten worden geconfigureerd. Deze stappen (4- 7 in deze sectie) zijn niet meer vereist nadat de fout is opgelost.

Als u de SDK in uw eigen project wilt importeren, moet u ervoor zorgen dat u de nieuwste versie van .unitypackage hebt gedownload GitHub. Ga als volgt verder:

  1. Voeg het .unitypackage toe aan Unity met behulp van de menuoptie Assets Import Package Custom > > Package.

  2. In het vak Import Unity Package dat verschijnt, kunt u alles selecteren onder Plugin > Storage. Alle andere selectievakjes uit, omdat dit niet nodig is voor deze cursus.

    importeren naar pakket

  3. Klik op de knop Importeren om de items aan uw project toe te voegen.

  4. Ga naar de Storage onder Plugins in Project weergave en selecteer alleen de volgende invoegvoegingen:

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

Alle platformen uitvinden

  1. Als u deze specifieke invoegvoegingen hebt geselecteerd, kunt u Elk platform uit en WSAPlayer uitvinden en vervolgens op Toepassen klikken.

    platform-DLL's toepassen

    Notitie

    Deze specifieke invoegvoegingen worden alleen in de Unity Editor gebruikt. Dit komt doordat er verschillende versies van dezelfde invoegingen in de WSA-map staan die worden gebruikt nadat het project uit Unity is geëxporteerd.

  2. Selecteer alleen Storage in de map met de Storage invoegingsinvoeging:

    • Microsoft.Data.Services.Client

      instellen: niet verwerken voor dll's

  3. Selecteer het selectievakje Niet verwerken onder Platform Instellingen klik op Toepassen.

    geen verwerking toepassen

    Notitie

    We markeren deze invoeging 'Niet verwerken', omdat de Patcher van de Unity-assembly problemen heeft met het verwerken van deze invoeging. De invoegvoeging werkt nog steeds, ook al wordt deze niet verwerkt.

Hoofdstuk 9: de klasse TableToComputer maken in het Desktop Unity-project

U moet nu de scripts maken die de code bevatten om deze toepassing uit te voeren.

Het eerste script dat u moet maken, is TableTo Even, dat verantwoordelijk is voor:

  • Entiteiten in de Azure-tabel lezen.
  • Bepaal met behulp van de tabelgegevens welke objecten moeten worden gemaakt en op welke positie.

Het tweede script dat u moet maken, is CloudCloud, dat verantwoordelijk is voor:

  • De gebeurtenis met de linkerklik registreren, zodat de gebruiker objecten rond de scène kan slepen.
  • De objectgegevens uit deze Unity-scène serialiseren en verzenden naar de Azure Function-app.

Deze klasse maken:

  1. Klik met de rechtermuisknop in de map Asset in Project deelvenster Map > maken. Noem de map Scripts.

    map scripts maken

    map scripts maken 2

  2. Dubbelklik op de map die u zojuist hebt gemaakt om deze te openen.

  3. Klik met de rechtermuisknop in de map Scripts en klik op > C#-script maken. Noem het script TableToWacht.

    naam van nieuw c#-script  TableToNieuwe naam wijzigen

  4. Dubbelklik op het script om het te openen in Visual Studio 2017.

  5. Voeg de volgende naamruimten toe:

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Table;
    using UnityEngine;
    
  6. Voeg binnen de klasse de volgende variabelen in:

        /// <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 -- ";
    

    Notitie

    Vervang de waarde accountName door uw Azure Storage-servicenaam en accountKey-waarde door de sleutelwaarde in de Azure Storage-service, in azure Portal (zie afbeelding hieronder).

    accountsleutel ophalen

  7. Voeg nu de methoden Start() en Awake() toe om de klasse te initialiseren.

        /// <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. Voeg in de klasse TableToPlatform de methode toe waarmee de waarden uit de Azure-tabel worden opgehaald en gebruikt om de juiste primitieven in de scène te maken.

        /// <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. Buiten de klasse TableTo Wilt moet u de klasse definiëren die door de toepassing wordt gebruikt om de Tabelentiteiten te serialiseren en deserialiseren.

        /// <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. Zorg ervoor dat u Opslaan hebt voordat u terug gaat naar de Unity Editor.

  11. Klik op de hoofdcamera in het deelvenster Hiërarchie, zodat de eigenschappen ervan worden weergegeven in inspector.

  12. Selecteer, nu de map Scripts is geopend, het script TableToBoeken-bestand en sleep het naar de hoofdcamera. Het resultaat moet er als hieronder zijn:

    script toevoegen aan hoofdcamera

Hoofdstuk 10: de klasse CloudPlatform maken in de Desktop Unity-Project

Het tweede script dat u moet maken, is CloudCloud, dat verantwoordelijk is voor:

  • De gebeurtenis met de linkerklik registreren, zodat de gebruiker objecten rond de scène kan slepen.

  • De objectgegevens uit deze Unity-scène serialiseren en verzenden naar de Azure Function-app.

Het tweede script maken:

  1. Klik met de rechtermuisknop in de map Scripts en klik op Maken, C # Script. Noem het script CloudCloud

    nieuwe c#-scriptnaam  Cloud Fout wijzigen

  2. Voeg de volgende naamruimten toe:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.Networking;
    
  3. Voeg de volgende variabelen in:

        /// <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. Vervang de waarde azureFunctionEndpoint door de URL van uw Azure Function-app in de Azure Function App Service, in Azure Portal, zoals wordt weergegeven in de onderstaande afbeelding:

    functie-URL op te halen

  5. Voeg nu de methoden Start() en Awake() toe om de klasse te initialiseren.

        /// <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. Voeg in de methode Update() de volgende code toe waarmee de muisinvoer wordt gedetecteerd en gesleept, die op zijn beurt GameObjects in de scène verplaatst. Als de gebruiker een object heeft gesleept en verwijderd, geeft deze de naam en coördinaten van het object door aan de methode UpdateCloudCloudCloud(), waarmee de Azure Function App-service wordt aanroept, waarmee de Azure-tabel wordt bijgewerkt en de melding wordt activeerd.

        /// <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. Voeg nu de methode UpdateCloudCloudCloud() toe, zoals hieronder wordt weergegeven:

        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. Sla de code op en ga terug naar Unity

  9. Sleep het cloudplatformscript naar de hoofdcamera.

    1. Klik op de hoofdcamera in het deelvenster Hiërarchie, zodat de eigenschappen ervan worden weergegeven in inspector.

    2. Selecteer met de map Scripts geopend het cloudscript En sleep het script naar de hoofdcamera. Het resultaat moet er als hieronder zijn:

      cloudscript naar hoofdcamera slepen

Hoofdstuk 11: De desktopcomputer Project uwP

Alles wat nodig is voor de Unity-sectie van dit project is nu voltooid.

  1. Navigeer naar Build Instellingen (File > Build Instellingen).

  2. Klik in het venster Build Instellingen build op Build.

    build-project

  3. Er wordt een Venster Bestandenverkenner weergegeven, met de vraag om een locatie om te bouwen. Maak een nieuwe map (door te klikken op Nieuwe map in de linkerbovenhoek) en noem deze BUILDS.

    nieuwe map voor build

    1. Open de nieuwe map BUILDS en maak nog een map (gebruik Nieuwe map nog een keer) en noem deze NH _ Desktop _ App.

      mapnaam NH_Desktop_App

    2. Selecteer de NH _ _ Desktop-app. klik op Map selecteren. Het duurt een minuut om het project te bouwen.

  4. Na de build wordt Verkenner weergegeven met de locatie van het nieuwe project. U hoeft deze echter niet te openen, omdat u eerst het andere Unity-project moet maken, in de volgende hoofdstukken.

Hoofdstuk 12: Unity Mixed Reality instellen Project

Hier volgt een typische set-up voor het ontwikkelen met de mixed reality, en als zodanig is een goede sjabloon voor andere projecten.

  1. Open Unity en klik op New.

    nieuw Unity-project

  2. U moet nu een Unity-naam Project, voeg UnityMRNotifHub in. Zorg ervoor dat het projecttype is ingesteld op 3D. Stel de Locatie in op een locatie die geschikt is voor u (onthoud dat dichter bij de hoofddirecties beter is). Klik vervolgens op Project maken.

    naam UnityMRNotifHub

  3. Als Unity is geopend, is het de moeite waard om te controleren of de standaard scripteditor is ingesteld op Visual Studio. Ga naar Voorkeuren > bewerken en navigeer in het nieuwe venster naar Externe hulpprogramma's. Wijzig External Script Editor in Visual Studio 2017. Sluit het venster Voorkeuren.

    externe editor instellen op VS

  4. Ga vervolgens naar File Build Instellingen schakel het platform over naar Universal Windows Platform door op de knop > Switch Platform te klikken.

    platformen overschakelen naar UWP

  5. Ga naar File > Build Instellingen en zorg ervoor dat:

    1. Doelapparaat is ingesteld op Elk apparaat

      Voor de Microsoft HoloLens stelt u Doelapparaat in op HoloLens.

    2. Buildtype is ingesteld op D3D

    3. SDK is ingesteld op Meest recent geïnstalleerd

    4. Visual Studio versie is ingesteld op Meest recent geïnstalleerd

    5. Bouwen en uitvoeren is ingesteld op Lokale machine

    6. Hier is het de moeite waard om de scène op te slaan en toe te voegen aan de build.

      1. Selecteer hiervoor Open scènes toevoegen. Er wordt een venster opslaan weergegeven.

        open scènes toevoegen

      2. Maak hiervoor een nieuwe map en een toekomstige scène en selecteer vervolgens de knop Nieuwe map om een nieuwe map te maken met de naam Scènes.

        map nieuwe scènes

      3. Open de zojuist gemaakte map Scènes en typ NH _ MR _ Scene in het tekstveld Bestandsnaam: en druk op Opslaan.

        nieuwe scène - NH_MR_Scene

    7. De overige instellingen, in Build Instellingen, moeten voor nu als standaard worden gebruikt.

  6. Klik in hetzelfde venster op de Instellingen Player. Hiermee opent u het bijbehorende deelvenster in de ruimte waar de Inspector zich bevindt.

    instellingen voor de speler openen

  7. In dit deelvenster moeten enkele instellingen worden geverifieerd:

    1. Op het tabblad Instellingen:

      1. Scriptruntime-versie moet experimenteel zijn (.NET 4.6 Equivalent)

      2. Scriptback-end moet .NET zijn

      3. Het API-compatibiliteitsniveau moet .NET 4.6 zijn

        API-compatibiliteit

    2. Tik verderop in het deelvenster in XR Instellingen (onder Publish Instellingen) op Virtual Reality Supported en zorg ervoor dat de Windows Mixed Reality SDK is toegevoegd

      xr-instellingen bijwerken

    3. Op het tabblad Instellingen publiceren, onder Mogelijkheden, gaat u als volgende te werk:

      • InternetClient

        internetclient tikken

  8. Terug in Build Instellingen, wordt Unity C# Projects niet langer grijs: vink het selectievakje er naast aan.

  9. Als deze wijzigingen zijn aangebracht, sluit u het venster Instellingen build.

  10. Sla uw scène op en Project > BestandScène opslaan/bestand > opslaan Project.

    Belangrijk

    Als u het Unity Set up-onderdeel voor dit project (mixed reality App) wilt overslaan en direct in code wilt doorgaan, kunt u dit .unitypackagedownloaden, het in uw project importeren als een aangepast pakket envervolgens doorgaan vanaf hoofdstuk 14. U moet nog steeds de scriptonderdelen toevoegen.

Hoofdstuk 13: de DLL's importeren in de Mixed Reality Unity-Project

U gebruikt Azure Storage voor unity-bibliotheek (die gebruikmaakt van de .NET SDK voor Azure). Volg deze koppeling over het gebruik van Azure Storage met Unity. Er is momenteel een bekend probleem in Unity waardoor invoegvoegingen opnieuw moeten worden geconfigureerd na het importeren. Deze stappen (4-7 in deze sectie) zijn niet langer vereist nadat de fout is opgelost.

Als u de SDK in uw eigen project wilt importeren, moet u ervoor zorgen dat u de meest recente .unitypackage hebt gedownload. Ga als volgt verder:

  1. Voeg het .unitypackage dat u van het bovenstaande hebt gedownload, toe aan Unity met behulp van de menuoptie Assets > Import Package Custom > Package.

  2. In het vak Import Unity Package dat wordt weergegeven, kunt u alles selecteren onder Plugin > Storage.

    importpakket

  3. Klik op de knop Importeren om de items aan uw project toe te voegen.

  4. Ga naar de Storage onder Plugins in de Project weergave en selecteer alleen de volgende invoegvoegingen:

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

    invoegingen selecteren

  5. Als u deze specifieke invoegvoegingen hebt geselecteerd, kunt u Elk platform uitvinken, WSAPlayer uitvinken en vervolgens op Toepassen klikken.

    platformwijzigingen toepassen

    Notitie

    U markeert deze specifieke invoegingen om alleen te worden gebruikt in de Unity Editor. Dit komt doordat er verschillende versies van dezelfde invoegs in de WSA-map staan die worden gebruikt nadat het project uit Unity is geëxporteerd.

  6. Selecteer in Storage map van de invoeginvoeging alleen het volgende:

    • Microsoft.Data.Services.Client

      client voor gegevensservices selecteren

  7. Vink het vakje Niet verwerken onder Platform Instellingen klik op Toepassen.

    niet verwerken

    Notitie

    U markeert deze invoeging 'Niet verwerken' omdat de Patcher van de Unity-assembly problemen heeft met het verwerken van deze invoeging. De invoegvoeging werkt nog steeds, ook al wordt deze niet verwerkt.

Hoofdstuk 14: de klasse TableToPartner maken in het mixed reality Unity-project

De klasse TableTo Wilt is identiek aan de klasse die wordt uitgelegd in hoofdstuk 9. Maak dezelfde klasse in de mixed reality Unity-Project volgens dezelfde procedure die wordt uitgelegd in hoofdstuk 9.

Nadat u dit hoofdstuk hebt voltooid, is deze klasse ingesteld op de hoofdcamera van beide Unity-projecten.

Hoofdstuk 15: de klasse NotificationReceiver maken in de Mixed Reality Unity-Project

Het tweede script dat u moet maken, is NotificationReceiver, dat verantwoordelijk is voor:

  • De app bij de Notification Hub registreren bij de initialisatie.
  • Luisteren naar meldingen die afkomstig zijn van de Notification Hub.
  • Deserialiseren van de objectgegevens van ontvangen meldingen.
  • Verplaats de GameObjects in de scène, op basis van de gedeserialiseerde gegevens.

Het NotificationReceiver-script maken:

  1. Klik met de rechtermuisknop in de map Scripts en klik op Maken, C # Script. Noem het script NotificationReceiver.

    nieuwe c#-scriptnaam  maken met de naam NotificationReceiver

  2. Dubbelklik op het script om het te openen.

  3. Voeg de volgende naamruimten toe:

    //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. Voeg de volgende variabelen in:

        /// <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. Vervang de waarde hubName door de naam van uw Notification Hub-service en hubListenEndpoint door de eindpuntwaarde die u kunt vinden op het tabblad Toegangsbeleid, Azure Notification Hub Service, in azure Portal (zie onderstaande afbeelding).

    eindpunt voor beleid voor Notification Hubs invoegen

  6. Voeg nu de methoden Start() en Awake() toe om de klasse te initialiseren.

        /// <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. Voeg de WaitForNotification-methode toe zodat de app meldingen kan ontvangen van de Notification Hub-bibliotheek zonder te conflicteren met de hoofdthread:

        /// <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. Met de volgende methode, InitNotificationAsync(), wordt de toepassing bij de initialisatie geregistreerd bij de notification Hub-service. De code wordt als commentaar gebruikt, omdat Unity het project niet kan bouwen. U verwijdert de opmerkingen wanneer u het Azure Messaging NuGet-pakket importeert in Visual Studio.

        /// <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. Telkens wanneer een melding wordt ontvangen, wordt de volgende handler, Channel _ PushNotificationReceived(), geactiveerd. De melding wordt gedeserialiseert. Dit is de Azure Table-entiteit die is verplaatst naar de bureaubladtoepassing en verplaatst vervolgens het bijbehorende GameObject in de MR-scène naar dezelfde positie.

    Belangrijk

    De code heeft een opmerking omdat de code verwijst naar de Azure Messaging-bibliotheek, die u toevoegt nadat u het Unity-project hebt gebouwd met behulp van de Nuget-Pakketbeheer, binnen Visual Studio. Als zodanig kan het Unity-project niet worden gebouwd, tenzij er commentaar bij wordt gebruikt. Let op: als u uw project bouwt en vervolgens wilt terugkeren naar Unity, moet u die code opnieuw commentaar geven.

        ///// <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. Vergeet niet om uw wijzigingen op te slaan voordat u terug gaat naar de Unity Editor.

  11. Klik op de hoofdcamera in het deelvenster Hiërarchie, zodat de eigenschappen ervan worden weergegeven in inspector.

  12. Selecteer met de map Scripts geopend het script NotificationReceiver en sleep het script naar de hoofdcamera. Het resultaat moet er als hieronder zijn:

    ontvangerscript voor meldingen naar de camera slepen

    Notitie

    Als u dit ontwikkelt voor de Microsoft HoloLens, moet u het onderdeel Camera van de hoofdcamera bijwerken, zodat:

    • Clear Flags: Effen kleur
    • Achtergrond: Zwart

Hoofdstuk 16: De Mixed Reality Project uwP maken

Dit hoofdstuk is identiek aan het buildproces voor het vorige project. Alles wat nodig is voor de Unity-sectie van dit project is nu voltooid, dus is het tijd om deze te bouwen vanuit Unity.

  1. Navigeer naar Build Instellingen ( File > Build Instellingen ).

  2. Controleer in het Instellingen Build of Unity C# Projects* is aangevinkt (zodat u de scripts in dit project na de build kunt bewerken).

  3. Nadat dit is gebeurd, klikt u op Build.

    build-project

  4. Er wordt een Venster Bestandenverkenner weergegeven, met de vraag om een locatie om te bouwen. Maak een nieuwe map (door te klikken op Nieuwe map in de linkerbovenhoek) en noem deze BUILDS.

    map builds maken

    1. Open de nieuwe map BUILDS en maak nog een map (gebruik Nieuwe map nog een keer) en noem deze NH _ MR _ App.

      map NH_MR_Apps maken

    2. Selecteer de _ MR-app voor _ NH. klik op Map selecteren. Het duurt een minuut om het project te bouwen.

  5. Na de build wordt een verkennervenster geopend op de locatie van uw nieuwe project.

Hoofdstuk 17: NuGet-pakketten toevoegen aan de UnityMRNotifHub-oplossing

Waarschuwing

Wanneer u de volgende NuGet-pakketten toevoegt (en de code in het volgende hoofdstuk uitcommentereert), worden er fouten als de code opnieuw wordt geopend binnen de Unity Project. Als u terug wilt gaan en wilt doorgaan met bewerken in de Unity-editor, hebt u die foute code nodig en moet u later weer commentaar maken als u weer terug bent in Visual Studio.

Zodra de mixed reality-build is voltooid, gaat u naar het mixed reality-project dat u hebt gemaakt en dubbelklikt u op het oplossingsbestand (.sln) in die map om uw oplossing te openen met Visual Studio 2017. U moet nu het NuGet-pakket WindowsAzure.Messaging.managed toevoegen; dit is een bibliotheek die wordt gebruikt voor het ontvangen van meldingen van de Notification Hub.

Het NuGet-pakket importeren:

  1. Klik in Solution Explorer met de rechtermuisknop op uw oplossing

  2. Klik op NuGet-pakketten beheren.

    nuget manager openen

  3. Selecteer het tabblad Bladeren _ en zoek naar _WindowsAzure.Messaging.managed.

    windows azure messaging-pakket zoeken

  4. Selecteer het resultaat (zoals hieronder wordt weergegeven) en schakel in het venster aan de rechterkant het selectievakje naast Project. Hiermee wordt een vinkje in het selectievakje naast Project geplaatst, samen met het selectievakje naast het project Assembly-CSharp en UnityMRNotifHub.

    alle projecten tikken

  5. De versie die in eerste instantie is opgegeven, is mogelijk niet compatibel met dit project. Klik daarom op de vervolgkeuzelijst naast Versie en klik op Versie 0.1.7.9 en klik vervolgens op Installeren.

  6. U bent nu klaar met het installeren van het NuGet-pakket. Zoek de code met opmerkingen die u hebt ingevoerd in de klasse NotificationReceiver en verwijder de opmerkingen.

Hoofdstuk 18- UnityMRNotifHub-toepassing bewerken, klasse NotificationReceiver

Nadat u de NuGet-pakketten hebt toegevoegd, moet u een deel van de code in de NotificationReceiver-klasse uitcommentriëren.

Dit omvat:

  1. De naamruimte bovenaan:

    using Microsoft.WindowsAzure.Messaging;
    
  2. Alle code in de methode InitNotificationsAsync() :

        /// <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;
            }
        }
    

Waarschuwing

De bovenstaande code heeft een opmerking: zorg ervoor dat u deze opmerking niet per ongeluk hebt verwijderd (omdat de code niet wordt ge compileerd als u dat hebt).

  1. En ten laatste de Channel_PushNotificationReceived gebeurtenis:

        /// <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;
            }
        }
    

Zorg ervoor dat u deze zonder becommentereerde ops slaan en ga vervolgens verder met het volgende hoofdstuk.

Hoofdstuk 19: het mixed reality aan de Store-app koppelen

U moet nu het mixed reality aan de Store-app die u aan het begin van het lab hebt gemaakt.

  1. Open de oplossing.

  2. Klik met de rechtermuisknop op de Project uwP-app in Solution Explorer deelvenster, ga naar Store en koppel app aan de Store....

    open winkel-association

  3. Er wordt een nieuw venster weergegeven met de naam Uw app koppelen aan Windows Store. Klik op Volgende.

    naar het volgende scherm gaan

  4. Hiermee worden alle toepassingen geladen die zijn gekoppeld aan het account waarmee u zich hebt aangemeld. Als u niet bent aangemeld bij uw account, kunt u zich aanmelden op deze pagina.

  5. Zoek de naam van de Store-app die u aan het begin van deze zelfstudie hebt gemaakt en selecteer deze. Klik op Volgende.

    uw winkelnaam zoeken en selecteren

  6. Klik op Koppelen.

    de app koppelen

  7. Uw app is nu gekoppeld aan de Store-app. Dit is nodig voor het inschakelen van meldingen.

Hoofdstuk 20: UnityMRNotifHub- en UnityDesktopNotifHub-toepassingen implementeren

Dit hoofdstuk is mogelijk eenvoudiger voor twee personen, omdat het resultaat beide apps bevat die worden uitgevoerd, een die wordt uitgevoerd op uw computer Desktop en de andere op uw immersive headset.

De immersive headset-app wacht op wijzigingen in de scène (positiewijzigingen van de lokale GameObjects) en de desktop-app zal wijzigingen aanbrengen in de lokale scène (positiewijzigingen), die worden gedeeld met de MR-app. Het is zinvol om eerst de MR-app te implementeren, gevolgd door de desktop-app, zodat de ontvanger kan beginnen met luisteren.

De UnityMRNotifHub-app implementeren op uw lokale computer:

  1. Open het oplossingsbestand van uw UnityMRNotifHub-app in Visual Studio 2017.

  2. Selecteer x86 bij Oplossingsplatform, Lokale computer.

  3. Selecteer in Oplossingsconfiguratie de optie Fouten opsporen.

    projectconfiguratie instellen

  4. Ga naar het menu Bouwen en klik op Oplossing implementeren om de toepassing naar uw computer te sideloaden.

  5. Uw app wordt nu weergegeven in de lijst met geïnstalleerde apps, die gereed zijn om te worden gestart.

De UnityDesktopNotifHub-app implementeren op lokale computer:

  1. Open het oplossingsbestand van uw UnityDesktopNotifHub-app in Visual Studio 2017.

  2. Selecteer x86 bij Oplossingsplatform, Lokale computer.

  3. Selecteer in Oplossingsconfiguratie de optie Fouten opsporen.

    projectconfiguratie instellen

  4. Ga naar het menu Bouwen en klik op Oplossing implementeren om de toepassing naar uw computer te sideloaden.

  5. Uw app wordt nu weergegeven in de lijst met geïnstalleerde apps, die gereed zijn om te worden gestart.

  6. Start de mixed reality, gevolgd door de bureaubladtoepassing.

Wanneer beide toepassingen worden uitgevoerd, verplaatst u een object in de bureaubladscène (met behulp van de linkermuisknop). Deze positionele wijzigingen worden lokaal aangebracht, geseraliseerd en verzonden naar de functie-app-service. De functie-app-service werkt vervolgens de tabel samen met de Notification Hub bij. Nadat een update is ontvangen, verzendt de Notification Hub de bijgewerkte gegevens rechtstreeks naar alle geregistreerde toepassingen (in dit geval de immersive headset-app), die vervolgens deserialiseren van de binnenkomende gegevens, en de nieuwe positionele gegevens toepassen op de lokale objecten, waarbij ze in scène worden verplaatst.

Uw Azure Notification Hubs voltooid

Gefeliciteerd, u hebt een mixed reality app gemaakt die gebruik maakt van de Azure Notification Hubs Service en communicatie tussen apps toestaat.

eindproduct -end

Bonusoefeningen

Oefening 1

Kunt u de kleur van de GameObjects wijzigen en die melding verzenden naar andere apps die de scène bekijken?

Oefening 2

Kunt u de GameObjects naar uw MR-app verplaatsen en de bijgewerkte scène in uw desktop-app bekijken?