HoloLens (1. generacja) 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 nagłownych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania aplikacji dla tych urządzeń. Te samouczki nie zostaną zaktualizowane o najnowsze zestawy narzędzi lub interakcje używane w 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 zademonstrują sposób tworzenia aplikacji dla HoloLens 2. Ta informacja zostanie zaktualizowana przy użyciu linku do tych samouczków, gdy zostaną opublikowane.


końcowy produkt — start

W ramach tego kursu 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 na dowolną platformę, a wszystko to w chmurze. Może to skutecznie umożliwić deweloperom komunikowanie się z użytkownikami końcowi, a nawet komunikowanie się między różnymi aplikacjami, w zależności od scenariusza. Aby uzyskać więcej informacji, odwiedź stronę azure Notification Hubs .

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

Azure Tables to usługa w chmurze firmy Microsoft, która umożliwia deweloperom przechowywanie ustrukturyzowanych danych innych niż SQL w chmurze, dzięki czemu są łatwo dostępne w dowolnym miejscu. Usługa ta ma nieschematną konstrukcję, umożliwiając ewolucję tabel zgodnie z potrzebami i dlatego jest bardzo elastyczna. Aby uzyskać więcej informacji, odwiedź stronę tabel platformy Azure

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

  1. Aplikacja Komputer stacjonarny umożliwi użytkownikowi przenoszenie obiektu w przestrzeni 2D (X i Y) za pomocą myszy.

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

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

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

W aplikacji to Ty musisz dowiedzieć się, jak zintegrować wyniki z projektem. Ten kurs został zaprojektowany, aby nauczyć Cię, jak zintegrować usługę platformy Azure z platformą Unity Project. Twoim zadaniem jest wykorzystanie wiedzy zdobytej podczas tego kursu w celu ulepszania 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 Immersywne zestawy nagłow
Mr i Azure 308: powiadomienia między urządzeniami ✔️ ✔️

Uwaga

Chociaż ten kurs koncentruje się głównie Windows Mixed Reality na immersywnych zestawach nagłownych (VR), możesz również zastosować to, czego się nauczysz w tym kursie, Microsoft HoloLens. Podczas śledzenia kursu zobaczysz notatki dotyczące wszelkich zmian, które mogą być konieczne do obsługi HoloLens. Podczas korzystania 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 z aparatu Unity i języka C#. Należy również pamiętać, że wymagania wstępne i instrukcje w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Zgodnie z informacjami w artykule instalacja narzędzi możesz korzystać z najnowszego oprogramowania, chociaż nie należy zakładać, że informacje w tym kursie będą idealnie zgodne z informacjami w nowszej wersji oprogramowania niż wymienione poniżej.

Na ten kurs zalecamy użycie następującego sprzętu i oprogramowania:

Przed rozpoczęciem

  • Aby uniknąć problemów podczas kompilowania tego projektu, zdecydowanie zaleca się utworzenie projektu wspomnianego 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 Deweloper Microsoft Portal i portalu rejestracji aplikacji. W przeciwnym razie nie będziesz mieć uprawnień dostępu do aplikacji w rozdziale 2.

Rozdział 1 . Tworzenie aplikacji w Deweloper Microsoft Portal

Aby korzystać z usługi Azure Notification Hubs Service, należy utworzyć aplikację w portalu Deweloper Microsoft, ponieważ aplikacja musi być zarejestrowana, aby można było wysyłać i odbierać powiadomienia.

  1. Zaloguj się do witryny Deweloper Microsoft Portal.

    Musisz zalogować się do swojego konta Microsoft.

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

    tworzenie aplikacji

  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.

    odwracanie nazwy

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

Rozdział 2 . Pobieranie poświadczeń nowych aplikacji

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

  1. Przejdź do portalu rejestracji aplikacji.

    portal rejestracji aplikacji

    Ostrzeżenie

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

  2. Swoją aplikację znajdziesz w sekcji Moje aplikacje. Po jego kliknięciu zostanie ona przekierowywana do nowej strony o nazwie aplikacji i nazwie Rejestracja.

    Nowo zarejestrowana aplikacja

  3. Przewiń w dół stronę rejestracji, aby znaleźć sekcję Wpisy tajne aplikacji i identyfikator SID pakietu dla aplikacji. Skopiuj oba te narzędzia do użycia podczas konfigurowania usługi Azure Notification Hubs Service w następnym rozdziale.

    wpisy tajne aplikacji

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

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

  1. Zaloguj się do witryny Azure Portal.

    Uwaga

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

  2. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu, wyszukaj centrum powiadomień i naciśnij klawisz Enter.

    wyszukiwanie centrum powiadomień

    Uwaga

    Słowo Nowy _ może zostać zastąpione przez _Utwórz zasób, w nowszej witrynie Portal.

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

    tworzenie wystąpienia usługi Notification Hubs

  4. Po kliknięciu przycisku 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, aprowizowanie i zarządzanie rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się, aby wszystkie usługi platformy Azure skojarzone z pojedynczym projektem (np. takimi jak te laboratoria) były w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej o grupach 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.

      wypełnianie szczegółów usługi

  5. Po kliknięciu przycisku Utwórz musisz poczekać na utworzenie usługi. Może to potrwać minutę.

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

    powiadomienie

  7. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby eksplorować nowe wystąpienie usługi. Zostaniesz przekierowyny do nowego wystąpienia usługi Notification Hubs.

    przejdź do zasobu

  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 aplikacji, która została wcześniej ustawiona.

    nowo utworzona usługa centrów

  9. Po skopiowaniu szczegółów do odpowiednich pól kliknij przycisk Zapisz, a po pomyślnym zaktualizowaniu centrum powiadomień otrzymasz powiadomienie.

    kopiowanie szczegółów zabezpieczeń

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

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

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

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

    Uwaga

    Słowo New _ może zostać zastąpione przez _Utwórz zasób, w nowszej witrynie Portal.

  3. Wybierz Storage konto — blob, file, table, queue z listy.

    wyszukiwanie konta magazynu

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

    tworzenie wystąpienia magazynu

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

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

    2. W przypadku modelu wdrażania kliknij pozycję Resource Manager.

    3. W pozycji Rodzaj konta z menu rozwijanego wybierz pozycję Storage (ogólnego przeznaczenia, wersja 1).

    4. Wybierz odpowiednią lokalizację.

    5. W menu rozwijanym Replikacja wybierz pozycję Dostęp do odczytu do magazynu geograficznie nadmiarowego (RA-GRS).

    6. W przypadku ustawienia 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, aprowizowanie i zarządzanie rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się, aby wszystkie usługi platformy Azure skojarzone z pojedynczym projektem (np. takimi jak te laboratoria) były w ramach wspólnej grupy zasobów.

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

    10. Jeśli ta opcja jest dostępna, pozostaw opcję Sieci wirtualne w opcji Wyłączone.

    11. Kliknij pozycję Utwórz.

      wypełnianie szczegółów magazynu

  6. Po kliknięciu przycisku Utwórz musisz poczekać na utworzenie usługi. Może to potrwać minutę.

  7. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie. Kliknij powiadomienia, aby eksplorować nowe wystąpienie usługi.

    powiadomienie o nowym magazynie

  8. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby eksplorować nowe wystąpienie usługi. Zostaniesz przekierowyny do nowej strony Storage Service Instance overview (Omówienie wystąpienia usługi Storage Service).

    przejdź do zasobu

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

  10. Panel po prawej stronie zmieni się, aby wyświetlić informacje o usłudze Table Service, w których należy dodać nową tabelę. W tym celu kliknij + przycisk Tabela w lewym górnym rogu.

    otwieranie tabel

  11. Zostanie pokazana nowa strona, na której należy wprowadzić nazwę tabeli. Jest to nazwa, która będzie umożliwiać odwołujące się do danych w aplikacji w kolejnych rozdziałach. Wstaw odpowiednią nazwę i kliknij przycisk OK.

    tworzenie nowej tabeli

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

    utworzono nową tabelę

Rozdział 5 . Kończenie pracy z tabelą platformy Azure w Visual Studio

Teraz, po zakończeniu konfiguracji konta magazynu usługi Table Service, należy 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 Eksplorator > chmury.

    otwieranie eksploratora chmury

  3. Eksplorator chmury zostanie otwarty jako zadokowany element (czekaj na cierpliwość, ponieważ ładowanie może zająć trochę czasu).

    Uwaga

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

    • Zalogowano się do tego samego konta, które było używane w witrynie Azure Portal.

    • Wybierz subskrypcję na stronie Zarządzanie kontem (może być konieczne zastosowanie filtru z ustawień konta):

      znajdowanie subskrypcji

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

    otwieranie kont magazynu

  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ź pozycję Tabele i kliknij strzałkę znajdującą się obok tej pozycji, aby ujawnić tabelę utworzoną w ostatnim rozdziale. Kliknij dwukrotnie tabelę.

    otwieranie tabeli obiektów sceny

  6. Tabela zostanie otwarta w środku okna Visual Studio danych. Kliknij ikonę tabeli z + znakami plus.

    dodawanie nowej tabeli

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

    klucz partycji i wiersza

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

    dodawanie poprawnych wartości

  9. Kliknij pozycję Dodaj właściwość, aby dodać dodatkowe wiersze danych. Upewnij się, że pierwsza pusta tabela jest dopasowana do poniższej tabeli.

  10. Po zakończeniu kliknij przycisk OK.

    kliknij przycisk OK, gdy wszystko będzie gotowe

    Ostrzeżenie

    Upewnij się, że zmieniono typ wpisów X, Y i Z na Double.

  11. Zauważysz, że tabela zawiera teraz wiersz danych. Kliknij ponownie + ikonę (plus), aby dodać kolejną jednostkę.

    pierwszy wiersz

  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.

    dodawanie modułu

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

    dodawanie cylindra

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

    kompletna tabela

  15. Ten rozdział został ukończony. Pamiętaj o zapisaniu.

Rozdział 6 — Tworzenie aplikacji funkcji platformy Azure

Utwórz aplikację funkcji platformy Azure, która zostanie wywołana przez aplikację desktop w celu zaktualizowania usługi Table Service i wysłania powiadomienia za pośrednictwem centrum powiadomień.

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

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

    otwieranie Notatnika

  2. Po Notatnik wstaw do niego strukturę JSON poniżej. Po zakończeniu zapisz go na pulpicie jako plikproject.js na stronie. Ważne jest, aby nazwa była poprawna: upewnij się, że NIE ma rozszerzenia .txt pliku. Ten plik definiuje biblioteki używane przez funkcję, jeśli została użyta, NuGet będzie 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, a następnie wyszukaj aplikację funkcji i naciśnij klawisz Enter.

    wyszukiwanie aplikacji funkcji

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony słowem Utwórz zasób w nowszej witrynie Portal.

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

    wystąpienie aplikacji funkcji

  6. Po kliknięciu przycisku Utwórz wypełnij następujące pola:

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

    2. Wybierz subskrypcję.

    3. Wybierz odpowiednią warstwę cenową. Jeśli po raz pierwszy tworzysz funkcję, App Service powinna być dla Ciebie dostępna warstwa Bezpłatna.

    4. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowanie i zarządzanie rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się, aby wszystkie usługi platformy Azure skojarzone z pojedynczym projektem (np. takimi jak te laboratoria) były w ramach wspólnej grupy zasobów.

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

    5. W przypadku systemu operacyjnego kliknij Windows, ponieważ jest to zamierzony platformę.

    6. Wybierz plan hostingu (ten samouczek korzysta z planu Zużycie).

    7. Wybierz lokalizację (wybierz tę samą lokalizację co magazyn sbudowaną w poprzednim kroku)

    8. W sekcji Storage należy wybrać usługę Storage service utworzoną w poprzednim kroku.

    9. W tej aplikacji nie Szczegółowe informacje aplikacji, więc możesz pozostawić ją w stanie Wyłączone.

    10. Kliknij pozycję Utwórz.

      tworzenie nowego wystąpienia

  7. Po kliknięciu przycisku Utwórz musisz poczekać na utworzenie usługi. Może to potrwać minutę.

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

    nowe powiadomienie

  9. Kliknij powiadomienia, aby eksplorować nowe wystąpienie usługi.

  10. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby eksplorować nowe wystąpienie usługi.

    przejdź do zasobu

  11. Kliknij + ikonę (plus) obok przycisku Funkcje, aby utworzyć nowy .

    dodawanie nowej funkcji

  12. Na panelu centralnym zostanie wyświetlone okno Tworzenie funkcji. Zignoruj informacje w górnej połowie panelu, a następnie kliknij pozycję Funkcja niestandardowa, która znajduje się w dolnej części (w niebieskim obszarze, jak poniżej).

    funkcja niestandardowa

  13. Na nowej stronie w oknie będą wyświetlane różne typy funkcji. Przewiń w dół, aby wyświetlić fioletowe typy, a następnie kliknij element HTTP PUT.

    link http put

    Ważne

    Może być konieczne przewinięcie dalej w dół strony (i ten obraz może nie wyglądać dokładnie tak samo, jeśli zostały wprowadzone aktualizacje witryny Azure Portal), 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 menu rozwijaym Language (Język) wybierz pozycję # C.

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

    3. Z menu rozwijanego Poziom uwierzytelniania wybierz pozycję Funkcja.

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

    5. W sekcji Storage konta użyj menu rozwijanego i wybierz z tego miejsca swoje konto magazynu. Jeśli go tam nie ma, kliknij hiperlink Nowy obok tytułu sekcji, aby wyświetlić inny panel, na którym powinno być wyświetlane twoje konto magazynu.

      nowy magazyn

  15. Kliknij przycisk Utwórz. Zostanie wyświetlony komunikat z powiadomieniem, że ustawienia zostały pomyślnie zaktualizowane.

    create, funkcja

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

    aktualizowanie kodu funkcji

  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

    Przy użyciu dołączonych bibliotek funkcja otrzymuje 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 Hubs, która powiadamia wszystkie subskrybowane aplikacje.

  18. Po zapisaniu kodu kliknij pozycję Zapisz.

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

    otwieranie panelu przekazywania

  20. Panel wysunie się od prawej strony. Na tym panelu kliknij pozycję Upload, a zostanie wyświetlony ekran Przeglądarka plików.

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

    przekazywanie pliku JSON

  22. Po przesłaniu pliku zostanie on wyświetlony w panelu po prawej stronie. Kliknięcie go spowoduje otwarcie go w edytorze funkcji. Musi ona wyglądać dokładnie tak samo jak na następnej ilustracji (poniżej kroku 23).

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

    integrate, funkcja

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

    otwieranie edytora zaawansowanego

  25. W środkowym panelu zostanie otwartyfunction.jsplik, który należy zastąpić poniższym fragmentem kodu. Definiuje on tworzenie funkcji i parametry przekazane 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ć jak na poniższej ilustracji:

    powrót do edytora standardowego

  27. Możesz zauważyć, że właśnie wstawione parametry wejściowe mogą nie odpowiadać szczegółom tabeli i magazynu, dlatego należy zaktualizować je o informacje. Nie należy tego robić w tym miejscu, ponieważ o tym właśnie chodzi. Aby wrócić, wystarczy kliknąć link Edytor standardowy w prawym górnym rogu strony.

  28. Po powrocie do edytora Standard kliknij pozycję Azure Table Storage (tabela) w obszarze Dane wejściowe.

    Dane wejściowe tabeli

  29. Upewnij się, że następujące informacje są zgodne z Twoimi informacjami, ponieważ mogą się różnić (poniżej przedstawiono ilustrację poniżej):

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

    2. Storage konta: kliknij pozycję new(nowy), która zostanie wyświetlona obok menu rozwijanego, a po prawej stronie okna zostanie wyświetlony panel.

      nowy magazyn

      1. Wybierz konto Storage utworzone wcześniej w celu hostować aplikacje funkcji.

      2. Zauważysz, że wartość Storage konto zostało utworzone.

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

    3. Strona Dane wejściowe powinna teraz odpowiadać poniższym informacjom.

      dane wejściowe są ukończone

  30. Następnie kliknij pozycję Azure Notification Hub (powiadomienie) — w obszarze Dane wyjściowe. Upewnij się, że następujące informacje są dopasowane do Twoich informacji, ponieważ mogą się różnić (poniżej przedstawiono ilustrację poniżej):

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

    2. Notification Hubs przestrzeni nazw: kliknij pozycję new (nowy), która zostanie wyświetlona wraz z menu rozwijanego.

      sprawdzanie danych wyjściowych

    3. Zostanie wyświetlone okno podręczne Połączenie (zobacz ilustrację poniżej), w którym należy wybrać wcześniej ustawioną przestrzeń nazw centrum powiadomień.

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

    5. W menu rozwijanym Zasady ustaw wartość DefaultFullSharedAccessSignature.

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

      aktualizacja danych wyjściowych

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

Ostrzeżenie

Nie należy bezpośrednio edytować nazwy centrum powiadomień (wszystko to powinno odbywać się przy użyciu Edytor zaawansowany , o ile poprzednie kroki zostały wykonane prawidłowo.

dane wyjściowe są ukończone

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

    1. Jeszcze raz przejdź do strony funkcji:

      dane wyjściowe są ukończone

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

      dane wyjściowe są ukończone

    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 danych wyjściowych testu zostaną wyświetlone w obszarze konsoli poniżej kodu funkcji.

      dane wyjściowe są ukończone

    Ostrzeżenie

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

Rozdział 7 — Konfigurowanie programu Desktop Unity Project

Ważne

Aplikacja desktop, którą teraz tworzysz, nie będzie działać w edytorze aparatu Unity. Musi zostać uruchomiony poza edytorem, po sbudowania aplikacji, przy użyciu Visual Studio (lub wdrożonej aplikacji).

Poniżej przedstawiono typową infrastrukturę do budowania aplikacji za pomocą aparatu Unity i rzeczywistości mieszanej. W związku z tym jest to dobry szablon dla innych projektów.

Konfigurowanie i testowanie immersyjnego zestawu nagłownego rzeczywistości mieszanej.

Uwaga

Na ten kurs nie będą wymagane kontrolery ruchu. Jeśli potrzebujesz pomocy technicznej podczas konfigurowania immersyjnego zestawu nagłownego, skorzystaj z tego linku,aby dowiedzieć się, jak skonfigurować Windows Mixed Reality .

  1. Otwórz platformę Unity i kliknij pozycję New (Nowy).

    nowy projekt aparatu Unity

  2. Musisz podać nazwę aplikacji Aparatu Unity Project wstawić nazwę UnityDesktopNotifHub. Upewnij się, że typ projektu jest ustawiony na 3D. Ustaw lokalizację na wartość w odpowiednim miejscu (pamiętaj, że lepiej jest bliżej katalogów głównych). Następnie kliknij pozycję Create project (Utwórz projekt).

    tworzenie projektu

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

    ustawianie zewnętrznych narzędzi programu VS

  4. Następnie przejdź do opcji Kompilacja Ustawienia i wybierz pozycję > Platforma uniwersalna Windows, a następnie kliknij przycisk Switch Platform (Przełącz platformę), aby zastosować wybór.

    przełączanie platform

  5. Podczas pracy z programem File > Build Ustawienia upewnij się, że:

    1. Dla urządzenia docelowego ustawiono wartość Dowolne urządzenie

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

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną wersję

    4. Visual Studio jest ustawiona na najnowszą zainstalowaną wersję

    5. Kompilowanie i uruchamianie jest ustawione na wartość Komputer lokalny

    6. W tym miejscu warto zapisywać scenę i dodawać ją do kompilacji.

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

        dodawanie otwartych scen

      2. Utwórz dla tego folderu nowy folder i każdą przyszłą scenę, a następnie wybierz przycisk Nowy folder, aby utworzyć nowy folder i nadaj temu folderowi nazwę Scenes.

        nowy folder scenes

      3. Otwórz nowo utworzony folder Scenes, a następnie w polu Nazwa pliku: tekst wpisz NH Desktop _ _ Scene, a następnie naciśnij przycisk Zapisz.

        nowe NH_Desktop_Scene

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

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

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

    1. Na karcie Inne Ustawienia danych:

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

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

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

        Wersja 4.6 net

    2. Na karcie Publishing Ustawienia (Możliwości) sprawdź:

      • InternetClient

        zaznaczanie klienta internetowego

  8. Po powrocie do kompilacji Ustawienia projektu C # aparatu Unity nie jest już wyszaryzowany. Zaznacz pole wyboru obok tego pola wyboru.

  9. Zamknij okno Build Settings (Ustawienia kompilacji).

  10. Zapisz scenę i Project zapisz > scenę/plik > Project.

    Ważne

    Jeśli chcesz pominąć składnik Konfigurowanie aparatu Unity dla tego projektu (aplikacja desktopowa) i przejść bezpośrednio do kodu, możesz pobrać ten pakiet unitypackage,zaimportować go do projektu jako pakiet niestandardowy,a następnie kontynuować od rozdziału 9. Nadal będzie konieczne dodanie składników skryptu.

Rozdział 8 — Importowanie bibliotek DLL w a unity

Będziesz używać usługi Azure Storage for Unity (która sama korzysta z zestawu .Net SDK dla platformy Azure). Aby uzyskać więcej informacji, skorzystaj z tego linku na temat usługi Azure Storage for Unity.

Obecnie w a aparatu Unity występuje znany problem, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (od 4 do 7 w tej sekcji) nie będą już wymagane po naprawieniu 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 > Pakiet > niestandardowy importu zasobów.

  2. W wyskakującym oknie Import Unity Package (Importowanie pakietu aparatu Unity) możesz wybrać wszystko w obszarze *Plugin > Storage. Usuń zaznaczenie wszystkich innych, ponieważ nie jest on potrzebny w tym kursie.

    importowanie do pakietu

  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

usuń zaznaczenie pola wyboru Dowolna platforma

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

    stosowanie bibliotek DLL platformy

    Uwaga

    Oznaczamy te konkretne wtyczki tak, aby były używane tylko w edytorze aparatu Unity. Wynika to z tego, że 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 wtyczki wybierz tylko pozycję:

    • Microsoft.Data.Services.Client

      set don't process for dlls (zestaw nie przetwarzaj dla bibliotek DLL)

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

    nie należy stosować przetwarzania

    Uwaga

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

Rozdział 9. Tworzenie klasy TableToScene w projekcie aparatu Unity dla programu Desktop

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.
  • Przy użyciu danych tabeli określ, które obiekty mają być zduplikowane i na jakiej pozycji.

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

  • Zarejestrowanie zdarzenia kliknięcia lewym przyciskiem myszy 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 pozycję Folder zasobów w panelu Project, a następnie kliknij polecenie Utwórz > folder. Nadaj folderowi nazwę Skrypty.

    tworzenie folderu skryptów

    tworzenie folderu skryptów 2

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

  3. Kliknij prawym przyciskiem myszy wewnątrz folderu Skrypty, a następnie kliknij polecenie > Utwórz skrypt języka C#. Nadaj skryptowi nazwę TableToScene.

    nowa nazwa skryptu języka c#  TableToScene

  4. Kliknij dwukrotnie skrypt, aby otworzyć go w programie 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ści accountName swoimi wartościami nazwa usługi Azure Storage Service i accountKey wartością klucza znalezioną w usłudze Azure Storage Service w witrynie Azure Portal (zobacz obraz poniżej).

    pobieranie klucza konta

  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żyje 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 deserialiizacji 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 używasz przycisku Zapisz.

  11. Kliknij pozycję Main Camera (Kamera główna) na panelu Hierarchy (Hierarchia), aby jej właściwości pojawiały się w oknie Inspector (Inspektor).

  12. Po otwarciu folderu Skrypty wybierz plik TableToScene skryptu i przeciągnij go do aparatu głównego. Wynik powinien być następujący:

    dodawanie skryptu do aparatu głównego

Rozdział 10 . Tworzenie klasy CloudScene w aplikacji Desktop Unity Project

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

  • Zarejestrowanie zdarzenia kliknięcia lewym przyciskiem myszy 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 Skrypty, a następnie kliknij polecenie Utwórz skrypt języka C. # Nadaj skryptowi nazwę CloudScene

    zmiana nazwy nowego skryptu c#  na 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 znalezionym w witrynie Azure Function App Service w witrynie Azure Portal, jak pokazano na poniższej ilustracji:

    pobierz adres URL funkcji

  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 dane wejściowe myszy i przeciągnie je, co z kolei spowoduje przeniesienie gameObjects w scenie. Jeśli użytkownik przeciągnął i upuścił obiekt, przekaże nazwę i współrzędne obiektu do metody UpdateCloudScene(), która wywoła usługę aplikacji funkcji platformy Azure, 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 podano 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. Zapisywanie kodu i powrót do aparatu Unity

  9. Przeciągnij skrypt CloudScene do aparatu głównego.

    1. Kliknij pozycję Main Camera (Kamera główna) na panelu Hierarchy (Hierarchia), aby jej właściwości pojawiały się w oknie Inspector (Inspektor).

    2. Po otwarciu folderu Skrypty wybierz skrypt CloudScene i przeciągnij go do aparatu głównego. Wynik powinien być następujący:

      przeciąganie skryptu w chmurze na główny aparat fotograficzny

Rozdział 11 . Tworzenie pulpitu Project platformy UWP

Wszystkie potrzebne informacje w sekcji aparatu Unity w tym projekcie zostały ukończone.

  1. Przejdź do Ustawienia (Plik > kompilacji Ustawienia).

  2. W oknie Ustawienia kliknij pozycję Build (Kompilacja).

    kompilowanie projektu

  3. Zostanie Eksplorator plików podręczne okno podręczne z monitem o lokalizację kompilacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj temu folderowi nazwę BUILDS (KOMPILACJE).

    nowy folder do kompilacji

    1. Otwórz nowy folder BUILDS i utwórz inny folder (ponownie używając funkcji Nowy folder) i nadaj mu nazwę Aplikacja _ klasyczny _ NH.

      nazwa folderu NH_Desktop_App

    2. Po wybraniu aplikacji _ _ klasycznej NH. kliknij pozycję Wybierz folder. Tworzenie projektu potrwa około minuty.

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

Rozdział 12 — Konfigurowanie Mixed Reality Unity Project

Poniżej przedstawiono typową infrastrukturę do tworzenia aplikacji w rzeczywistości mieszanej i dlatego jest to dobry szablon dla innych projektów.

  1. Otwórz platformę Unity i kliknij pozycję New (Nowy).

    nowy projekt aparatu Unity

  2. Teraz musisz podać nazwę użytkownika aparatu Unity Project wstawić unityMRNotifHub. Upewnij się, że typ projektu jest ustawiony na 3D. Ustaw lokalizację na wartość w odpowiednim miejscu (pamiętaj, że lepiej jest bliżej katalogów głównych). Następnie kliknij pozycję Create project (Utwórz projekt).

    nazwa UnityMRNotifHub

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

    ustawianie edytora zewnętrznego na vs

  4. Następnie przejdź do pozycji File Build Ustawienia and switch the platform to Universal Windows Platform (Platforma uniwersalna Windows), klikając przycisk > Switch Platform (Przełącz platformę).

    przełączanie platform na platformę UWP

  5. Przejdź do pliku > Build Ustawienia and sure that:

    1. Dla urządzenia docelowego ustawiono wartość 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ą wersję

    4. Visual Studio jest ustawiona na najnowszą zainstalowaną wersję

    5. Kompilowanie i uruchamianie jest ustawione na wartość Komputer lokalny

    6. W tym miejscu warto zapisywać scenę i dodawać ją do kompilacji.

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

        dodawanie otwartych scen

      2. Utwórz dla tego folderu nowy folder i każdą przyszłą scenę, a następnie wybierz przycisk Nowy folder, aby utworzyć nowy folder i nadaj temu folderowi nazwę Scenes.

        nowy folder scenes

      3. Otwórz nowo utworzony folder Scenes( Sceny), a następnie w polu File name: text (Nazwa pliku: tekst) wpisz NH MR _ _ Scene,a następnie naciśnij przycisk Save (Zapisz).

        nowa scena — NH_MR_Scene

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

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

    otwieranie ustawień odtwarzacza

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

    1. Na karcie Inne Ustawienia danych:

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

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

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

        zgodność interfejsu API

    2. W dalszej część panelu, w Ustawienia XR (poniżej Ustawienia Publikowania), zaznacz pole wyboru Virtual Reality Supported(Obsługiwana rzeczywistość wirtualna) i upewnij się, że Windows Mixed Reality SDK został dodany

      aktualizowanie ustawień xr

    3. Na karcie Publishing Ustawienia (Możliwości) kliknij pozycję Heck:

      • InternetClient

        zaznaczanie klienta internetowego

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

  9. Po wymusze tych zmian zamknij okno Ustawienia kompilacji.

  10. Zapisz scenę i Project zapisz > scenę/plik > Project.

    Ważne

    Jeśli chcesz pominąć składnik Konfigurowanie aparatu Unity dla tego projektu (aplikacja rzeczywistości mieszanej) i przejść bezpośrednio do kodu, możesz pobrać ten pakiet unitypackage,zaimportować go do projektu jako pakiet niestandardowy,a następnie kontynuować od rozdziału 14. Nadal będzie konieczne dodanie składników skryptu.

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

Będziesz używać biblioteki Azure Storage for Unity (która używa zestawu .Net SDK dla platformy Azure). Skorzystaj z tego linku, aby dowiedzieć się, jak używać usługi Azure Storage z unity. Obecnie w a aparatu Unity występuje znany problem, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (4–7 w tej sekcji) nie będą już wymagane po naprawieniu 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 menu Pakiet niestandardowy importu > > zasobów.

  2. W wyskakującym oknie Import Unity Package (Importowanie pakietu aparatu Unity) możesz wybrać wszystko w obszarze Plugin > Storage.

    importowanie pakietu

  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

    wybieranie wtyczek

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

    stosowanie zmian platformy

    Uwaga

    Oznaczasz te konkretne wtyczki tak, aby były używane tylko w edytorze aparatu Unity. Wynika to z tego, że w folderze WSA istnieją różne wersje tych samych wtyczek, które będą używane po wyeksportowaniu projektu z aparatu Unity.

  6. W folderze Storage wtyczki wybierz tylko pozycję:

    • Microsoft.Data.Services.Client

      wybieranie klienta usług danych

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

    nie przetwarzaj

    Uwaga

    Oznaczasz tę wtyczkę jako "Nie przetwarzaj", ponieważ poprawki zestawu unity mają 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śnioną w rozdziale 9. Utwórz tę samą klasę w rzeczywistości mieszanej aparatu Unity Project zgodnie z procedurą wyjaśnioną w rozdziale 9.

Po ukończeniu tego rozdziału obie projekty aparatu Unity będą mieć tę klasę ustawioną w aparacie głównym.

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 centrum powiadomień podczas inicjowania.
  • Nasłuchiwanie powiadomień pochodzących z centrum powiadomień.
  • Deserializacja danych obiektu z odebranych powiadomień.
  • Przenieś gameObjects w scenie na podstawie zdeserializowanych danych.

Aby utworzyć skrypt NotificationReceiver:

  1. Kliknij prawym przyciskiem myszy wewnątrz folderu Skrypty, a następnie kliknij polecenie Utwórz skrypt języka C. # Nadaj skryptowi nazwę NotificationReceiver.

    utwórz nowy skrypt c#  o nazwie 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 Centrum powiadomień, a wartość hubListenEndpoint wartością punktu końcowego dostępną na karcie Zasady dostępu w usłudze Azure Notification Hub Service w witrynie Azure Portal (zobacz obraz poniżej).

    wstawianie punktu końcowego zasad usługi Notification Hubs

  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 głównym wątkiem:

        /// <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 Service podczas inicjowania. Kod jest skomentowany, ponieważ unity nie będzie w stanie skompilować projektu. Komentarze zostaną usunięcie podczas importowania pakietu Nuget usługi Azure Messaging w usłudze 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 deserializację powiadomienia, czyli jednostki tabeli platformy Azure, która została przeniesiona w aplikacji klasycznej, a następnie przeniesienie odpowiedniego obiektu GameObject w scenie mr do tej samej pozycji.

    Ważne

    Kod jest oznaczany jako komentarz, ponieważ kod odwołuje się do biblioteki usługi Azure Messaging, którą dodasz po sbudowania projektu aparatu Unity przy użyciu narzędzia Nuget Menedżer pakietów, w Visual Studio. W związku z tym nie będzie można skompilować projektu aparatu Unity, chyba że zostanie on wyeksmentowany. Należy pamiętać, że jeśli skompilowasz projekt, a następnie chcesz wrócić do aparatu Unity, musisz ponownie skomentować ten kod.

        ///// <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 pozycję Main Camera (Kamera główna) na panelu Hierarchy (Hierarchia), aby jej właściwości pojawiały się w oknie Inspector (Inspektor).

  12. Po otwarciu folderu Skrypty wybierz skrypt NotificationReceiver i przeciągnij go do aparatu głównego. Wynik powinien być następujący:

    przeciąganie skryptu odbiorcy powiadomień do aparatu

    Uwaga

    Jeśli opracowujesz tę Microsoft HoloLens, musisz zaktualizować składnik Aparat główny, tak aby:

    • Clear Flags: Solid Color
    • Tło: Czarny

Rozdział 16 . Tworzenie Mixed Reality Project platformy uniwersalnej systemu Windows

Ten rozdział jest identyczny z procesem kompilacji dla poprzedniego projektu. Wszystkie potrzebne informacje w sekcji dotyczącej aparatu Unity w tym projekcie zostały ukończone, więc czas na jego skompilowanie z aparatu Unity.

  1. Przejdź do Ustawienia (Plik > kompilacji Ustawienia ).

  2. W menu Build Ustawienia (Kompilacja i kompilacja) upewnij się, że opcja Projekty C# aparatu Unity * jest oznaczana (co umożliwi edytowanie skryptów w tym projekcie po kompilacji).

  3. Po zakończeniu kliknij pozycję Build (Skompilowanie).

    kompilowanie projektu

  4. Zostanie Eksplorator plików podręczne okno podręczne z monitem o lokalizację kompilacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj temu folderowi nazwę BUILDS (KOMPILACJE).

    tworzenie folderu kompilacji

    1. Otwórz nowy folder BUILDS i utwórz kolejny folder (ponownie używając nowego folderu) i nadaj mu nazwę NH _ MR _ App.

      tworzenie NH_MR_Apps folderu

    2. Po wybraniu aplikacji NH _ MR. _ kliknij pozycję Wybierz folder. Tworzenie projektu potrwa około minuty.

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

Rozdział 17 — Dodawanie NuGet do rozwiązania UnityMRNotifHub

Ostrzeżenie

Pamiętaj, że po dodaniu następujących pakietów NuGet (i odkomentowania kodu w następnym rozdziale)kod, po ponownym otwarciu w obrębie aparatu Unity Project, będzie przedstawiać błędy. Jeśli chcesz wrócić i kontynuować edytowanie w edytorze aparatu Unity, musisz skomentować ten błędny kod, a następnie komentarza ponownie później, gdy wrócisz do Visual Studio.

Po ukończeniu kompilacji rzeczywistości mieszanej przejdź do skompilowanego projektu rzeczywistości mieszanej i kliknij dwukrotnie plik rozwiązania (sln) w tym folderze, aby otworzyć rozwiązanie za pomocą programu Visual Studio 2017. Teraz musisz dodać pakiet NuGet WindowsAzure.Messaging.managed; jest to biblioteka, która jest używana do odbierania powiadomień z centrum powiadomień.

Aby zaimportować NuGet pakietu:

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

  2. Kliknij pozycję Manage NuGet Packages (Zarządzaj NuGet pakietów).

    otwieranie menedżera nuget

  3. Wybierz kartę Przeglądaj _ i wyszukaj pozycję _WindowsAzure.Messaging.managed.

    znajdowanie pakietu windows azure messaging

  4. Wybierz wynik (jak pokazano poniżej), a w oknie po prawej stronie zaznacz pole wyboru obok Project. Spowoduje to zaznaczenie pola wyboru obok Project , wraz z polem wyboru obok projektu Assembly-CSharp i UnityMRNotifHub.

    zaznaczanie wszystkich projektów

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

  6. Instalowanie pakietu NuGet zakończyło się. Znajdź kod z komentarzem wprowadzony w klasie NotificationReceiver i usuń komentarze.

Rozdział 18 — Edytowanie aplikacji UnityMRNotifHub, klasa NotificationReceiver

Po dodaniu NuGet pakietów należy odkomentować część kodu 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 nie został on przypadkowo odkomentowany (ponieważ kod nie zostanie skompilowany, jeśli już masz!).

  1. I na koniec Channel_PushNotificationReceived zdarzenia:

        /// <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 tych niezakomentowanychach upewnij się, że zapisujesz, 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ą w programie na początku laboratorium.

  1. Otwórz rozwiązanie.

  2. Kliknij prawym przyciskiem myszy aplikację platformy UWP w Project panelu aplikacji Eksplorator rozwiązań przejdź do strony Sklep i Skojarz aplikację ze sklepem....

    skojarzenie otwartego sklepu

  3. Zostanie wyświetlone nowe okno o nazwie Kojarzenie aplikacji ze sklepem Windows Store. Kliknij przycisk Dalej.

    przejdź do następnego ekranu

  4. Spowoduje to załadowanie wszystkich aplikacji skojarzonych z zalogowanym kontem. Jeśli nie zalogowano się do swojego 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.

    znajdowanie i wybieranie nazwy sklepu

  6. Kliknij pozycję Skojarz.

    kojarzenie aplikacji

  7. Twoja aplikacja jest teraz skojarzona z aplikacją ze sklepu. Jest to niezbędne 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ż wynik będzie obejmować zarówno uruchomione aplikacje, jedną na komputerze Desktop, jak i drugą w immersyjnym zestawie nagłownym.

Aplikacja nagłowna immersywnie czeka na wprowadzenie zmian w scenie (zmiany położenia lokalnych zestawów GameObject), a aplikacja desktopowa będzie wprowadzać zmiany w ich lokalnej scenie (zmiany położenia), która zostanie udostępniona aplikacji mr. Warto najpierw wdrożyć aplikację mr, a następnie aplikację desktopową, aby odbiornik może rozpocząć nasłuchiwanie.

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

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

  2. Na platformie rozwiązań wybierz pozycję x86, Komputer lokalny.

  3. W konfiguracji rozwiązania wybierz pozycję Debuguj.

    ustawianie konfiguracji projektu

  4. Przejdź do menu Kompilacja i kliknij pozycję Deploy Solution (Wd wdrażaj rozwiązanie), aby załadować aplikację na komputer.

  5. Aplikacja powinna teraz zostać wyświetlona na liście zainstalowanych aplikacji i powinna być gotowa do uruchomień.

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

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

  2. Na platformie rozwiązań wybierz pozycję x86, Komputer lokalny.

  3. W konfiguracji rozwiązania wybierz pozycję Debuguj.

    ustawianie konfiguracji projektu

  4. Przejdź do menu Kompilacja i kliknij pozycję Deploy Solution (Wd wdrażaj rozwiązanie), aby załadować aplikację na komputer.

  5. Aplikacja powinna teraz zostać wyświetlona na liście zainstalowanych aplikacji i powinna być gotowa do uruchomień.

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

Po uruchomieniu obu aplikacji przenieś obiekt w scenie pulpitu (przy użyciu lewego przycisku myszy). Te zmiany pozyacyjne zostaną wprowadzone lokalnie, serializowane i wysłane do usługi Aplikacji funkcji. Usługa Aplikacji 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 aplikacji nagłownej immersyjnej), która następnie zdeserializuje dane przychodzące i zastosuje nowe dane pozycyjnych do obiektów lokalnych, przenosząc je do sceny.

Ukończona aplikacja Azure Notification Hubs

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

końcowy produkt — koniec

Ćwiczenia dodatkowe

Ćwiczenie 1

Czy potrafisz zmienić kolorobiektów GameObject i wysłać to powiadomienie do innych aplikacji wyświetlających scenę?

Ćwiczenie 2

Czy możesz dodać ruch gameObjects do aplikacji mr i zobaczyć zaktualizowaną scenę w aplikacji klasycznej?