HoloLens (1. generacji) i Azure 308: powiadomienia między urządzeniami


Uwaga

Samouczki Mixed Reality Academy zostały zaprojektowane z myślą o HoloLens (1. generacji) i Mixed Reality immersywnych zestawów słuchawkowych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków w miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania dla tych urządzeń. Te samouczki nie zostaną zaktualizowane przy użyciu najnowszych zestawów narzędzi ani interakcji używanych do HoloLens 2. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. W przyszłości zostanie opublikowana nowa seria samouczków, które pokażą, jak opracowywać dla HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.


final product -start

W tym kursie dowiesz się, jak dodać możliwości usługi Notification Hubs do aplikacji rzeczywistości mieszanej przy użyciu usług Azure Notification Hubs, Azure Tables i Azure Functions.

Azure Notification Hubs to usługa firmy Microsoft, która umożliwia deweloperom wysyłanie docelowych i spersonalizowanych powiadomień wypychanych do dowolnej platformy, które są obsługiwane w chmurze. Dzięki temu deweloperzy mogą komunikować się z użytkownikami końcowymi, a nawet komunikować się między różnymi aplikacjami w zależności od scenariusza. Aby uzyskać więcej informacji, odwiedź stronęusługi Azure Notification Hubs.

Azure Functions to usługa firmy Microsoft, która umożliwia deweloperom uruchamianie małych fragmentów kodu, "functions" na platformie Azure. Zapewnia to możliwość delegowania pracy do chmury, a nie aplikacji lokalnej, co może mieć wiele korzyści. Azure Functions obsługuje kilka języków programowania, w tym C#, F#, Node.js, Java i PHP. Aby uzyskać więcej informacji, odwiedź stronę Azure Functions.

Azure Tables to usługa w chmurze firmy Microsoft, która umożliwia deweloperom przechowywanie ustrukturyzowanych danych bez SQL w chmurze, co ułatwia ich dostęp w dowolnym miejscu. Usługa oferuje bez schematu projekt, umożliwiając ewolucję tabel zgodnie z potrzebami, a tym samym jest bardzo elastyczna. Aby uzyskać więcej informacji, odwiedź stronęTabele platformy Azure

Po ukończeniu tego kursu będziesz mieć immersywną aplikację zestawu nagłownego rzeczywistości mieszanej oraz aplikację dla komputerów stacjonarnych, która będzie mogła wykonać następujące czynności:

  1. Aplikacja komputerów stacjonarnych umożliwia użytkownikowi przenoszenie obiektu w przestrzeni 2D (X i Y) przy użyciu myszy.

  2. Ruch obiektów w aplikacji komputera zostanie wysłany do chmury przy użyciu kodu JSON, który będzie w postaci ciągu zawierającego identyfikator obiektu, typ i informacje o transformacji (współrzędne X i Y).

  3. Aplikacja rzeczywistości mieszanej, która ma identyczną scenę z aplikacją klasyczną, będzie otrzymywać powiadomienia dotyczące przenoszenia obiektów z usługi Notification Hubs (która właśnie została zaktualizowana przez aplikację Komputer stacjonarny).

  4. Po otrzymaniu powiadomienia, które będzie zawierać identyfikator obiektu, typ i informacje dotyczące przekształcania, aplikacja rzeczywistości mieszanej zastosuje odebrane informacje do własnej sceny.

W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs został zaprojektowany, aby nauczyć Cię, jak zintegrować usługę platformy Azure z Project aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy zdobytą z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej. Ten kurs jest samodzielnym samouczkiem, który nie obejmuje bezpośrednio żadnych innych Mixed Reality Labs.

Obsługa urządzeń

Kurs HoloLens Immersyjne zestawy nagłowne
MR i Azure 308: powiadomienia między urządzeniami ✔️ ✔️

Uwaga

Chociaż ten kurs koncentruje się głównie na Windows Mixed Reality immersywnych zestawach słuchawkowych (VR), możesz również zastosować to, czego uczysz się w tym kursie, aby Microsoft HoloLens. Po zakończeniu kursu zobaczysz notatki dotyczące wszelkich zmian, które mogą być konieczne do obsługi HoloLens. Podczas korzystania z HoloLens można zauważyć pewne echo podczas przechwytywania głosu.

Wymagania wstępne

Uwaga

Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Możesz korzystać z najnowszego oprogramowania, jak wymieniono w artykule dotyczącym instalacji narzędzi , chociaż nie należy zakładać, że informacje w tym kursie doskonale pasują do tego, co znajdziesz w nowszym oprogramowaniu niż wymienione poniżej.

Na potrzeby tego kursu zalecamy następujący sprzęt i oprogramowanie:

Przed rozpoczęciem

  • Aby uniknąć problemów podczas tworzenia tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
  • Musisz być właścicielem portalu dla deweloperów firmy Microsoft i portalu rejestracji aplikacji. W przeciwnym razie nie będziesz mieć uprawnień dostępu do aplikacji w rozdziale 2.

Rozdział 1 — Tworzenie aplikacji w portalu deweloperów firmy Microsoft

Aby korzystać z usługi Azure Notification Hubs , należy utworzyć aplikację w portalu deweloperów firmy Microsoft, ponieważ aplikacja musi zostać zarejestrowana, aby mogła wysyłać i odbierać powiadomienia.

  1. Zaloguj się do portalu deweloperów firmy Microsoft.

    Musisz zalogować się do konta Microsoft.

  2. Na pulpicie nawigacyjnym kliknij pozycję Utwórz nową aplikację.

    create an app

  3. Zostanie wyświetlone okno podręczne, w którym należy zarezerwować nazwę nowej aplikacji. W polu tekstowym wstaw odpowiednią nazwę; Jeśli wybrana nazwa jest dostępna, po prawej stronie pola tekstowego pojawi się znacznik. Po wstawieniu dostępnej nazwy kliknij przycisk Rezerwuj nazwę produktu w lewym dolnym rogu okna podręcznego.

    reverse a name

  4. Po utworzeniu aplikacji możesz przejść do następnego rozdziału.

Rozdział 2 — Pobieranie nowych poświadczeń aplikacji

Zaloguj się do portalu rejestracji aplikacji, w którym zostanie wyświetlona nowa aplikacja, i pobierz poświadczenia, które będą używane do konfigurowania usługi Notification Hubs w witrynie Azure Portal.

  1. Przejdź do portalu rejestracji aplikacji.

    application registration portal

    Ostrzeżenie

    Aby zalogować się, musisz użyć konta Microsoft.
    Musi to być konto Microsoft używane w poprzednim rozdziale z portalem deweloperów Windows Store.

  2. Aplikację znajdziesz w sekcji Moje aplikacje . Po jego znalezieniu kliknij go i nastąpi przekierowanie do nowej strony z nazwą aplikacji i rejestracją.

    your newly registered app

  3. Przewiń stronę rejestracji w dół, aby znaleźć sekcję Wpisy tajne aplikacji i identyfikator SID pakietu dla aplikacji. Skopiuj obie do użycia z konfigurowaniem usługi Azure Notification Hubs w następnym rozdziale.

    application secrets

Rozdział 3 — Konfigurowanie witryny Azure Portal: tworzenie usługi Notification Hubs

Po pobraniu poświadczeń aplikacji należy przejść do witryny Azure Portal, w której utworzysz usługę Azure Notification Hubs.

  1. Zaloguj się do witryny Azure Portal.

    Uwaga

    Jeśli nie masz jeszcze konta platformy Azure, musisz je utworzyć. Jeśli korzystasz z tego samouczka w sytuacji na potrzeby zajęć lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc przy konfigurowaniu nowego konta.

  2. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Centrum powiadomień, a następnie kliknij przycisk Enter.

    search for notification hub

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.

  3. Nowa strona zawiera opis usługi Notification Hubs . W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.

    create notification hubs instance

  4. Po kliknięciu pozycji Utwórz:

    1. Wstaw żądaną nazwę dla tego wystąpienia usługi.

    2. Podaj przestrzeń nazw , którą będzie można skojarzyć z tą aplikacją.

    3. Wybierz lokalizację.

    4. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.

    5. Wybierz odpowiednią subskrypcję.

    6. Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.

    7. Wybierz przycisk Utwórz.

      fill in service details

  5. Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi. Może to potrwać minutę.

  6. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.

    notification

  7. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowego wystąpienia usługi Notification Hub .

    Screenshot that shows the 'Go to resource' button highlighted in the notification window.

  8. Na stronie przeglądu w połowie strony kliknij pozycję Windows (WNS). Panel po prawej stronie zmieni się, aby wyświetlić dwa pola tekstowe, które wymagają identyfikatora SID pakietu i klucza zabezpieczeń, z skonfigurowanej wcześniej aplikacji.

    newly created hubs service

  9. Po skopiowaniu szczegółów do poprawnych pól kliknij przycisk Zapisz i otrzymasz powiadomienie o pomyślnym zaktualizowaniu centrum powiadomień.

    copy down security details

Rozdział 4 . Konfigurowanie witryny Azure Portal: tworzenie usługi Table Service

Po utworzeniu wystąpienia usługi Notification Hubs przejdź z powrotem do witryny Azure Portal, w której utworzysz usługę Azure Tables Service, tworząc zasób Storage.

  1. Jeśli jeszcze nie zalogowaliśmy się, zaloguj się do witryny Azure Portal.

  2. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj Storage konto, a następnie kliknij przycisk Enter.

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.

  3. Wybierz pozycję konto Storage — obiekt blob, plik, tabela, kolejka z listy.

    search for storage account

  4. Nowa strona zawiera opis usługi konta Storage. W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć wystąpienie tej usługi.

    create storage instance

  5. Po kliknięciu pozycji Utwórz zostanie wyświetlony panel:

    1. Wstaw żądaną nazwę dla tego wystąpienia usługi (musi mieć wszystkie małe litery).

    2. W obszarze Model wdrażania kliknij pozycję Resource Manager.

    3. W polu Rodzaj konta, korzystając z menu rozwijanego, wybierz pozycję Storage (ogólnego przeznaczenia w wersji 1).

    4. Wybierz odpowiednią lokalizację.

    5. W menu rozwijanym Replikacja wybierz pozycję Read-access-geo-redundant storage (RA-GRS).

    6. W obszarze Wydajność kliknij pozycję Standardowa.

    7. W sekcji Wymagany bezpieczny transfer wybierz pozycję Wyłączone.

    8. Z menu rozwijanego Subskrypcja wybierz odpowiednią subskrypcję.

    9. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się przechowywanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.

    10. Pozostaw pozycję Sieci wirtualnejako Wyłączone , jeśli jest to opcja dla Ciebie.

    11. Kliknij pozycję Utwórz.

      fill in storage details

  6. Po kliknięciu pozycji Utwórz trzeba będzie poczekać, aż usługa zostanie utworzona, może to potrwać minutę.

  7. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie. Kliknij powiadomienia, aby zapoznać się z nowym wystąpieniem usługi.

    new storage notification

  8. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowej strony przeglądu wystąpienia usługi Storage Service.

    Screenshot that shows the 'Go to resource' button highlighted in the 'Deployment succeeded' window.

  9. Na stronie przeglądu po prawej stronie kliknij pozycję Tabele.

    Screenshot that shows where to select Tables.

  10. Panel po prawej stronie zmieni się, aby wyświetlić informacje o usłudze Table Service , gdzie należy dodać nową tabelę. Zrób to, klikając + przycisk Tabela w lewym górnym rogu.

    open Tables

  11. Zostanie wyświetlona nowa strona, w której należy wprowadzić nazwę tabeli. Jest to nazwa używana do odwoływania się do danych w aplikacji w kolejnych rozdziałach. Wstaw odpowiednią nazwę i kliknij przycisk OK.

    create new table

  12. Po utworzeniu nowej tabeli będzie można ją zobaczyć na stronie Usługi tabel (u dołu).

    new table created

Rozdział 5 . Kończenie tabeli platformy Azure w Visual Studio

Teraz, gdy konto usługi Table Service Storage zostało skonfigurowane, nadszedł czas, aby dodać do niego dane, które będą używane do przechowywania i pobierania informacji. Edytowanie tabel można wykonać za pomocą Visual Studio.

  1. Otwórz Visual Studio.

  2. W menu kliknij pozycję Wyświetl>Eksploratora chmury.

    open cloud explorer

  3. Eksplorator chmury otworzy się jako zadokowany element (być cierpliwym, ponieważ ładowanie może zająć trochę czasu).

    Uwaga

    Jeśli subskrypcja użyta do utworzenia konta Storage nie jest widoczna, upewnij się, że masz:

    • Zalogowano się do tego samego konta co użyte w witrynie Azure Portal.

    • Wybrano subskrypcję ze strony zarządzania kontami (może być konieczne zastosowanie filtru z ustawień konta):

      find subscription

  4. Zostaną wyświetlone usługi w chmurze platformy Azure. Znajdź Storage Konta i kliknij strzałkę po lewej stronie, aby rozwinąć swoje konta.

    open storage accounts

  5. Po rozwinięciu nowo utworzone konto Storage powinno być dostępne. Kliknij strzałkę po lewej stronie magazynu, a następnie po rozwinięciu znajdź tabele i kliknij strzałkę obok tej pozycji, aby wyświetlić tabelę utworzoną w ostatnim rozdziale. Kliknij dwukrotnie tabelę.

    open scene objects table

  6. Tabela zostanie otwarta w środku okna Visual Studio. Kliknij ikonę tabeli z ikoną + (plus) na niej.

    add new table

  7. Zostanie wyświetlone okno z monitem o dodanie jednostki. Utworzysz w sumie trzy jednostki, z których każda ma kilka właściwości. Zauważysz, że są już podane wartości PartitionKey i RowKey , ponieważ są one używane przez tabelę do znajdowania danych.

    partition and row key

  8. Zaktualizuj wartość elementu PartitionKey i RowKey w następujący sposób (pamiętaj, aby to zrobić dla każdej dodawanej właściwości wiersza, choć za każdym razem zwiększa wartość RowKey):

    add correct Values

  9. Kliknij pozycję Dodaj właściwość , aby dodać dodatkowe wiersze danych. Utwórz pierwszą pustą tabelę zgodną z poniższą tabelą.

  10. Po zakończeniu kliknij przycisk OK .

    click ok when done

    Ostrzeżenie

    Upewnij się, że zmieniono typ pozycji X, Y i Z na Wartość Podwójna.

  11. Zobaczysz, że tabela ma teraz wiersz danych. Kliknij ponownie ikonę + (plus), aby dodać inną jednostkę.

    first row

  12. Utwórz dodatkową właściwość, a następnie ustaw wartości nowej jednostki tak, aby były zgodne z wartościami przedstawionymi poniżej.

    add cube

  13. Powtórz ostatni krok, aby dodać inną jednostkę. Ustaw wartości dla tej jednostki na pokazane poniżej.

    add cylinder

  14. Tabela powinna teraz wyglądać podobnie do poniższej.

    table complete

  15. Ukończono ten rozdział. Pamiętaj o zapisaniu.

Rozdział 6. Tworzenie aplikacji funkcji platformy Azure

Utwórz aplikację funkcji platformy Azure, która zostanie wywołana przez aplikację klasyczną, aby zaktualizować usługę Table i wysłać powiadomienie za pośrednictwem centrum powiadomień.

Najpierw należy utworzyć plik, który umożliwi funkcji platformy Azure ładowanie potrzebnych bibliotek.

  1. Otwórz Notatnik (naciśnij klawisz Windows i wpisz Notatnik).

    open notepad

  2. Po otwarciu Notatnik wstaw poniższą strukturę JSON. Po wykonaniu tej czynności zapisz go na pulpicie jako plik project.json. Ważne jest, aby nazwa była poprawna: upewnij się, że nie ma rozszerzenia pliku .txt . Ten plik definiuje biblioteki używane przez funkcję, jeśli użyto NuGet będzie ona wyglądać znajomo.

    {
    "frameworks": {
        "net46":{
        "dependencies": {
            "WindowsAzure.Storage": "7.0.0",
            "Microsoft.Azure.NotificationHubs" : "1.0.9",
            "Microsoft.Azure.WebJobs.Extensions.NotificationHubs" :"1.1.0"
        }
        }
    }
    }
    
  3. Zaloguj się do witryny Azure Portal.

  4. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Aplikacja funkcji, naciśnij klawisz Enter.

    search for function app

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.

  5. Nowa strona zawiera opis usługi App Service funkcji . W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.

    function app instance

  6. Po kliknięciu pozycji Utwórz wprowadź następujące informacje:

    1. W polu Nazwa aplikacji wstaw żądaną nazwę dla tego wystąpienia usługi.

    2. Wybierz subskrypcję.

    3. Wybierz odpowiednią dla Ciebie warstwę cenową, jeśli jest to pierwszy raz podczas tworzenia App Service funkcji, warstwa bezpłatna powinna być dostępna dla Ciebie.

    4. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się przechowywanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.

    5. W przypadku systemu operacyjnego kliknij pozycję Windows, ponieważ jest to przeznaczona platforma.

    6. Wybierz plan hostingu (w tym samouczku jest używany plan użycia.

    7. Wybierz lokalizację (wybierz tę samą lokalizację co magazyn, który został utworzony w poprzednim kroku)

    8. W sekcji Storagemusisz wybrać usługę Storage utworzoną w poprzednim kroku.

    9. Nie potrzebujesz Szczegółowe informacje aplikacji w tej aplikacji, więc możesz pozostawić ją pustą.

    10. Kliknij pozycję Utwórz.

      create new instance

  7. Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi, może to potrwać minutę.

  8. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.

    new notification

  9. Kliknij powiadomienia, aby zapoznać się z nowym wystąpieniem usługi.

  10. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi.

    Screenshot that shows 'Deployment succeeded' with the 'Go to resource' button highlighted.

  11. Kliknij ikonę + (plus) obok pozycji Funkcje, aby utworzyć nową.

    add new function

  12. W panelu centralnym zostanie wyświetlone okno Tworzenie funkcji . Zignoruj informacje w górnej części panelu i kliknij pozycję Funkcja niestandardowa, która znajduje się w dolnej części (w niebieskim obszarze, jak pokazano poniżej).

    custom function

  13. Nowa strona w oknie będzie zawierać różne typy funkcji. Przewiń w dół, aby wyświetlić typy fioletowe, a następnie kliknij pozycję HTTP PUT , element.

    http put link

    Ważne

    Może być konieczne przewinięcie w dół strony (a ten obraz może nie wyglądać dokładnie tak samo, jeśli aktualizacje witryny Azure Portal zostały wprowadzone), jednak szukasz elementu o nazwie HTTP PUT.

  14. Zostanie wyświetlone okno HTTP PUT , w którym należy skonfigurować funkcję (zobacz poniżej, aby uzyskać obraz).

    1. W obszarze Język , korzystając z menu rozwijanego, wybierz pozycję C#.

    2. W polu Nazwa wprowadź odpowiednią nazwę.

    3. W menu rozwijanym Poziom uwierzytelniania wybierz pozycję Funkcja.

    4. W sekcji Nazwa tabeli należy użyć dokładnej nazwy użytej do wcześniejszego utworzenia usługi Table Service (w tym tej samej litery).

    5. W sekcji Storage połączenie konta użyj menu rozwijanego i wybierz konto magazynu. Jeśli tam nie ma, kliknij hiperlink Nowy obok tytułu sekcji, aby wyświetlić inny panel, w którym powinno być wyświetlane konto magazynu.

      Screenshot that shows the Storage account connection section with the 'New' hyperlink selected.

  15. Kliknij przycisk Utwórz i otrzymasz powiadomienie o pomyślnym zaktualizowaniu ustawień.

    create function

  16. Po kliknięciu pozycji Utwórz nastąpi przekierowanie do edytora funkcji.

    update function code

  17. Wstaw następujący kod do edytora funkcji (zastępując kod w funkcji):

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

    Uwaga

    Korzystając z dołączonych bibliotek, funkcja odbiera nazwę i lokalizację obiektu, który został przeniesiony w scenie aparatu Unity (jako obiekt C# o nazwie UnityGameObject). Ten obiekt jest następnie używany do aktualizowania parametrów obiektu w utworzonej tabeli. Następnie funkcja wykonuje wywołanie utworzonej usługi Notification Hub, która powiadamia wszystkie subskrybowane aplikacje.

  18. Po zapisaniu kodu kliknij przycisk Zapisz.

  19. Następnie kliknij ikonę < (strzałka) po prawej stronie strony.

    open upload panel

  20. Panel będzie przesuwany z prawej strony. Na tym panelu kliknij pozycję Przekaż, a zostanie wyświetlona przeglądarka plików.

  21. Przejdź do i kliknij plik project.json utworzony wcześniej w Notatnik, a następnie kliknij przycisk Otwórz. Ten plik definiuje biblioteki, których będzie używać funkcja.

    upload json

  22. Po przekazaniu pliku pojawi się on w panelu po prawej stronie. Kliknięcie go spowoduje otwarcie go w edytorze funkcji . Musi wyglądać dokładnie tak samo jak następnego obrazu (poniżej kroku 23).

  23. Następnie w panelu po lewej stronie poniżej pozycji Funkcje kliknij link Integruj .

    integrate function

  24. Na następnej stronie w prawym górnym rogu kliknij pozycję Edytor zaawansowany (jak pokazano poniżej).

    open advanced editor

  25. Plik function.json zostanie otwarty w panelu środkowym, który musi zostać zastąpiony następującym fragmentem kodu. Definiuje funkcję, którą tworzysz, i parametry przekazywane do funkcji.

    {
    "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. Edytor powinien teraz wyglądać podobnie do poniższego obrazu:

    back to standard editor

  27. Możesz zauważyć, że właśnie wstawione parametry wejściowe mogą nie być zgodne ze szczegółami tabeli i magazynu, dlatego konieczne będzie zaktualizowanie informacji. Nie należy tego robić w tym miejscu, ponieważ jest on omówiony w następnej części. Kliknij link Edytor standardowy w prawym górnym rogu strony, aby wrócić.

  28. W edytorze w warstwie Standardowa kliknij pozycję Tabela platformy Azure Storage (tabela), w obszarze Dane wejściowe.

    Table inputs

  29. Upewnij się, że informacje są zgodne z następującymi informacjami, ponieważ mogą się one różnić (poniżej przedstawiono obraz poniżej następujących kroków):

    1. Nazwa tabeli: nazwa tabeli utworzonej w ramach usługi Azure Storage, Tables.

    2. Storage połączenie konta: kliknij przycisk nowy, który pojawi się obok menu rozwijanego, a panel pojawi się po prawej stronie okna.

      Screenshot that shows the Storage Account window with 'Create new' highlighted in the panel to the right of the window.

      1. Wybierz konto Storage utworzone wcześniej, aby hostować aplikacje funkcji.

      2. Zauważysz, że utworzono wartość połączenia konta Storage.

      3. Pamiętaj, aby po zakończeniu nacisnąć przycisk Zapisz .

    3. Strona Dane wejściowe powinna być teraz zgodna z poniższymi informacjami.

      inputs complete

  30. Następnie kliknij pozycję Azure Notification Hub (powiadomienie) — w obszarze Dane wyjściowe. Upewnij się, że informacje są zgodne z następującymi informacjami, ponieważ mogą się różnić (poniżej przedstawiono obraz poniżej następujących kroków):

    1. Nazwa centrum powiadomień: jest to nazwa utworzonego wcześniej wystąpienia usługi Notification Hub .

    2. Połączenie przestrzeni nazw usługi Notification Hubs: kliknij przycisk nowy, który pojawi się obok menu rozwijanego.

      check outputs

    3. Zostanie wyświetlone okno podręczne Połączenie (zobacz obraz poniżej), w którym musisz wybrać przestrzeń nazwcentrum powiadomień, która została skonfigurowana wcześniej.

    4. Wybierz nazwę centrum powiadomień z środkowego menu rozwijanego.

    5. Ustaw menu rozwijane Zasady na Wartość DefaultFullSharedAccessSignature.

    6. Kliknij przycisk Wybierz , aby wrócić.

      output update

  31. Strona Dane wyjściowe powinna teraz być zgodna z poniższymi informacjami, ale z informacjami . Pamiętaj, aby nacisnąć przycisk Zapisz.

Ostrzeżenie

Nie edytuj nazwy centrum powiadomień bezpośrednio (należy to zrobić przy użyciu Edytor zaawansowany, pod warunkiem, że wykonano poprzednie kroki prawidłowo.

Screenshot that shows the Outputs page with general information.

  1. W tym momencie należy przetestować funkcję, aby upewnić się, że działa. W tym celu:

    1. Przejdź do strony funkcji jeszcze raz:

      Screenshot that shows the functions page with the newly created function highlighted.

    2. Po powrocie na stronę funkcji kliknij kartę Test po prawej stronie, aby otworzyć blok Test :

      Screenshot of the functions page with 'Test' highlighted on the right side.

    3. W polu tekstowym Treść żądania bloku wklej poniższy kod:

      {  
          "Type":null,
          "X":3,
          "Y":0,
          "Z":1,
          "PartitionKey":null,
          "RowKey":"Obj2",
          "Timestamp":"0001-01-01T00:00:00+00:00",
          "ETag":null
      }
      
    4. Po uruchomieniu kodu testowego kliknij przycisk Uruchom w prawym dolnym rogu, a test zostanie uruchomiony. Dzienniki wyjściowe testu zostaną wyświetlone w obszarze konsoli poniżej kodu funkcji.

      Screenshot that shows the output logs of the test in the console area.

    Ostrzeżenie

    Jeśli powyższy test zakończy się niepowodzeniem, należy dokładnie sprawdzić, czy wykonano powyższe kroki, szczególnie ustawienia w panelu integracji.

Rozdział 7 . Konfigurowanie Project aparatu Unity dla komputerów stacjonarnych

Ważne

Aplikacja klasyczna, którą teraz tworzysz, nie będzie działać w Edytorze aparatu Unity. Należy go uruchomić poza edytorem, po utworzeniu aplikacji przy użyciu Visual Studio (lub wdrożonej aplikacji).

Poniżej przedstawiono typową konfigurację do opracowywania przy użyciu aparatu Unity i rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.

Skonfiguruj i przetestuj immersywny zestaw słuchawkowy rzeczywistości mieszanej.

Uwaga

Na potrzeby tego kursu nie będzie wymagane kontrolery ruchu. Jeśli potrzebujesz pomocy technicznej dotyczącej konfigurowania immersyjnego zestawu słuchawkowego, skorzystaj z tego linku, aby dowiedzieć się, jak skonfigurować Windows Mixed Reality.

  1. Otwórz aparat Unity i kliknij pozycję Nowy.

    Screenshot of the Unity Projects window with the 'New' project icon highlighted in the upper right.

  2. Musisz podać nazwę aparatu Unity Project, wstawić element UnityDesktopNotifHub. Upewnij się, że typ projektu ma ustawioną wartość 3D. Ustaw lokalizację na odpowiednią dla Ciebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.

    create project

  3. Po otwarciu aparatu Unity warto sprawdzić domyślny edytor skryptów ustawiony na Visual Studio. Przejdź do pozycji Edytuj>preferencje , a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje .

    set external VS tools

  4. Następnie przejdź doUstawienia kompilacjiplików> i wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij przycisk Przełącz platformę, aby zastosować wybór.

    switch platforms

  5. Nadal wUstawienia kompilacjiplików> upewnij się, że:

    1. Urządzenie docelowe jest ustawione na dowolne urządzenie

      Ta aplikacja będzie przeznaczona dla komputera, więc musi być dowolne urządzenie

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną

    4. Visual Studio Wersja jest ustawiona na zainstalowaną najnowszą

    5. Kompilowanie i uruchamianie jest ustawione na komputer lokalny

    6. W tym miejscu warto zapisać scenę i dodać ją do kompilacji.

      1. Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.

        Screenshot that shows the 'Add Open Scene' highlighted in the upper right.

      2. Utwórz nowy folder dla tego i dowolnego przyszłego sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.

        Screenshot that shows a new Scenes folder created with 'New folder' highlighted in the upper left.

      3. Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz NH_Desktop_Scene, a następnie naciśnij przycisk Zapisz.

        new NH_Desktop_Scene

    7. Pozostałe ustawienia w obszarze Kompilacja Ustawienia powinny być pozostawione jako domyślne na razie.

  6. W tym samym oknie kliknij przycisk Odtwarzacz Ustawienia, spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor.

  7. W tym panelu należy zweryfikować kilka ustawień:

    1. Na karcie Inne Ustawienia:

      1. Wersja środowiska uruchomieniowego skryptów powinna być eksperymentalna (odpowiednik platformy.NET 4.6)

      2. Zaplecze skryptów powinno mieć wartość .NET

      3. Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6

        4.6 net version

    2. Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:

      • InternetClient

        Screenshot that shows InternetClient selected under Capabilities.

  8. Po powrocie do sekcji Build UstawieniaUnity C# Projects (Kompilacja Ustawienia Unity Projekty języka C# nie są już wyszarzone; zaznacz pole wyboru obok tego pola wyboru.

  9. Zamknij okno Build Settings (Ustawienia kompilacji).

  10. Zapisz scenę i Project Scenazapisywaniaplików> /Zapisz plik> Project.

    Ważne

    Jeśli chcesz pominąć składnik Konfiguracji aparatu Unity dla tego projektu (aplikacja klasyczna) i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 9. Nadal trzeba będzie dodać składniki skryptu.

Rozdział 8 . Importowanie bibliotek DLL w środowisku Unity

Będziesz używać usługi Azure Storage dla środowiska Unity (która korzysta z zestawu SDK platformy .Net dla platformy Azure). Aby uzyskać więcej informacji, zobacz ten link dotyczący usługi Azure Storage for Unity.

Obecnie istnieje znany problem w środowisku Unity, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (4–7 w tej sekcji) nie będą już wymagane po rozwiązaniu usterki.

Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage z GitHub. Następnie wykonaj następujące czynności:

  1. Dodaj pakiet unitypackage do aparatu Unity przy użyciu opcji menu Importuj pakiet > niestandardowy pakietu Assets>.

  2. W wyświetlonym oknie Importuj pakiet aparatu Unity możesz wybrać wszystko w obszarze Wtyczka>Storage. Usuń zaznaczenie wszystkiego innego, ponieważ nie jest to potrzebne na potrzeby tego kursu.

    import to package

  3. Kliknij przycisk Importuj , aby dodać elementy do projektu.

  4. Przejdź do folderu Storage w obszarze Wtyczki w widoku Project i wybierz tylko następujące wtyczki:

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

uncheck Any platform

  1. Po wybraniu tych określonych wtyczekusuń zaznaczenie polaWyboru Dowolna platforma i usuń zaznaczeniepola wyboru WSAPlayer , a następnie kliknij przycisk Zastosuj.

    apply platform dlls

    Uwaga

    Oznaczamy te konkretne wtyczki, które mają być używane tylko w edytorze aparatu Unity. Dzieje się tak, ponieważ istnieją różne wersje tych samych wtyczek w folderze WSA, które będą używane po wyeksportowaniu projektu z aparatu Unity.

  2. W folderze Storage plugin wybierz tylko:

    • Microsoft.Data.Services.Client

      set dont process for dlls

  3. Zaznacz pole Nie przetwarzaj w obszarze Platforma Ustawienia i kliknij przycisk Zastosuj.

    apply no processing

    Uwaga

    Oznaczamy tę wtyczkę "Nie przetwarzaj", ponieważ patcher zestawu aparatu Unity ma trudności z przetwarzaniem tej wtyczki. Wtyczka nadal będzie działać, mimo że nie jest przetwarzana.

Rozdział 9 . Tworzenie klasy TableToScene w projekcie aparatu Unity pulpitu

Teraz musisz utworzyć skrypty zawierające kod, aby uruchomić tę aplikację.

Pierwszy skrypt, który należy utworzyć, to TableToScene, który jest odpowiedzialny za:

  • Odczytywanie jednostek w tabeli platformy Azure.
  • Za pomocą danych tabeli określ, które obiekty mają zostać zduplikowe i w jakiej pozycji.

Drugi skrypt, który należy utworzyć, to CloudScene, który jest odpowiedzialny za:

  • Zarejestrowanie zdarzenia kliknięcia po lewej stronie w celu umożliwienia użytkownikowi przeciągania obiektów wokół sceny.
  • Serializowanie danych obiektu z tej sceny aparatu Unity i wysyłanie ich do aplikacji funkcji platformy Azure.

Aby utworzyć tę klasę:

  1. Kliknij prawym przyciskiem myszy folder zawartości znajdujący się w panelu Project Utwórz>folder. Nadaj nazwę skryptom folderu.

    create scripts folder

    create scripts folder 2

  2. Kliknij dwukrotnie właśnie utworzony folder, aby go otworzyć.

  3. Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję Create C# Script ( Utwórz>skrypt języka C#). Nadaj skryptowi nazwę TableToScene.

    Screenshot that shows how to create the new 'TableToScene' script.TableToScene rename

  4. Kliknij dwukrotnie skrypt, aby otworzyć go w Visual Studio 2017.

  5. Dodaj następujące przestrzenie nazw:

    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Auth;
    using Microsoft.WindowsAzure.Storage.Table;
    using UnityEngine;
    
  6. W klasie wstaw następujące zmienne:

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

    Uwaga

    Zastąp wartość accountName nazwą usługi Azure Storage i wartością accountKey wartością klucza znajdującą się w usłudze Azure Storage Service w witrynie Azure Portal (zobacz obraz poniżej).

    fetch account key

  7. Teraz dodaj metody Start() i Awake(), aby zainicjować klasę.

        /// <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. W klasie TableToScene dodaj metodę, która pobierze wartości z tabeli platformy Azure i użyj ich do zduplikowania odpowiednich elementów pierwotnych w scenie.

        /// <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. Poza klasą TableToScene należy zdefiniować klasę używaną przez aplikację do serializacji i deserializacji jednostek tabeli.

        /// <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. Przed powrotem do edytora aparatu Unity upewnij się, że przed powrotem do edytora aparatu Unity został zapisany.

  11. Kliknij Aparat Main (Główny Aparat) w panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.

  12. Po otwarciu folderu Scripts wybierz plik TableToScene skryptu i przeciągnij go na Aparat Main. Wynik powinien być następujący:

    add script to main camera

Rozdział 10 — Tworzenie klasy CloudScene w Project aparatu Unity dla komputerów stacjonarnych

Drugi skrypt, który należy utworzyć, to CloudScene, który jest odpowiedzialny za:

  • Zarejestrowanie zdarzenia kliknięcia po lewej stronie w celu umożliwienia użytkownikowi przeciągania obiektów wokół sceny.

  • Serializowanie danych obiektu z tej sceny aparatu Unity i wysyłanie ich do aplikacji funkcji platformy Azure.

Aby utworzyć drugi skrypt:

  1. Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję Create (Utwórz), C# Script (Skrypt języka C#). Nadaj skryptowi nazwę CloudScene

    Screenshot that shows how to create the new 'CloudScene' script.rename CloudScene

  2. Dodaj następujące przestrzenie nazw:

    using Newtonsoft.Json;
    using System.Collections;
    using System.Text;
    using System.Threading.Tasks;
    using UnityEngine;
    using UnityEngine.Networking;
    
  3. Wstaw następujące zmienne:

        /// <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. Zastąp wartość azureFunctionEndpoint adresem URL aplikacji funkcji platformy Azure znalezioną w App Service funkcji platformy Azure w witrynie Azure Portal, jak pokazano na poniższej ilustracji:

    get function URL

  5. Teraz dodaj metody Start() i Awake(), aby zainicjować klasę.

        /// <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. W metodzie Update() dodaj następujący kod, który wykryje wprowadzanie myszy i przeciąganie, co spowoduje przeniesienie obiektów GameObject w scenie. Jeśli użytkownik przeciągnął i porzucił obiekt, przekaże nazwę i współrzędne obiektu do metody UpdateCloudScene(), która wywoła usługę Azure Function App Service, która zaktualizuje tabelę platformy Azure i wyzwoli powiadomienie.

        /// <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. Teraz dodaj metodę UpdateCloudScene(), jak pokazano poniżej:

        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. Zapisz kod i wróć do aparatu Unity

  9. Przeciągnij skrypt CloudScene na Aparat Main.

    1. Kliknij Aparat Main (Główny Aparat) w panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.

    2. Po otwarciu folderu Scripts wybierz skrypt CloudScene i przeciągnij go na Aparat Main. Wynik powinien być następujący:

      drag cloud script onto main camera

Rozdział 11 — Tworzenie Project klasycznych na platformę UWP

Ukończono wszystkie elementy potrzebne dla sekcji aparatu Unity tego projektu.

  1. Przejdź do Ustawienia kompilacji (Ustawienia kompilacjiplików>).

  2. W oknie Kompilacja Ustawienia kliknij pozycję Skompiluj.

    Screenshot that shows the Build Settings window with Universal Windows Platform selected and the 'Build' button highlighted in the lower right.

  3. Zostanie wyświetlone okno Eksplorator plików z monitem o utworzenie lokalizacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj mu nazwę BUILDS.

    new folder for build

    1. Otwórz nowy folder BUILDS i utwórz inny folder (ponownie użyj nowego folderu ) i nadaj mu nazwę NH_Desktop_App.

      folder name NH_Desktop_App

    2. Po wybraniu NH_Desktop_App . kliknij pozycję Wybierz folder. Kompilacja projektu może potrwać kilka minut.

  4. Po zakończeniu kompilacji Eksplorator plików zostanie wyświetlona lokalizacja nowego projektu. Nie trzeba go jednak otwierać, ponieważ musisz najpierw utworzyć inny projekt aparatu Unity, w kilku następnych rozdziałach.

Rozdział 12 — Konfigurowanie Mixed Reality Unity Project

Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.

  1. Otwórz aparat Unity i kliknij pozycję Nowy.

    Screenshot that shows the Unity Projects window with 'New' highlighted in the upper right.

  2. Teraz musisz podać nazwę Project aparatu Unity, wstawić aparat UnityMRNotifHub. Upewnij się, że typ projektu jest ustawiony na wartość 3D. Ustaw lokalizację na odpowiednią dla Siebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.

    name UnityMRNotifHub

  3. Po otwarciu aparatu Unity warto sprawdzić, czy domyślny edytor skryptów jest ustawiony na Visual Studio. Przejdź do pozycji Edytuj>preferencje , a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje .

    set external editor to VS

  4. Następnie przejdź do pozycji Kompilacja pliku>Ustawienia i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.

    switch platforms to UWP

  5. Przejdź do pozycji Kompilacja pliku>Ustawienia i upewnij się, że:

    1. Urządzenie docelowe jest ustawione na dowolne urządzenie

      W przypadku Microsoft HoloLens dla ustawienia Urządzenie docelowe ustaw wartość HoloLens.

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną

    4. Visual Studio Wersja jest ustawiona na najnowszą zainstalowaną

    5. Kompilowanie i uruchamianie jest ustawione na maszynę lokalną

    6. W tym miejscu warto zapisać scenę i dodać ją do kompilacji.

      1. W tym celu wybierz pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.

        Screenshot that shows the Build Settings window with 'Add Open Scenes' button highlighted in the upper right.

      2. Utwórz nowy folder dla tego i dowolnego przyszłego sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.

        Screenshot that shows 'New folder' highlighted in the upper left in the Save Scene window.

      3. Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz NH_MR_Scene, a następnie naciśnij przycisk Zapisz.

        new scene - NH_MR_Scene

    7. Pozostałe ustawienia w obszarze Build Ustawienia (Kompilacja Ustawienia) powinny być pozostawione jako domyślne.

  6. W tym samym oknie kliknij przycisk Odtwarzacz Ustawienia, spowoduje to otwarcie powiązanego panelu w przestrzeni, w której znajduje się inspektor.

    open player settings

  7. W tym panelu należy zweryfikować kilka ustawień:

    1. Na karcie Inne Ustawienia:

      1. Wersja środowiska uruchomieniowego skryptów powinna być eksperymentalna (odpowiednik platformy .NET 4.6)

      2. Tworzenie skryptów zaplecza powinno mieć wartość .NET

      3. Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6

        api compatibility

    2. W dalszej części panelu, w Ustawienia XR (znaleziono poniżej publikowania Ustawienia), zaznacz opcję Obsługa rzeczywistości wirtualnej, upewnij się, że zestaw SDK Windows Mixed Reality został dodany

      update xr settings

    3. Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:

      • InternetClient

        Screenshot that shows the Publishing Settings tab with InternetClient checked.

  8. Po powrocie do Ustawienia kompilacjiprojekty języka C# aparatu Unity nie są już wyszarzone: zaznacz pole wyboru obok tego pola wyboru.

  9. Po wprowadzeniu tych zmian zamknij okno Kompilowanie Ustawienia.

  10. Zapisz scenę i Project Scenazapisywania plików> /Zapisz plik> Project.

    Ważne

    Jeśli chcesz pominąć składnik Konfiguracji aparatu Unity dla tego projektu (aplikacja rzeczywistości mieszanej) i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 14. Nadal trzeba będzie dodać składniki skryptu.

Rozdział 13 — Importowanie bibliotek DLL w Mixed Reality Unity Project

Będziesz używać usługi Azure Storage dla biblioteki aparatu Unity (która korzysta z zestawu .Net SDK dla platformy Azure). Skorzystaj z tego linku, aby dowiedzieć się, jak używać usługi Azure Storage z aparatem Unity. Obecnie istnieje znany problem w a aparatu Unity, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (4–7 w tej sekcji) nie będą już wymagane po rozwiązaniu usterki.

Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage. Następnie wykonaj następujące czynności:

  1. Dodaj pakiet unitypackage pobrany z powyższych elementów do aparatu Unity przy użyciu opcji menuImportuj pakiet niestandardowy pakietu>Assets>.

  2. W wyświetlonym oknie Importuj pakiet aparatu Unity możesz wybrać wszystko w obszarze Wtyczka>Storage.

    import package

  3. Kliknij przycisk Importuj , aby dodać elementy do projektu.

  4. Przejdź do folderu Storage w obszarze Wtyczki w widoku Project i wybierz tylko następujące wtyczki:

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

    select plugins

  5. Po wybraniu tych określonych wtyczekusuń zaznaczenie pola wyboru Dowolna platforma i usuń zaznaczenie pola wyboruWSAPlayer, a następnie kliknij przycisk Zastosuj.

    apply platform changes

    Uwaga

    Oznaczasz te konkretne wtyczki, które mają być używane tylko w edytorze aparatu Unity. Jest to spowodowane tym, że istnieją różne wersje tych samych wtyczek w folderze WSA, które będą używane po wyeksportowaniu projektu z aparatu Unity.

  6. W folderze wtyczki Storage wybierz tylko następujące opcje:

    • Microsoft.Data.Services.Client

      select data services client

  7. Zaznacz pole Nie przetwarzaj w obszarze Platforma Ustawienia i kliknij przycisk Zastosuj.

    dont process

    Uwaga

    Oznaczasz tę wtyczkę "Nie przetwarzaj", ponieważ poprawka zestawu aparatu Unity ma trudności z przetwarzaniem tej wtyczki. Wtyczka będzie nadal działać, mimo że nie jest przetwarzana.

Rozdział 14 — Tworzenie klasy TableToScene w projekcie aparatu Unity rzeczywistości mieszanej

Klasa TableToScene jest identyczna z klasą objaśnianą w rozdziale 9. Utwórz tę samą klasę w środowisku Unity rzeczywistości mieszanej, Project zgodnie z tą samą procedurą opisaną w rozdziale 9.

Po ukończeniu tego rozdziału obie projekty aparatu Unity będą miały tę klasę skonfigurowaną w Aparat Main.

Rozdział 15 — Tworzenie klasy NotificationReceiver w Mixed Reality Unity Project

Drugi skrypt, który należy utworzyć, to NotificationReceiver, który jest odpowiedzialny za:

  • Rejestrowanie aplikacji w usłudze Notification Hub podczas inicjowania.
  • Nasłuchiwanie powiadomień pochodzących z centrum powiadomień.
  • Deserializowanie danych obiektu z odebranych powiadomień.
  • Przenieś obiekty GameObjects w scenie na podstawie zdeserializowanych danych.

Aby utworzyć skrypt NotificationReceiver :

  1. Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create (Utwórz), C# Script (Skrypt języka C#). Nadaj skryptowi nazwę NotificationReceiver.

    create new c# scriptname it NotificationReceiver

  2. Kliknij dwukrotnie skrypt, aby go otworzyć.

  3. Dodaj następujące przestrzenie nazw:

    //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. Wstaw następujące zmienne:

        /// <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. Zastąp wartość hubName nazwą usługi Notification Hub i wartością hubListenEndpoint wartością punktu końcowego znajdującą się na karcie Zasady dostępu Azure Notification Hub Service w witrynie Azure Portal (zobacz obraz poniżej).

    insert notification hubs policy endpoint

  6. Teraz dodaj metody Start() i Awake(), aby zainicjować klasę.

        /// <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. Dodaj metodę WaitForNotification , aby umożliwić aplikacji odbieranie powiadomień z biblioteki centrum powiadomień bez kolidowania z wątkiem głównym:

        /// <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. Następująca metoda , InitNotificationAsync(), zarejestruje aplikację w usłudze notification Hub podczas inicjowania. Kod jest komentowany, ponieważ aparat Unity nie będzie mógł skompilować projektu. Komentarze zostaną usunięte podczas importowania pakietu NuGet usługi Azure Messaging w 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. Następująca procedura obsługi, Channel_PushNotificationReceived(), zostanie wyzwolona za każdym razem, gdy zostanie odebrane powiadomienie. Spowoduje to deserializacji powiadomienia, które będzie jednostką tabeli platformy Azure przeniesioną w aplikacji klasycznej, a następnie przenieś odpowiedni obiekt GameObject w scenie MR do tej samej pozycji.

    Ważne

    Kod jest komentowany, ponieważ kod odwołuje się do biblioteki Azure Messaging, którą dodasz po utworzeniu projektu aparatu Unity przy użyciu Menedżer pakietów Nuget w Visual Studio. W związku z tym projekt aparatu Unity nie będzie mógł skompilować, chyba że zostanie on skomentowany. Pamiętaj, że jeśli skompilujesz projekt, a następnie chcesz powrócić do środowiska Unity, musisz ponownie oznaczyć ten kod jako komentarz.

        ///// <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. Pamiętaj, aby zapisać zmiany przed powrotem do edytora aparatu Unity.

  11. Kliknij Aparat Main (Główny Aparat) w panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.

  12. Po otwarciu folderu Scripts wybierz skrypt NotificationReceiver i przeciągnij go do Aparat Main. Wynik powinien być następujący:

    drag notification receiver script to camera

    Uwaga

    Jeśli programujesz to dla Microsoft HoloLens, musisz zaktualizować składnik Aparat main Aparat, aby:

    • Wyczyść flagi: kolor stały
    • Tło: Czarny

Rozdział 16 — Tworzenie Mixed Reality Project do platformy UWP

Ten rozdział jest identyczny z procesem kompilacji dla poprzedniego projektu. Wszystko potrzebne dla sekcji Aparatu Unity tego projektu zostało ukończone, więc nadszedł czas, aby skompilować go z aparatu Unity.

  1. Przejdź do Ustawienia kompilacji (kompilacja pliku>Ustawienia ).

  2. Z menu Kompilacja Ustawienia upewnij się, że po kompilacji jest zaznaczona opcja Projekty języka C# aparatu Unity* (co umożliwi edytowanie skryptów w tym projekcie).

  3. Po zakończeniu kliknij pozycję Skompiluj.

    Screenshot that shows the Build Settings window with the 'Build' button highlighted in the lower right.

  4. Zostanie wyświetlone okno Eksplorator plików z monitem o utworzenie lokalizacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj mu nazwę BUILDS.

    create builds folder

    1. Otwórz nowy folder BUILDS i utwórz inny folder (ponownie użyj nowego folderu ) i nadaj mu nazwę NH_MR_App.

      create NH_MR_Apps folder

    2. Po wybraniu NH_MR_App . kliknij pozycję Wybierz folder. Kompilacja projektu potrwa minutę lub tak.

  5. Po kompilacji zostanie otwarte okno Eksplorator plików w lokalizacji nowego projektu.

Rozdział 17 — Dodawanie pakietów NuGet do rozwiązania UnityMRNotifHub

Ostrzeżenie

Pamiętaj, że po dodaniu następujących pakietów NuGet (i usunięciu komentarza w następnym rozdziale) kod, po ponownym otwarciu w Project aparatu Unity, będą przedstawiać błędy. Jeśli chcesz wrócić i kontynuować edytowanie w edytorze Unity, musisz dodać komentarz, który jest błędny, a następnie ponownie usunąć komentarz później, gdy wrócisz do Visual Studio.

Po zakończeniu kompilacji rzeczywistości mieszanej przejdź do projektu rzeczywistości mieszanej, który został utworzony, i kliknij dwukrotnie plik rozwiązania (sln) w tym folderze, aby otworzyć rozwiązanie za pomocą Visual Studio 2017. Teraz musisz dodać pakiet windowsAzure.Messaging.managed NuGet. Jest to biblioteka służąca do odbierania powiadomień z centrum powiadomień.

Aby zaimportować pakiet NuGet:

  1. W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie

  2. Kliknij pozycję Zarządzaj pakietami NuGet.

    open nuget manager

  3. Wybierz kartę Przeglądaj i wyszukaj ciąg WindowsAzure.Messaging.managed.

    find windows azure messaging package

  4. Wybierz wynik (jak pokazano poniżej), a następnie w oknie po prawej stronie zaznacz pole wyboru obok pozycji Project. Spowoduje to umieszczenie znacznika w polu wyboru obok Project wraz z polem wyboru obok projektu Assembly-CSharp i UnityMRNotifHub.

    tick all projects

  5. Początkowo podana wersja może nie być zgodna z tym projektem. W związku z tym kliknij menu rozwijane obok pozycji Wersja, a następnie kliknij pozycję Wersja 0.1.7.9, a następnie kliknij przycisk Zainstaluj.

  6. Zakończono instalowanie pakietu NuGet. Znajdź kod komentarza wprowadzony w klasie NotificationReceiver i usuń komentarze.

Rozdział 18 — Edytowanie aplikacji UnityMRNotifHub, klasy NotificationReceiver

Po dodaniu pakietów NuGet należy usunąć komentarz w kodzie w klasie NotificationReceiver.

Obejmuje to następujące działania:

  1. Przestrzeń nazw u góry:

    using Microsoft.WindowsAzure.Messaging;
    
  2. Cały kod w metodzie 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;
            }
        }
    

Ostrzeżenie

Powyższy kod zawiera komentarz: upewnij się, że komentarz nie został przypadkowo usunięty z komentarza (ponieważ kod nie zostanie skompilowany, jeśli masz!).

  1. I wreszcie zdarzenie Channel_PushNotificationReceived :

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

Po wybraniu tego komentarza upewnij się, że zapiszesz, a następnie przejdź do następnego rozdziału.

Rozdział 19 — Kojarzenie projektu rzeczywistości mieszanej z aplikacją Ze Sklepu

Teraz musisz skojarzyć projekt rzeczywistości mieszanej z aplikacją ze sklepu utworzoną na początku laboratorium.

  1. Otwórz rozwiązanie.

  2. Kliknij prawym przyciskiem myszy aplikację platformy UWP Project w panelu Eksplorator rozwiązań, przejdź do sklepu i skojarz aplikację ze Sklepem....

    open store association

  3. Zostanie wyświetlone nowe okno o nazwie Skojarz aplikację ze sklepem Windows Store. Kliknij przycisk Dalej.

    go to the next screen

  4. Spowoduje to załadowanie wszystkich aplikacji skojarzonych z kontem, które zostało zarejestrowane. Jeśli nie zalogowano się do konta, możesz zalogować się na tej stronie.

  5. Znajdź nazwę aplikacji ze sklepu utworzoną na początku tego samouczka i wybierz ją. Następnie kliknij przycisk Dalej.

    find and select your store name

  6. Kliknij pozycję Skojarz.

    associate the app

  7. Aplikacja jest teraz skojarzona z aplikacją ze sklepu. Jest to konieczne do włączenia powiadomień.

Rozdział 20 — Wdrażanie aplikacji UnityMRNotifHub i UnityDesktopNotifHub

Ten rozdział może być łatwiejszy w przypadku dwóch osób, ponieważ w rezultacie będą zawierać zarówno aplikacje uruchomione, jedno uruchomione na komputerze Desktop, jak i drugie w immersywnym zestawie słuchawkowym.

Immersywna aplikacja zestawu słuchawkowego oczekuje na otrzymywanie zmian w scenie (zmiany pozycji lokalnych obiektów GameObject), a aplikacja klasyczna wprowadza zmiany w swojej lokalnej scenie (zmiany pozycji), które zostaną udostępnione aplikacji MR. Najpierw należy wdrożyć aplikację MR, a następnie aplikację klasyczną, aby odbiornik mógł zacząć nasłuchiwać.

Aby wdrożyć aplikację UnityMRNotifHub na maszynie lokalnej:

  1. Otwórz plik rozwiązania aplikacji UnityMRNotifHub w Visual Studio 2017.

  2. W obszarze Platforma rozwiązania wybierz pozycję x86, Komputer lokalny.

  3. W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.

    Screenshot that shows the Solution Configuration set to 'Debug' in the toolbar.

  4. Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie , aby załadować aplikację bezpośrednio na maszynę.

  5. Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji, które będą gotowe do uruchomienia.

Aby wdrożyć aplikację UnityDesktopNotifHub na komputerze lokalnym:

  1. Otwórz plik rozwiązania aplikacji UnityDesktopNotifHub w Visual Studio 2017 r.

  2. W obszarze Platforma rozwiązania wybierz pozycję x86, Komputer lokalny.

  3. W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.

    Screenshot that shows the Solution Configuration set to 'Debug'.

  4. Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie , aby załadować aplikację bezpośrednio na maszynę.

  5. Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji, które będą gotowe do uruchomienia.

  6. Uruchom aplikację rzeczywistości mieszanej, a następnie aplikację klasyczną.

Po uruchomieniu obu aplikacji przenieś obiekt na scenie pulpitu (przy użyciu przycisku myszy po lewej stronie). Te zmiany pozycyjne zostaną wprowadzone lokalnie, serializowane i wysyłane do usługi App Service funkcji. Usługa App Service funkcji zaktualizuje tabelę wraz z centrum powiadomień. Po otrzymaniu aktualizacji centrum powiadomień wyśle zaktualizowane dane bezpośrednio do wszystkich zarejestrowanych aplikacji (w tym przypadku immersyjnej aplikacji nagłownej), która następnie deserializuje dane przychodzące i zastosuje nowe dane pozycyjne do obiektów lokalnych, przenosząc je w scenie.

Ukończono aplikację usługi Azure Notification Hubs

Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z usługi Azure Notification Hubs Service i umożliwia komunikację między aplikacjami.

final product -end

Ćwiczenia dodatkowe

Ćwiczenie 1

Czy możesz sprawdzić, jak zmienić kolor obiektów GameObjects i wysłać to powiadomienie do innych aplikacji wyświetlających scenę?

Ćwiczenie 2

Czy możesz dodać ruch obiektów GameObjects do aplikacji MR i zobaczyć zaktualizowaną scenę w aplikacji klasycznej?