HoloLens (första generationen) och Azure 308: Meddelanden mellan enheter


Anteckning

Självstudierna Mixed Reality Academy har utformats med HoloLens (1:a gen) och Mixed Reality Immersive Headsets i åtanke. Därför anser vi att det är viktigt att lämna de här självstudierna på plats för utvecklare som fortfarande letar efter vägledning i utvecklingen för dessa enheter. De här självstudierna uppdateras inte med de senaste verktygen eller interaktionerna som används för HoloLens 2. De kommer att finnas kvar för att fortsätta arbeta med de enheter som stöds. Det kommer att finnas en ny serie självstudier som kommer att publiceras i framtiden som visar hur du utvecklar för HoloLens 2. Det här meddelandet kommer att uppdateras med en länk till dessa självstudier när de publiceras.


slutlig produkt – start

I den här kursen får du lära dig hur du lägger till Notification Hubs funktioner i ett program med mixad verklighet med hjälp av Azure Notification Hubs, Azure Tables och Azure Functions.

Azure Notification Hubs är en Microsoft-tjänst som gör att utvecklare kan skicka riktade och anpassade push-meddelanden till valfri plattform, allt drivs i molnet. Detta kan effektivt göra det möjligt för utvecklare att kommunicera med slutanvändare eller till och med kommunicera mellan olika program, beroende på scenariot. Mer information finns på azure-sidan Notification Hubs .

Azure Functions är en Microsoft-tjänst som gör att utvecklare kan köra små delar av kod, "funktioner" i Azure. Detta är ett sätt att delegera arbete till molnet i stället för ditt lokala program, vilket kan ha många fördelar. Azure Functions har stöd för flera utvecklingsspråk, # inklusive # C, F, Node.js, Java och PHP. Mer information finns på Azure Functions sidan.

Azure Tables är en Microsoft-molntjänst som gör det möjligt för utvecklare att lagra strukturerade icke-SQL data i molnet, vilket gör dem lättillgängliga var som helst. Tjänsten har en schemalös design som möjliggör utveckling av tabeller efter behov och är därför mycket flexibel. Mer information finns på sidan med Azure-tabeller

När du har slutfört den här kursen har du ett avancerad headset-program med mixad verklighet och ett Desktop PC-program som kan göra följande:

  1. Desktop PC-appen tillåter användaren att flytta ett objekt i 2D-utrymme (X och Y) med hjälp av musen.

  2. Förflyttningen av objekt i PC-appen skickas till molnet med hjälp av JSON, som ska vara i form av en sträng, som innehåller objekt-ID, typ och transformeringsinformation (X- och Y-koordinater).

  3. Appen för mixad verklighet, som har en identisk scen till skrivbordsappen, får meddelanden om objektförflyttning från Notification Hubs-tjänsten (som precis har uppdaterats av Desktop PC-appen).

  4. När du får ett meddelande som innehåller objekt-ID, typ och transformeringsinformation tillämpar mixed reality-appen den mottagna informationen på sin egen scen.

I ditt program är det upp till dig hur du ska integrera resultaten med din design. Den här kursen är utformad för att lära dig hur du integrerar en Azure-tjänst med ditt Unity-Project. Det är ditt jobb att använda den kunskap du får från den här kursen för att förbättra programmet för mixad verklighet. Den här kursen är en fristående självstudiekurs som inte direkt involverar några andra Mixed Reality Labs.

Stöd för enheter

Kurs HoloLens Integrerande headset
MR och Azure 308: Meddelanden mellan enheter ✔️ ✔️

Anteckning

Även om den här kursen främst fokuserar på Windows Mixed Reality avancerad (VR)-headset, kan du även använda det du lär dig i den här kursen för Microsoft HoloLens. När du följer med i kursen visas anteckningar om eventuella ändringar som du kan behöva använda för att stödja HoloLens. När du använder HoloLens kan du märka ett eko under röstinspelningen.

Förutsättningar

Anteckning

Den här självstudien är utformad för utvecklare som har grundläggande erfarenhet av Unity och C#. Tänk också på att kraven och skrivna instruktioner i det här dokumentet representerar det som har testats och verifierats i skrivande stund (maj 2018). Du kan använda den senaste programvaran, som anges i artikeln om att installera verktyg, även om det inte bör antas att informationen i den här kursen matchar det du hittar i nyare programvara än vad som anges nedan.

Vi rekommenderar följande maskin- och programvara för den här kursen:

Innan du börjar

  • För att undvika problem med att skapa det här projektet rekommenderar vi starkt att du skapar projektet som nämns i den här självstudien i en rotmapp eller nära rotmappen (långa mappsökvägar kan orsaka problem vid byggtiden).
  • Du måste vara ägare till din Microsoft Developer-portalen och programregistreringsportalen, annars har du inte behörighet att komma åt appen i kapitel 2.

Kapitel 1 – Skapa ett program på Microsoft Developer portalen

Om du vill använda Azure Notification Hubs Service måste du skapa ett program på Microsoft Developer-portalen, eftersom ditt program måste registreras så att det kan skicka och ta emot meddelanden.

  1. Logga in på Microsoft Developer portalen.

    Du måste logga in på ditt Microsoft-konto.

  2. Från instrumentpanelen klickar du på Skapa en ny app.

    skapa en app

  3. Ett popup-fönster visas där du måste reservera ett namn för den nya appen. Infoga ett lämpligt namn i textrutan. Om det valda namnet är tillgängligt visas en bock till höger om textrutan. När du har infogat ett tillgängligt namn klickar du på knappen Reservera produktnamn längst ned till vänster i popup-rutan.

    ångra ett namn

  4. Nu när appen har skapats är du redo att gå vidare till nästa kapitel.

Kapitel 2 – Hämta dina nya autentiseringsuppgifter för appar

Logga in på programregistreringsportalen, där den nya appen visas, och hämta de autentiseringsuppgifter som kommer att användas för att konfigurera Notification Hubs-tjänsten i Azure Portal.

  1. Gå till programregistreringsportalen.

    programregistreringsportal

    Varning

    Du måste använda ditt Microsoft-konto för att logga in.
    Det här måste vara det Microsoft-konto som du använde i föregående kapitel ,med Windows Store Developer-portalen.

  2. Du hittar din app under avsnittet Mina program. När du har hittat den klickar du på den så kommer du till en ny sida med appnamnet plus Registrering.

    din nyligen registrerade app

  3. Rulla ned på registreringssidan för att hitta avsnittet Programhemligheter och Paket-SID för din app. Kopiera båda för användning med att konfigurera Azure Notification Hubs Service i nästa kapitel.

    programhemligheter

Kapitel 3 – Konfigurera Azure Portal: skapa Notification Hubs service

När dina autentiseringsuppgifter för appar har hämtats måste du gå till Azure Portal, där du skapar en Azure Notification Hubs Service.

  1. Logga in på Azure Portal.

    Anteckning

    Om du inte redan har ett Azure-konto måste du skapa ett. Om du följer den här självstudien i ett klassrum eller i ett labb kan du be din lärare eller någon av proktorerna om hjälp med att konfigurera ditt nya konto.

  2. När du har loggat in klickar du på Nytt i det övre vänstra hörnet och söker efter Notification Hub och klickar på Retur.

    sök efter meddelandehubb

    Anteckning

    Ordet Nytt _ kan ha ersatts med _Skapa en resurs, i nyare portaler.

  3. Den nya sidan innehåller en beskrivning av Notification Hubs tjänsten. Längst ned till vänster i den här prompten väljer du knappen Skapa för att skapa en koppling till den här tjänsten.

    skapa notification hubs-instans

  4. När du har klickat på Skapa:

    1. Infoga önskat namn för den här tjänstinstansen.

    2. Ange ett namnområde som du kan associera med den här appen.

    3. Välj en plats.

    4. Välj en resursgrupp eller skapa en ny. En resursgrupp är ett sätt att övervaka, kontrollera åtkomst, etablera och hantera fakturering för en samling Azure-tillgångar. Vi rekommenderar att du behåller alla Azure-tjänster som är associerade med ett enda projekt (t.ex. dessa labb) under en gemensam resursgrupp).

      Om du vill läsa mer om Azure-resursgrupper följer du den här länken om hur du hanterar en resursgrupp.

    5. Välj en lämplig prenumeration.

    6. Du måste också bekräfta att du har förstått de allmänna villkor som gäller för den här tjänsten.

    7. Välj Skapa.

      fyll i tjänstinformation

  5. När du har klickat Skapa måste du vänta tills tjänsten har skapats. Det kan ta en minut.

  6. Ett meddelande visas i portalen när tjänstinstansen har skapats.

    avisering

  7. Klicka på knappen Gå till resurs i meddelandet för att utforska din nya tjänstinstans. Du kommer till din nya Notification Hub-tjänstinstans.

    gå till resurs

  8. På översiktssidan, halvvägs ned på sidan, klickar du på Windows (WNS). Panelen till höger ändras för att visa två textfält, som kräver ditt paket-SID och din säkerhetsnyckel , från den app som du konfigurerade tidigare.

    nyskapad hubbtjänst

  9. När du har kopierat informationen till rätt fält klickar du på Spara så får du ett meddelande när meddelandehubben har uppdaterats.

    kopiera ned säkerhetsinformation

Kapitel 4 – Konfigurera Azure Portal: skapa tabelltjänst

När du har Notification Hubs Service-instansen går du tillbaka till Azure Portal, där du skapar en Azure-tabelltjänst genom att skapa en Storage resurs.

  1. Om du inte redan har loggat in loggar du in på Azure Portal.

  2. När du är inloggad klickar du på Nytt i det övre vänstra hörnet och söker efter Storage och klickar på Retur.

    Anteckning

    Ordet Nytt _ kan ha ersatts med _Skapa en resurs i nyare portaler.

  3. Välj Storage konto – blob, fil, tabell, kö i listan.

    sök efter lagringskonto

  4. Den nya sidan innehåller en beskrivning av Storage kontotjänsten. Längst ned till vänster i den här prompten väljer du knappen Skapa för att skapa en instans av den här tjänsten.

    skapa lagringsinstans

  5. När du har klickat på Skapa visas en panel:

    1. Infoga önskat namn för den här tjänstinstansen (får bara innehålla gemener).

    2. För Distributionsmodell klickar du på Resource Manager.

    3. För Typ av konto använder du den nedrullningsbara menyn och Storage (generell användning v1).

    4. Välj en lämplig plats.

    5. I listrutan Replikering väljer du Read-access-geo-redundant storage (RA-GRS).

    6. För Prestanda klickar du på Standard.

    7. I avsnittet Säker överföring krävs väljer du Inaktiverad.

    8. I listrutan Prenumeration väljer du en lämplig prenumeration.

    9. Välj en resursgrupp eller skapa en ny. En resursgrupp är ett sätt att övervaka, kontrollera åtkomst, etablera och hantera fakturering för en samling Azure-tillgångar. Vi rekommenderar att du behåller alla Azure-tjänster som är associerade med ett enda projekt (t.ex. dessa labb) under en gemensam resursgrupp).

      Om du vill läsa mer om Azure-resursgrupper följer du den här länken om hur du hanterar en resursgrupp.

    10. Lämna Virtuella nätverk som Inaktiverade om det här är ett alternativ för dig.

    11. Klicka på Skapa.

      fyll i lagringsinformation

  6. När du har klickat Skapa måste du vänta tills tjänsten har skapats. Det kan ta en minut.

  7. Ett meddelande visas i portalen när tjänstinstansen har skapats. Klicka på meddelandena för att utforska den nya tjänstinstansen.

    nytt lagringsmeddelande

  8. Klicka på knappen Gå till resurs i meddelandet för att utforska din nya tjänstinstans. Du kommer till den nya översiktssidan Storage Service-instansen.

    gå till resurs

  9. Klicka på Tabeller till höger på översiktssidan.

  10. Panelen till höger ändras för att visa tabelltjänstens information, där du behöver lägga till en ny tabell. Gör detta genom att klicka + knappen Tabell i det övre vänstra hörnet.

    öppna tabeller

  11. En ny sida visas, där du måste ange ett tabellnamn. Det här är det namn som du kommer att använda för att referera till data i ditt program i senare kapitel. Infoga ett lämpligt namn och klicka på OK.

    skapa ny tabell

  12. När den nya tabellen har skapats kan du se den på sidan Tabelltjänst (längst ned).

    ny tabell har skapats

Kapitel 5 – Slutföra Azure-tabellen i Visual Studio

Nu när ditt Table Service Storage-konto har ställts in är det dags att lägga till data till det, som används för att lagra och hämta information. Du kan redigera dina tabeller genom att Visual Studio .

  1. Öppna Visual Studio.

  2. Klicka på Visa > Cloud Explorer på menyn.

    öppna cloud explorer

  3. Cloud Explorer öppnas som ett dockat objekt (ha tålamod eftersom inläsningen kan ta tid).

    Anteckning

    Om den prenumeration som du använde för att skapa Storage-konton inte är synlig ser du till att du har:

    • Inloggad på samma konto som du använde för Azure Portal.

    • Valt din prenumeration från kontohanteringssidan (du kan behöva använda ett filter från dina kontoinställningar):

      hitta prenumeration

  4. Dina Azure-molntjänster visas. Leta Storage konton och klicka på pilen till vänster om det för att expandera dina konton.

    öppna lagringskonton

  5. När den har expanderats bör ditt Storage konto vara tillgängligt. Klicka på pilen till vänster om lagringen. När den har expanderats hittar du Tabeller och klickar på pilen bredvid den för att visa den tabell som du skapade i det sista kapitlet. Dubbelklicka på tabellen.

    tabell med öppna scenobjekt

  6. Tabellen öppnas i mitten av ditt Visual Studio fönster. Klicka på tabellikonen + med (plustecknet) på den.

    lägg till ny tabell

  7. Ett fönster visas där du uppmanas att lägga till entitet. Du skapar tre entiteter totalt, var och en med flera egenskaper. Du kommer att märka att PartitionKey och RowKey redan har angetts, eftersom de används av tabellen för att hitta dina data.

    partition och radnyckel

  8. Uppdatera värdet för PartitionKey och RowKey enligt följande (kom ihåg att göra detta för varje radegenskap som du lägger till, men öka RowKey varje gång):

    lägga till rätt värden

  9. Klicka på Lägg till egenskap för att lägga till extra rader med data. Se till att din första tomma tabell matchar tabellen nedan.

  10. Klicka på OK när du är klar.

    klicka på OK när du är klar

    Varning

    Kontrollera att du har ändrat Posterna X, Y och Z till Double.

  11. Du kommer att märka att tabellen nu har en rad med data. Klicka på + ikonen (plus) igen för att lägga till en annan entitet.

    första raden

  12. Skapa ytterligare en egenskap och ange sedan värdena för den nya entiteten så att de matchar de som visas nedan.

    lägg till kub

  13. Upprepa det sista steget för att lägga till en till entitet. Ange värdena för den här entiteten till de som visas nedan.

    lägg till cylinder

  14. Tabellen bör nu se ut som den nedan.

    tabellen är klar

  15. Du har slutfört det här kapitlet. Se till att spara.

Kapitel 6 – Skapa en Azure-funktionsapp

Skapa en Azure-funktionsapp som kommer att anropas av skrivbordsappen för att uppdatera table-tjänsten och skicka ett meddelande via Notification Hub.

Först måste du skapa en fil som gör att Din Azure-funktion kan läsa in de bibliotek som du behöver.

  1. Öppna Anteckningar (tryck på Windows och skriv Anteckningar).

    öppna Anteckningar

  2. När Anteckningar öppen infogar du JSON-strukturen nedan i den. När du har gjort det sparar du det på skrivbordet som project.jspå. Det är viktigt att namngivningen är korrekt: se till att den inte har .txt filnamnstillägget. Den här filen definierar de bibliotek som din funktion kommer att använda. Om du har använt NuGet ser det bekant ut.

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "7.0.0",
            "Microsoft.Azure.NotificationHubs" : "1.0.9",
            "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0"
        }
        }
    }
    }
    
  3. Logga in på Azure Portal.

  4. När du har loggat in klickar du på Nytt i det övre vänstra hörnet och söker efter Funktionsapp. Tryck på Retur.

    sök efter funktionsapp

    Anteckning

    Ordet Ny kan ha ersatts med Skapa en resurs i nyare portaler.

  5. Den nya sidan innehåller en beskrivning av funktionsapptjänsten. Längst ned till vänster i den här prompten väljer du knappen Skapa för att skapa en koppling till den här tjänsten.

    instans av funktionsapp

  6. När du har klickat på Skapa fyller du i följande:

    1. För Appnamn infogar du önskat namn för den här tjänstinstansen.

    2. Välj en Prenumeration.

    3. Välj den prisnivå som passar dig. Om det är första gången du skapar en App Service ska en kostnadsfri nivå vara tillgänglig för dig.

    4. Välj en resursgrupp eller skapa en ny. En resursgrupp är ett sätt att övervaka, kontrollera åtkomst, etablera och hantera fakturering för en samling Azure-tillgångar. Vi rekommenderar att du behåller alla Azure-tjänster som är associerade med ett enda projekt (t.ex. dessa labb) under en gemensam resursgrupp).

      Om du vill läsa mer om Azure-resursgrupper följer du den här länken om hur du hanterar en resursgrupp.

    5. För OPERATIVSYSTEM klickar du Windows, eftersom det är den avsedda plattformen.

    6. Välj en värdplan (den här självstudien använder en förbrukningsplan.

    7. Välj en plats (välj samma plats som den lagring som du skapade i föregående steg)

    8. I Storage måste du välja den tjänst Storage du skapade i föregående steg.

    9. Du behöver inte Application Insights i den här appen, så lämna den gärna av.

    10. Klicka på Skapa.

      skapa ny instans

  7. När du har klickat Skapa måste du vänta tills tjänsten har skapats. Det kan ta en minut.

  8. Ett meddelande visas i portalen när tjänstinstansen har skapats.

    nytt meddelande

  9. Klicka på meddelandena för att utforska din nya tjänstinstans.

  10. Klicka på knappen Gå till resurs i meddelandet för att utforska din nya tjänstinstans.

    gå till resurs

  11. Klicka på + ikonen (plus) bredvid Funktioner för att skapa ny.

    lägg till ny funktion

  12. I den centrala panelen visas fönstret Funktionsskapande. Ignorera informationen i den övre halvan av panelen och klicka på Anpassad funktion , som finns längst ned (i det blå området enligt nedan).

    anpassad funktion

  13. Den nya sidan i fönstret visar olika funktionstyper. Rulla ned för att visa de lila typerna och klicka på HTTP PUT-element.

    http put link

    Viktigt

    Du kan behöva rulla längre ned på sidan (och den här bilden kanske inte ser exakt likadan ut om Azure Portal-uppdateringar har skett), men du letar efter ett element som heter HTTP PUT.

  14. Http PUT-fönstret visas, där du behöver konfigurera funktionen (se nedan för bild).

    1. För Språk använder du den nedrullningsbara menyn och väljer C # .

    2. För Namn, ange ett lämpligt namn.

    3. I listrutan Autentiseringsnivå väljer du Funktion.

    4. I avsnittet Tabellnamn måste du använda det exakta namnet som du använde för att skapa tabelltjänsten tidigare (inklusive samma bokstavsbokstav).

    5. I avsnittet Storage-kontoanslutning använder du den nedrullningsbara menyn och väljer ditt lagringskonto därifrån. Om den inte finns där klickar du på hyperlänken Ny tillsammans med avsnittsrubriken för att visa en annan panel, där ditt lagringskonto ska visas.

      ny lagring

  15. Klicka Skapa så får du ett meddelande om att inställningarna har uppdaterats.

    skapa funktion

  16. När du klickar på Skapa omdirigeras du till funktionsredigeraren.

    uppdatera funktionskod

  17. Infoga följande kod i funktionsredigeraren (ersätt koden i funktionen):

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

    Anteckning

    Med hjälp av de inkluderade biblioteken tar funktionen emot namnet och platsen för objektet som flyttades i Unity-scenen (som ett C#-objekt som kallas UnityGameObject). Det här objektet används sedan för att uppdatera objektparametrarna i den skapade tabellen. Därefter gör funktionen ett anrop till din skapade Notification Hub-tjänst, som meddelar alla prenumererande program.

  18. Klicka på Spara med koden på plats.

  19. Klicka sedan på < ikonen (pilen) till höger på sidan.

    öppna uppladdningspanelen

  20. En panel kommer att skjutas in från höger. I panelen klickar du på Upload så visas en filwebbläsare.

  21. Gå till och klicka på project.jspå filen som du skapade Anteckningar tidigare och klicka sedan på knappen Öppna. Den här filen definierar de bibliotek som funktionen ska använda.

    ladda upp json

  22. När filen har laddats upp visas den i panelen till höger. Om du klickar på den öppnas den i funktionsredigeraren. Det måste se exakt likadant ut som nästa bild (under steg 23).

  23. Klicka sedan på länken Integrera under Functions i panelen till vänster.

    integrera funktion

  24. Klicka på Avancerad redigerare (enligt nedan) i det övre högra hörnet på nästa sida.

    öppna avancerad redigerare

  25. En function.jsfil öppnas i mittenpanelen, som måste ersättas med följande kodfragment. Detta definierar den funktion som du skapar och de parametrar som skickas till funktionen.

    {
    "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. Redigeringsredigeraren bör nu se ut som på bilden nedan:

    tillbaka till standardredigeraren

  27. Du kanske märker att de indataparametrar som du just har infogat kanske inte matchar din tabell- och lagringsinformation och därför måste uppdateras med din information. Gör inte detta här eftersom vi går vidare. Klicka bara på länken Standardredigerare i det övre högra hörnet på sidan för att gå tillbaka.

  28. I standardredigeraren klickar du på Azure Table Storage (table), under Inputs (Indata).

    Tabellindata

  29. Se till att följande stämmer överens med din information, eftersom de kan vara olika (det finns en bild under följande steg):

    1. Tabellnamn: namnet på den tabell som du skapade i Azure Storage, Table Service.

    2. Storage kontoanslutning: Klicka på ny , som visas tillsammans med den nedrullningsbara menyn så visas en panel till höger om fönstret.

      ny lagring

      1. Välj det Storage konto som du skapade tidigare som värd för funktionsapparna.

      2. Du ser att anslutningsvärdet Storage konto har skapats.

      3. Se till att trycka på Spara när du är klar.

    3. Sidan Indata bör nu matcha nedanstående och visa din information.

      indata har slutförts

  30. Klicka sedan på Azure Notification Hub (meddelande) – under Utdata. Se till att följande matchas mot din information, eftersom de kan vara olika (det finns en bild under följande steg):

    1. Namn på meddelandehubb: Det här är namnet på din Notification Hub-tjänstinstans, som du skapade tidigare.

    2. Notification Hubs namnområdesanslutning: Klicka på Ny, som visas tillsammans med den nedrullningsbara menyn.

      kontrollera utdata

    3. Popup-meddelandet Anslutning visas (se bilden nedan), där du måste välja namnområdet för den meddelandehubb som du konfigurerade tidigare.

    4. Välj namnet på din meddelandehubb i den mellersta listrutan.

    5. Ange listrutan Princip till DefaultFullSharedAccessSignature.

    6. Klicka på knappen Välj för att gå tillbaka.

      utdatauppdatering

  31. Sidan Utdata bör nu matcha nedan, men med din information i stället. Se till att trycka på Spara.

Varning

Redigera inte Notification Hub-namnet direkt (allt detta bör göras med hjälp av Avancerad redigerare, förutsatt att du har följt föregående steg korrekt.

utdata har slutförts

  1. Nu bör du testa funktionen för att se till att den fungerar. Gör så här:

    1. Gå till funktionssidan en gång till:

      utdata har slutförts

    2. När du är tillbaka på funktionssidan klickar du på fliken Test längst till höger på sidan för att öppna bladet Test:

      utdata har slutförts

    3. I textrutan Begärandetext på bladet klistrar du in nedanstående kod:

      {  
          "Type":null,
          "X":3,
          "Y":0,
          "Z":1,
          "PartitionKey":null,
          "RowKey":"Obj2",
          "Timestamp":"0001-01-01T00:00:00+00:00",
          "ETag":null
      }
      
    4. När testkoden är på plats klickar du på knappen Kör längst ned till höger så körs testet. Utdataloggarna för testet visas i konsolområdet under funktionskoden.

      utdata har slutförts

    Varning

    Om testet ovan misslyckas måste du dubbelkolla att du har följt stegen ovan exakt, särskilt inställningarna i integreringspanelen.

Kapitel 7 – Konfigurera Desktop Unity Project

Viktigt

Det skrivbordsprogram som du nu skapar fungerar inte i Unity-redigeraren. Den måste köras utanför redigeraren och följa programmets bygge med hjälp Visual Studio (eller det distribuerade programmet).

Följande är en typisk uppsättning för utveckling med Unity och mixad verklighet, och är därför en bra mall för andra projekt.

Konfigurera och testa ditt integrerande headset för mixad verklighet.

Anteckning

Du behöver inte rörelsekontroller för den här kursen. Om du behöver stöd för att konfigurera det integrerande headsetet följer du den här länken om hur du ställer in Windows Mixed Reality.

  1. Öppna Unity och klicka på Ny.

    nytt Unity-projekt

  2. Du måste ange ett Unity-Project namn, infoga UnityDesktopNotifHub. Kontrollera att projekttypen är inställd på 3D. Ange Plats till en lämplig plats för dig (kom ihåg att närmare rotkataloger är bättre). Klicka sedan på Skapa projekt.

    skapa projekt

  3. När Unity är öppet är det värt att kontrollera att standardskriptredigeraren är inställd på Visual Studio. Gå till Redigera inställningar och gå sedan till Externa verktyg > från det nya fönstret. Ändra extern skriptredigerare till Visual Studio 2017. Stäng fönstret Inställningar.

    ange externa VS-verktyg

  4. Gå sedan till File Build Inställningar (Filbygge) > och välj Universal Windows Platform (Universal Windows Platform) och klicka sedan på knappen Switch Platform (Växla plattform) för att tillämpa ditt val.

    switch-plattformar

  5. När du fortfarande är > i Inställningar ser du till att:

    1. Målenheten är inställd på Valfri enhet

      Det här programmet kommer att vara för skrivbordet, så det måste vara Vilken enhet som helst

    2. Byggtyp har angetts till D3D

    3. SDK är inställt på Senaste installerade

    4. Visual Studio Version har angetts till Senaste installerade

    5. Skapa och kör är inställt på Lokal dator

    6. Även här är det värt att spara scenen och lägga till den i bygget.

      1. Gör detta genom att välja Lägg till öppna scener. Ett save-fönster visas.

        lägga till öppna scener

      2. Skapa en ny mapp för den här och framtida scenen och välj sedan knappen Ny mapp för att skapa en ny mapp, ge den namnet Scenes.

        mapp för nya scener

      3. Öppna den nyligen skapade mappen Scenes och skriv SEDAN NH Desktop Scene i fältet Filnamn: text _ _ och tryck sedan på Spara.

        ny NH_Desktop_Scene

    7. De återstående inställningarna, i Build Inställningar, bör vara kvar som standard för tillfället.

  6. I samma fönster klickar du på player Inställningar för att öppna den relaterade panelen i utrymmet där Inspector finns.

  7. I den här panelen måste några inställningar verifieras:

    1. På fliken Inställningar inställningar:

      1. Skriptkörningsversion ska vara experimentell (.NET 4.6-motsvarighet)

      2. Skript för backend ska vara .NET

      3. API-kompatibilitetsnivån ska vara .NET 4.6

        4.6 net-version

    2. På fliken Inställningar, under Funktioner, markerar du:

      • InternetClient

        tick internet client

  8. Tillbaka i Build Inställningar är Unity C # Projects inte längre nedtonat. Markera kryssrutan bredvid detta.

  9. Stäng fönstret Build Settings (Bygginställningar).

  10. Spara din scen och Project spara > scen/fil > Spara Project.

    Viktigt

    Om du vill hoppa över Unity-konfigurera-komponenten för det här projektet (Skrivbordsapp) och fortsätta direkt i koden kan du ladda ned detta .unitypackage,importera det till projektet som ett anpassat paket ochsedan fortsätta från kapitel 9. Du måste fortfarande lägga till skriptkomponenterna.

Kapitel 8 – Importera DLL:er i Unity

Du kommer att använda Azure Storage för Unity (som i sig använder .Net SDK för Azure). Mer information finns på den här länken om Azure Storage för Unity.

Det finns för närvarande ett känt problem i Unity som kräver att plugin-program konfigureras om efter importen. De här stegen (4–7 i det här avsnittet) krävs inte längre när buggen har lösts.

Om du vill importera SDK:n till ditt eget projekt kontrollerar du att du har laddat ned den senaste .unitypackage-versionen från GitHub. Gör sedan följande:

  1. Lägg till .unitypackage i Unity med hjälp av menyalternativet Assets Import Package Custom Package (Anpassat paket > > för tillgångar).

  2. I rutan Importera Unity-paket som visas kan du välja allt under *Plugin > Storage. Avmarkera allt annat eftersom det inte behövs för den här kursen.

    importera till paket

  3. Klicka på knappen Importera för att lägga till objekten i projektet.

  4. Gå till mappen Storage under Plugin-program i Project och välj endast följande plugin-program:

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

avmarkera Valfri plattform

  1. När dessa specifika plugin-program är markerade avmarkerar du Valfri plattform och avmarkerar WSAPlay och klickar sedan på Tillämpa.

    tillämpa plattforms-dll-filer

    Anteckning

    Vi markerar att dessa specifika plugin-program endast ska användas i Unity-redigeraren. Det beror på att det finns olika versioner av samma plugin-program i WSA-mappen som kommer att användas när projektet har exporterats från Unity.

  2. I mappen Storage plugin-program väljer du endast:

    • Microsoft.Data.Services.Client

      set don't process for dlls (ange bearbeta inte för dll-filer)

  3. Markera rutan Bearbeta inte under Platform Inställningar (Plattformsinställningar) och klicka på Apply (Använd).

    tillämpa ingen bearbetning

    Anteckning

    Vi markerar det här plugin-programmet "Bearbeta inte", eftersom Unity-sammansättningskorrigeringsprogrammet har svårt att bearbeta det här plugin-programmet. Plugin-programmet fungerar fortfarande även om det inte bearbetas.

Kapitel 9 – Skapa klassen TableToScene i Desktop Unity-projektet

Nu måste du skapa skripten som innehåller koden för att köra det här programmet.

Det första skriptet som du behöver skapa är TableToScene, som ansvarar för:

  • Läsa entiteter i Azure-tabellen.
  • Med tabelldata bestämmer du vilka objekt som ska skapas och i vilken position.

Det andra skriptet som du behöver skapa är CloudScene, som ansvarar för:

  • Registrera vänsterklickshändelsen så att användaren kan dra objekt runt scenen.
  • Serialisera objektdata från den här Unity-scenen och skicka dem till Azure-funktionsappen.

Så här skapar du den här klassen:

  1. Högerklicka i tillgångsmappen på panelen Project Skapa > mapp. Ge mappen namnet Skript.

    skapa skriptmapp

    skapa skript mapp 2

  2. Dubbelklicka på mappen som precis har skapats för att öppna den.

  3. Högerklicka i mappen Skript och klicka på Skapa > C#-skript. Ge skriptet namnet TableToScene.

    nytt namnbyte för c#-skriptet  TableToScene

  4. Dubbelklicka på skriptet för att öppna det i Visual Studio 2017.

  5. Lägg till följande namnområden:

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Table;
    using UnityEngine;
    
  6. Infoga följande variabler i klassen :

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

    Anteckning

    Ersätt accountName-värdet med Azure Storage servicenamn och accountKey-värde med nyckelvärdet som finns i Azure Storage Service i Azure-portalen (se bild nedan).

    hämta kontonyckel

  7. Lägg nu till metoderna Start() och Awake() för att initiera klassen.

        /// <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. I klassen TableToScene lägger du till metoden som hämtar värdena från Azure-tabellen och använder dem för att skapa lämpliga primitiver i scenen.

        /// <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. Utanför klassen TableToScene måste du definiera klassen som används av programmet för att serialisera och deserialisera tabellentiteter .

        /// <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. Se till att spara innan du går tillbaka till Unity-redigeraren.

  11. Klicka på huvudkameranpanelen Hierarki så att dess egenskaper visas i Kontroll.

  12. När mappen Skript är öppen väljer du skriptet TableToScene-fil och drar den till huvudkameran. Resultatet bör se ut så här:

    lägga till skript i huvudkameran

Kapitel 10 – Skapa CloudScene-klassen i Desktop Unity-Project

Det andra skriptet som du behöver skapa är CloudScene, som ansvarar för:

  • Registrera vänsterklickshändelsen så att användaren kan dra objekt runt scenen.

  • Serialisera objektdata från den här Unity-scenen och skicka dem till Azure-funktionsappen.

Så här skapar du det andra skriptet:

  1. Högerklicka i mappen Skript och klickaSkapa, # C-skript. Ge skriptet namnet CloudScene

    nytt c#-skriptbyte  för CloudScene

  2. Lägg till följande namnområden:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.Networking;
    
  3. Infoga följande variabler:

        /// <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. Ersätt värdet azureFunctionEndpoint med url:en för azure-funktionsappen som finns i Azure Function App Service i Azure Portal, enligt bilden nedan:

    hämta funktions-URL

  5. Lägg nu till metoderna Start() och Awake() för att initiera klassen.

        /// <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. I metoden Update() lägger du till följande kod som identifierar musinmatningen och drar, vilket i sin tur flyttar GameObjects i scenen. Om användaren har dragit och släppt ett objekt skickar den namnet och koordinaterna för objektet till metoden UpdateCloudScene(), som anropar Azure-funktionsapptjänsten, som uppdaterar Azure-tabellen och utlöser meddelandet.

        /// <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. Lägg nu till metoden UpdateCloudScene() enligt nedan:

        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. Spara koden och återgå till Unity

  9. Dra CloudScene-skriptet till huvudkameran.

    1. Klicka på huvudkameranpanelen Hierarki så att dess egenskaper visas i Kontroll.

    2. När mappen Skript är öppen väljer du CloudScene-skriptet och drar det till huvudkameran. Resultatet bör se ut så här:

      dra molnskriptet till huvudkameran

Kapitel 11 – Skapa skrivbordsversionen Project UWP

Allt som behövs för Unity-avsnittet i det här projektet har nu slutförts.

  1. Gå till Build Inställningar (File > Build Inställningar).

  2. I fönstret Skapa Inställningar klickar du på Skapa.

    skapa projekt

  3. Ett Utforskaren popup-fönster där du uppmanas att ange en plats att skapa. Skapa en ny mapp (genom att klicka på Ny mapp i det övre vänstra hörnet) och ge den namnet BUILDS.

    ny mapp för build

    1. Öppna den nya BUILDS-mappen och skapa en annan mapp (med ny mapp igen) och ge den namnet NH Desktop _ _ App.

      mappnamn NH_Desktop_App

    2. Med NH _ _ Desktop-appen vald. klicka på Välj mapp. Det tar någon minut att skapa projektet.

  4. Följande version Utforskaren visas som visar platsen för det nya projektet. Du behöver dock inte öppna det eftersom du måste skapa det andra Unity-projektet först, i nästa kapitel.

Kapitel 12 – Konfigurera Mixed Reality Unity Project

Följande är en typisk uppsättning för utveckling med mixad verklighet och är därför en bra mall för andra projekt.

  1. Öppna Unity och klicka på Ny.

    nytt Unity-projekt

  2. Nu måste du ange ett Unity-Project namn och infoga UnityMRNotifHub. Kontrollera att projekttypen är inställd på 3D. Ställ in Plats på en lämplig plats (kom ihåg att närmare rotkataloger är bättre). Klicka sedan på Skapa projekt.

    namnge UnityMRNotifHub

  3. När Unity är öppet är det värt att kontrollera att standardskriptredigeraren är inställd på Visual Studio. Gå till Redigera inställningar och gå sedan till Externa verktyg > från det nya fönstret. Ändra Extern skriptredigerare till Visual Studio 2017. Stäng fönstret Inställningar.

    ställ in extern redigerare på VS

  4. Gå sedan till File Build Inställningar (Filbygge) och växla plattformen till Universal Windows Platform genom att > klicka på knappen Switch Platform (Växla plattform).

    växla plattformar till UWP

  5. Gå till File > Build Inställningar (Filbygge) och kontrollera att:

    1. Målenheten är inställd på Valfri enhet

      För Microsoft HoloLens anger du Målenhet till HoloLens.

    2. Byggtyp har angetts till D3D

    3. SDK är inställt på Senaste installerade

    4. Visual Studio Version har angetts till Senaste installerade

    5. Skapa och kör är inställt på Lokal dator

    6. Även här är det värt att spara scenen och lägga till den i bygget.

      1. Gör detta genom att välja Lägg till öppna scener. Ett spara-fönster visas.

        lägga till öppna scener

      2. Skapa en ny mapp för den här, och eventuell framtida scen, och välj sedan knappen Ny mapp för att skapa en ny mapp, ge den namnet Scenes.

        mappen new scenes

      3. Öppna den nyligen skapade mappen Scenes och skriv SEDAN NH _ MR _ Scene i fältet Filnamn: text och tryck sedan på Spara.

        ny scen – NH_MR_Scene

    7. De återstående inställningarna, i Build Inställningar, bör vara kvar som standard för tillfället.

  6. I samma fönster klickar du på player Inställningar för att öppna den relaterade panelen i utrymmet där Inspector finns.

    öppna spelarinställningar

  7. I den här panelen måste några inställningar verifieras:

    1. På fliken Inställningar inställningar:

      1. Skriptkörningsversion ska vara experimentell (.NET 4.6-motsvarighet)

      2. Skript för backend ska vara .NET

      3. API-kompatibilitetsnivån ska vara .NET 4.6

        api-kompatibilitet

    2. Längre ned i panelen, i XR Inställningar (finns nedan Publicera Inställningar), markerar du Virtual Reality Supported (Virtuell verklighet stöds) och kontrollerar att Windows Mixed Reality SDK har lagts till

      uppdatera xr-inställningar

    3. På fliken Inställningar, under Funktioner, heck:

      • InternetClient

        tick internet client

  8. I Build Inställningar är Unity C#-projekt inte längre nedtonade: markera kryssrutan bredvid detta.

  9. När de här ändringarna är klara stänger du Inställningar build-fönstret.

  10. Spara din scen och Project spara > scen/fil > Spara Project.

    Viktigt

    Om du vill hoppa över Unity-konfigurera-komponenten för det här projektet (Mixed Reality App) och fortsätta direkt i koden kan du ladda ned denna .unitypackage,importera den till projektet som ett anpassat paket ochsedan fortsätta från kapitel 14. Du måste fortfarande lägga till skriptkomponenterna.

Kapitel 13 – Importera DLL:er i Mixed Reality Unity Project

Du kommer att använda Azure Storage för Unity-biblioteket (som använder .Net SDK för Azure). Följ den här länken om hur du använder Azure Storage med Unity. Det finns för närvarande ett känt problem i Unity som kräver att plugin-program konfigureras om efter importen. De här stegen (4–7 i det här avsnittet) krävs inte längre när buggen har lösts.

Om du vill importera SDK:n till ditt eget projekt kontrollerar du att du har laddat ned den senaste .unitypackage. Gör sedan följande:

  1. Lägg till den .unitypackage som du laddade ned från ovan till Unity med hjälp av menyalternativet Assets > Import Package Custom Package (Anpassat paket > för tillgångar).

  2. I rutan Importera Unity-paket som visas kan du välja allt under Plugin-Storage > .

    importera paket

  3. Klicka på knappen Importera för att lägga till objekten i projektet.

  4. Gå till mappen Storage under Plugin-program i Project och välj endast följande plugin-program:

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

    välj plugin-program

  5. När dessa specifika plugin-program är markerade avmarkerar du Valfri plattform och avmarkerar WSAPlay och klickar sedan på Tillämpa.

    tillämpa plattformsändringar

    Anteckning

    Du markerar dessa specifika plugin-program så att de endast används i Unity-redigeraren. Det beror på att det finns olika versioner av samma plugin-program i WSA-mappen som kommer att användas när projektet har exporterats från Unity.

  6. I mappen Storage plugin-program väljer du endast:

    • Microsoft.Data.Services.Client

      välj datatjänstklient

  7. Markera rutan Bearbeta inte under Plattformsinställningar Inställningar klicka på Tillämpa.

    bearbeta inte

    Anteckning

    Du markerar det här plugin-programmet "Bearbeta inte" eftersom Unity-sammansättningskorrigeringsprogrammet har svårt att bearbeta det här plugin-programmet. Plugin-programmet fungerar fortfarande även om det inte bearbetas.

Kapitel 14 – Skapa klassen TableToScene i Unity-projektet med mixad verklighet

Klassen TableToScene är identisk med den som förklaras i kapitel 9. Skapa samma klass i Unity-programmet för mixad verklighet Project samma procedur som beskrivs i kapitel 9.

När du har slutfört det här kapitlet kommer båda dina Unity-projekt att ha den här klassen konfigurerad på huvudkameran.

Kapitel 15 – Skapa klassen NotificationReceiver i Mixed Reality Unity Project

Det andra skriptet som du behöver skapa är NotificationReceiver, som ansvarar för:

  • Registrera appen med Notification Hub vid initieringen.
  • Lyssna på meddelanden som kommer från Notification Hub.
  • Deserialisera objektdata från mottagna meddelanden.
  • Flytta GameObjects i scenen baserat på deserialiserade data.

Så här skapar du NotificationReceiver-skriptet:

  1. Högerklicka i mappen Skript och klickaSkapa, # C-skript. Ge skriptet namnet NotificationReceiver.

    skapa ett nytt  c#-skriptnamn som heter NotificationReceiver

  2. Dubbelklicka på skriptet för att öppna det.

  3. Lägg till följande namnområden:

    //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. Infoga följande variabler:

        /// <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. Ersätt värdet hubName med ditt Notification Hub-tjänstnamn och hubListenEndpoint-värdet med slutpunktsvärdet som finns på fliken Åtkomstprinciper, Azure Notification Hub Service, i Azure Portal (se bilden nedan).

    infoga meddelandehubbens principslutpunkt

  6. Lägg nu till metoderna Start() och Awake() för att initiera klassen.

        /// <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. Lägg till metoden WaitForNotification så att appen kan ta emot meddelanden från Notification Hub-biblioteket utan att krocka med huvudtråden:

        /// <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. Följande metod, InitNotificationAsync(), registrerar programmet med notification Hub Service vid initieringen. Koden kommenteras bort eftersom Unity inte kommer att kunna skapa projektet. Du tar bort kommentarerna när du importerar Azure Messaging Nuget-paketet i 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. Följande hanterare, Channel _ PushNotificationReceived(), utlöses varje gång ett meddelande tas emot. Det deserialiserar meddelandet, som är den Azure Table-entitet som har flyttats i skrivbordsprogrammet, och flyttar sedan motsvarande GameObject i MR-scenen till samma position.

    Viktigt

    Koden kommenteras bort eftersom koden refererar till Azure Messaging-biblioteket, som du kommer att lägga till när du har byggt Unity-projektet med nuget-pakethanteraren, Visual Studio. Därför kommer Unity-projektet inte att kunna skapa, såvida det inte har kommenterats bort. Tänk på att om du skapar projektet och sedan vill återgå till Unity måste du kommentera koden på nytt.

        ///// <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. Kom ihåg att spara ändringarna innan du går tillbaka till Unity-redigeraren.

  11. Klicka på huvudkameranpanelen Hierarki så att dess egenskaper visas i Kontroll.

  12. När mappen Skript är öppen väljer du NotificationReceiver-skriptet och drar det till huvudkameran. Resultatet bör se ut så här:

    dra meddelandemottagareskriptet till kameran

    Anteckning

    Om du utvecklar detta för Microsoft HoloLens måste du uppdatera huvudkamerans kamerakomponent så att:

    • Rensa flaggor: solid färg
    • Bakgrund: Svart

Kapitel 16 – Skapa Mixed Reality Project till UWP

Det här kapitlet är identiskt med byggprocessen för föregående projekt. Allt som behövs för Unity-avsnittet i det här projektet har nu slutförts, så det är dags att bygga det från Unity.

  1. Gå till Build Inställningar ( File > Build Inställningar ).

  2. Från menyn Skapa Inställningar ser du till att Unity C#-projekt* är markeras (vilket gör att du kan redigera skripten i det här projektet efter bygget).

  3. När det är klart klickar du på Skapa.

    skapa projekt

  4. Ett Utforskaren öppnas och du uppmanas att ange en plats för Att skapa. Skapa en ny mapp (genom att klicka på Ny mapp i det övre vänstra hörnet) och ge den namnet BUILDS.

    skapa builds-mapp

    1. Öppna den nya BUILDS-mappen och skapa en annan mapp (med ny mapp en gång till) och ge den namnet NH MR _ _ App.

      skapa NH_MR_Apps mapp

    2. Med NH _ _ MR-appen vald. klicka på Välj mapp. Det tar någon minut att skapa projektet.

  5. Efter bygget öppnas Utforskaren fönster på platsen för det nya projektet.

Kapitel 17 – Lägga till NuGet-paket i UnityMRNotifHub-lösningen

Varning

Kom ihåg att när du lägger till följande NuGet-paket (och avkommenterar koden i nästa kapitel )visas fel i koden när den öppnas igen i Unity Project. Om du vill gå tillbaka och fortsätta att redigera i Unity-redigeraren behöver du kommentaren som är felande kod och sedan ta bort kommentaren igen senare när du är tillbaka i Visual Studio.

När mixed reality-bygget har slutförts går du till mixed reality-projektet som du skapade och dubbelklickar på lösningsfilen (.sln) i mappen för att öppna din lösning med Visual Studio 2017. Nu måste du lägga till NuGet-paketet WindowsAzure.Messaging.managed. det här är ett bibliotek som används för att ta emot meddelanden från Notification Hub.

Så här importerar du NuGet-paketet:

  1. I Solution Explorer högerklickar du på din lösning

  2. Klicka på Hantera NuGet-paket.

    öppna nuget-hanteraren

  3. Välj fliken Bläddra _ och sök efter _WindowsAzure.Messaging.managed.

    hitta windows azure messaging-paket

  4. Välj resultatet (se nedan) och i fönstret till höger markerar du kryssrutan bredvid Project. Då visas en bock i kryssrutan bredvid Project, tillsammans med kryssrutan bredvid projektet Assembly-CSharp och UnityMRNotifHub.

    markera alla projekt

  5. Den ursprungliga versionen kanske inte är kompatibel med det här projektet. Klicka därför på den nedrullningsbara menyn bredvid Version och klicka på Version 0.1.7.9 och klicka sedan på Installera.

  6. Nu har du installerat NuGet-paketet. Leta upp den kommenterade kod som du angav i klassen NotificationReceiver och ta bort kommentarerna..

Kapitel 18 – Redigera UnityMRNotifHub-program, NotificationReceiver-klass

När du har lagt till NuGet-paketen måste du avkommentera en del av koden i klassen NotificationReceiver.

Du måste bland annat:

  1. Namnområdet längst upp:

    using Microsoft.WindowsAzure.Messaging;
    
  2. All kod i metoden 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;
            }
        }
    

Varning

Koden ovan innehåller en kommentar: kontrollera att du inte har avkommenterat kommentaren av misstag (eftersom koden inte kompileras om du har det!).

  1. Och slutligen, Channel_PushNotificationReceived händelse:

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

När dessa är okommenterade ser du till att du sparar och fortsätter sedan till nästa kapitel.

Kapitel 19 – Associera mixed reality-projektet med Store-appen

Nu måste du associera mixed reality-projektet med store-appen som du skapade i början av labblabbet.

  1. Öppna lösningen.

  2. Högerklicka på UWP-Project på Solution Explorer, gå till Store och Associera app med Store....

    öppen butiksassociaty

  3. Ett nytt fönster visas med namnet Associera din app med Windows Store. Klicka på Nästa.

    gå till nästa skärm

  4. Den läser in alla program som är associerade med det konto som du har loggat in på. Om du inte är inloggad på ditt konto kan du logga in på den här sidan.

  5. Leta upp det Store-appnamn som du skapade i början av den här självstudien och välj det. Klicka på Nästa.

    hitta och välj ditt butiksnamn

  6. Klicka på Associera.

    associera appen

  7. Din app är nu associerad med Store-appen. Detta är nödvändigt för att aktivera meddelanden.

Kapitel 20 – Distribuera UnityMRNotifHub- och UnityDesktopNotifHub-program

Det här kapitlet kan vara enklare med två personer eftersom resultatet blir att båda apparna körs, en som körs på datorn Desktop och den andra i ditt integrerande headset.

Den integrerande headsetappen väntar på att få ändringar i scenen (positionsändringar av de lokala GameObjects) och skrivbordsappen kommer att göra ändringar i sin lokala scen (positionsändringar), som kommer att delas till MR-appen. Det är klokt att distribuera MR-appen först, följt av skrivbordsappen, så att mottagaren kan börja lyssna.

Så här distribuerar du UnityMRNotifHub-appen på din lokala dator:

  1. Öppna lösningsfilen för din UnityMRNotifHub-app i Visual Studio 2017.

  2. I Lösningsplattform väljer du x86, Lokal dator.

  3. I Lösningskonfiguration väljer du Felsök.

    ange projektkonfiguration

  4. Gå till menyn Build (Skapa) och klicka på Deploy Solution (Distribuera lösning) för att separat ladda in programmet till datorn.

  5. Din app bör nu visas i listan över installerade appar, redo att startas.

Så här distribuerar du UnityDesktopNotifHub-appen på den lokala datorn:

  1. Öppna lösningsfilen för din UnityDesktopNotifHub-app i Visual Studio 2017.

  2. I Lösningsplattform väljer du x86, Lokal dator.

  3. I Lösningskonfiguration väljer du Felsök.

    ange projektkonfiguration

  4. Gå till menyn Build (Skapa) och klicka på Deploy Solution (Distribuera lösning) för att separat ladda in programmet till datorn.

  5. Din app bör nu visas i listan över installerade appar, redo att startas.

  6. Starta programmet för mixad verklighet följt av Desktop-programmet.

När båda programmen körs flyttar du ett objekt i skrivbordsscenen (med vänster musknapp). Dessa positionsändringar görs lokalt, serialiseras och skickas till funktionsapptjänsten. Funktionsapptjänsten uppdaterar sedan tabellen tillsammans med meddelandehubben. Efter att ha fått en uppdatering skickar Notification Hub uppdaterade data direkt till alla registrerade program (i det här fallet den integrerande headsetappen), som sedan deserialiserar inkommande data och tillämpar de nya positionsdata på de lokala objekten och flyttar dem i scenen.

Ditt färdiga Azure Notification Hubs program

Grattis! Du har skapat en app med mixad verklighet som utnyttjar Azure Notification Hubs Service och tillåter kommunikation mellan appar.

slutlig produkt – slut

Bonusövningar

Övning 1

Kan du ta reda på hur du ändrar färgen på GameObjects och skickar meddelandet till andra appar som visar scenen?

Övning 2

Kan du lägga till förflyttning av GameObjects i din MR-app och se den uppdaterade scenen i din skrivbordsapp?