HoloLens (1. gen) i Azure 305: Funkcje i magazyn


Uwaga

Samouczki dotyczące akademii Mixed Reality zostały zaprojektowane z myślą o urządzeniach 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 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ć HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.


końcowy produkt -start

W tym kursie dowiesz się, jak tworzyć i używać Azure Functions i przechowywać dane za pomocą zasobu usługi Azure Storage w aplikacji rzeczywistości mieszanej.

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

Azure Storage to usługa w chmurze firmy Microsoft, która umożliwia deweloperom przechowywanie danych z ubezpieczeniem, które będzie wysoce dostępne, bezpieczne, trwałe, skalowalne i nadmiarowe. Oznacza to, że firma Microsoft będzie obsługiwać wszystkie problemy konserwacyjne i krytyczne dla Ciebie. Aby uzyskać więcej informacji, odwiedź artykuł Azure Storage.

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

  1. Zezwalaj użytkownikowi na spojrzenie na scenę.
  2. Wyzwalanie funkcji spawning obiektów, gdy użytkownik patrzy na przycisk "button" 3D.
  3. Obiekty zduplikowane zostaną wybrane przez funkcję platformy Azure.
  4. Podczas tworzenia każdego obiektu aplikacja będzie przechowywać typ obiektu w pliku platformy Azure znajdującym się w usłudze Azure Storage.
  5. Podczas ładowania po raz drugi dane usługi Azure File zostaną pobrane i użyte do odtworzenia akcji spawningu z poprzedniego wystąpienia aplikacji.

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 projektem aparatu Unity. Twoim zadaniem jest użycie wiedzy uzyskanych z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej.

Obsługa urządzeń

Kurs HoloLens Immersyjne zestawy słuchawkowe
MR i Azure 305: Funkcje i magazyn ✔️ ✔️

Uwaga

Chociaż ten kurs koncentruje się przede wszystkim na zestawach słuchawkowych Windows Mixed Reality immersywnych (VR), możesz również zastosować to, czego nauczysz się w tym kursie, aby Microsoft HoloLens. Zgodnie z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być konieczne, aby obsługiwać urządzenie HoloLens.

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 bezpłatnie korzystać z najnowszego oprogramowania, jak pokazano w artykule dotyczącym instalacji narzędzi , choć 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ące oprogramowanie i sprzęt:

Przed rozpoczęciem

Aby uniknąć problemów z kompilowaniem 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).

Rozdział 1 — witryna Azure Portal

Aby korzystać z usługi Azure Storage, należy utworzyć i skonfigurować konto magazynu w Azure Portal.

  1. Zaloguj się do witryny Azure Portal.

    Uwaga

    Jeśli nie masz jeszcze konta platformy Azure, musisz go utworzyć. Jeśli obserwujesz ten samouczek w sytuacji w klasie lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc w skonfigurowaniu nowego konta.

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

    wyszukiwanie w usłudze Azure Storage

    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 konta usługi Azure Storage . W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.

    tworzenie usługi

  4. Po kliknięciu pozycji Utwórz:

    1. Wstaw nazwę konta, należy pamiętać, że to pole akceptuje tylko cyfry i małe litery.

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

    3. W polu Rodzaj konta wybierz pozycję Magazyn (ogólnego przeznaczenia w wersji 1).

    4. Określ lokalizację grupy zasobów (jeśli tworzysz nową grupę zasobów). Lokalizacja najlepiej byłaby znajdować się w regionie, w którym aplikacja zostanie uruchomiona. Niektóre zasoby platformy Azure są dostępne tylko w niektórych regionach.

    5. W obszarze Replikacja wybierz pozycję Magazyn geograficznie nadmiarowy do odczytu (RA-GRS).

    6. W obszarze Wydajność wybierz opcję Standardowa.

    7. Pozostaw opcję Bezpieczny transfer wymagany jako Wyłączony.

    8. Wybierz 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, odwiedź artykuł dotyczący grupy zasobów.

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

    11. Wybierz przycisk Utwórz.

      informacje o usłudze wejściowej

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

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

    nowe powiadomienie w witrynie Azure Portal

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

    przejdź do zasobu

  8. 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 Konta magazynu .

    klucze dostępu

  9. Kliknij pozycję Klucze dostępu, aby wyświetlić punkty końcowe dla tej usługi w chmurze. Użyj Notatnika lub podobnego, aby skopiować jeden z kluczy do późniejszego użycia. Zwróć również uwagę na wartość Parametry połączenia , ponieważ będzie ona używana w klasie AzureServices , którą utworzysz później.

    kopiowanie parametry połączenia

Rozdział 2 . Konfigurowanie funkcji platformy Azure

Teraz napiszesz funkcjęplatformy Azure w usłudze platformy Azure.

Możesz użyć funkcji platformy Azure , aby wykonać niemal wszystko, co zrobisz z funkcją klasyczną w kodzie. Różnica jest taka, że ta funkcja może być dostępna przez dowolną aplikację, która ma poświadczenia dostępu do konta platformy Azure.

Aby utworzyć funkcję platformy Azure:

  1. W witrynie Azure Portal kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Aplikacja funkcji, a następnie kliknij przycisk Enter.

    tworzenie aplikacji funkcji

    Uwaga

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

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

    informacje o aplikacji funkcji

  3. Po kliknięciu pozycji Utwórz:

    1. Podaj nazwę aplikacji. W tym miejscu można używać tylko liter i cyfr (dozwolone są wielkie lub małe litery).

    2. Wybierz preferowaną subskrypcję.

    3. 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, odwiedź artykuł dotyczący grupy zasobów.

    4. W tym ćwiczeniu wybierz pozycję Windows jako wybrany system operacyjny.

    5. Wybierz pozycję Plan zużycia dla planu hostingu.

    6. Określ lokalizację grupy zasobów (jeśli tworzysz nową grupę zasobów). Lokalizacja najlepiej byłaby znajdować się w regionie, w którym aplikacja zostanie uruchomiona. Niektóre zasoby platformy Azure są dostępne tylko w niektórych regionach. Aby uzyskać optymalną wydajność, wybierz ten sam region co konto magazynu.

    7. W obszarze Magazyn wybierz pozycję Użyj istniejącej, a następnie z menu rozwijanego znajdź wcześniej utworzony magazyn.

    8. Pozostaw usługę Application Insights wyłączoną w tym ćwiczeniu.

      szczegóły aplikacji funkcji input

  4. Kliknij przycisk Utwórz.

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

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

    nowe powiadomienie w witrynie Azure Portal

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

    przejdź do aplikacji funkcji zasobów

  8. 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 App Service funkcji .

  9. Na pulpicie nawigacyjnym Aplikacji funkcji umieść wskaźnik myszy na pozycji Funkcje, znajdujący się w panelu po lewej stronie, a następnie kliknij symbol + (plus).

    tworzenie nowej funkcji

  10. Na następnej stronie upewnij się, że wybrano element webhook i interfejs API , a w obszarze Wybierz język wybierz pozycję CSharp, ponieważ będzie to język używany w tym samouczku. Na koniec kliknij przycisk Utwórz tę funkcję .

    wybierz pozycję web hook csharp

  11. Jeśli tak nie jest, kliknij nowo utworzoną funkcję na liście Funkcje w panelu po lewej stronie.

    otwórz nową funkcję

  12. Skopiuj następujący kod do funkcji. Ta funkcja po prostu zwróci losową liczbę całkowitą z zakresu od 0 do 2 po wywołaniu. Nie martw się o istniejący kod, możesz wkleić go na górze.

        using System.Net;
        using System.Threading.Tasks;
    
        public static int Run(CustomObject req, TraceWriter log)
        {
            Random rnd = new Random();
            int randomInt = rnd.Next(0, 3);
            return randomInt;
        }
    
        public class CustomObject
        {
            public String name {get; set;}
        }
    
  13. Wybierz pozycję Zapisz.

  14. Wynik powinien wyglądać podobnie do poniższego obrazu.

  15. Kliknij pozycję Pobierz adres URL funkcji i zanotuj wyświetlany punkt końcowy . Musisz wstawić go do klasy AzureServices , którą utworzysz w dalszej części tego kursu.

    Uzyskiwanie punktu końcowego funkcji

    Wstaw punkt końcowy funkcji

Rozdział 3 . Konfigurowanie projektu aparatu Unity

Poniżej przedstawiono typową konfigurację do tworzenia przy użyciu Mixed Reality, 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, odwiedź artykuł dotyczący konfigurowania rzeczywistości mieszanej.

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

    Tworzenie nowego projektu aparatu Unity

  2. Teraz musisz podać nazwę projektu aparatu Unity. Wstaw MR_Azure_Functions. 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.

    Nadaj nowemu projektowi aparatu unity nazwę

  3. Po otwarciu aparatu Unity warto sprawdzić domyślny edytor skryptów ustawiony na program 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 .

    ustawianie programu Visual Studio jako edytora skryptów

  4. Następnie przejdź dopozycji Ustawienia kompilacjiplików> i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.

    przełączanie platformy na platformę uwp

  5. Przejdź dopozycji Ustawienia kompilacjipliku> i upewnij się, że:

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

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

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną

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

    5. Kompilowanie i uruchamianie jest ustawione na komputer lokalny

    6. Zapisz scenę i dodaj ją do kompilacji.

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

        dodawanie otwartych scen

      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.

        utwórz folder scen

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

        Scena zapisywania funkcji

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

    Pozostaw domyślne ustawienia kompilacji

  7. W oknie Ustawienia kompilacji kliknij przycisk Ustawienia odtwarzacza , spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor .

    ustawienia odtwarzacza w inspektorze

  8. 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), co spowoduje konieczność ponownego uruchomienia edytora.
      2. Zaplecze skryptów powinno mieć wartość .NET
      3. Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6
    2. Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:

      • InternetClient

        ustawianie możliwości

    3. W dalszej części panelu w obszarze Ustawienia XR (znajdujące się poniżej ustawień publikowania) zaznacz opcję Obsługa rzeczywistości wirtualnej, upewnij się, że dodano zestaw SDK Windows Mixed Reality.

      ustawianie ustawień XR

  9. W obszarze Ustawienia kompilacjiProjekty aparatu Unity C# nie są już wyszarzone; zaznacz pole wyboru obok tego.

    znaczniki projektów c#

  10. Zamknij okno Build Settings (Ustawienia kompilacji).

  11. Zapisz scenę i projekt (PLIK>ZAPISZ SCENĘ / PLIK>ZAPISZ PROJEKT).

Rozdział 4 . Konfigurowanie głównego aparatu

Ważne

Jeśli chcesz pominąć konfigurowanie składników aparatu Unity w tym kursie i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage i zaimportować go do projektu jako pakiet niestandardowy. Będzie to również zawierać biblioteki DLL z następnego rozdziału. Po zaimportowaniu przejdź do rozdziału 7.

  1. W panelu hierarchii znajdziesz obiekt o nazwie Kamera główna, ten obiekt reprezentuje punkt widzenia "head" po "wewnątrz" aplikacji.

  2. Z pulpitem nawigacyjnym aparatu Unity przed tobą wybierz obiekt Main Camera GameObject. Zauważysz, że panel inspektora (zazwyczaj znajduje się po prawej stronie pulpitu nawigacyjnego) wyświetli różne składniki tego obiektu GameObject z przekształceniem u góry, a następnie aparatem i innymi składnikami. Konieczne będzie zresetowanie przekształcenia kamery głównej, aby była poprawnie umieszczona.

  3. Aby to zrobić, wybierz ikonę Koła zębatego obok składnika Przekształcanie aparatu, a następnie wybierz pozycję Resetuj.

    resetowanie przekształcenia

  4. Następnie zaktualizuj składnik Transform , aby wyglądał następująco:

Przekształcanie — położenie

X Y Z
0 1 0

Przekształcanie — rotacja

X Y Z
0 0 0

Przekształcanie — skalowanie

X Y Z
1 1 1

ustawianie transformacji aparatu

Rozdział 5 . Konfigurowanie sceny aparatu Unity

  1. Kliknij prawym przyciskiem myszy pusty obszar panelu hierarchii w obszarze Obiekt 3D, dodaj płaszczyznę.

    tworzenie nowej płaszczyzny

  2. Po wybraniu obiektu Płaszczyzna zmień następujące parametry w Panelu inspektora:

Przekształcanie — położenie

X Y Z
0 0 4

Przekształcanie — skalowanie

X Y Z
10 1 10

ustawianie położenia i skalowania płaszczyzny

widok sceny płaszczyzny

  1. Kliknij prawym przyciskiem myszy pusty obszar panelu hierarchii w obszarze Obiekt 3D, dodaj moduł.

    1. Zmień nazwę modułu na GazeButton (z wybraną pozycją Moduł naciśnij klawisz F2).

    2. Zmień następujące parametry pozycji przekształcania w panelu inspektora:

      X Y Z
      0 3 5

      ustaw przekształcenie przycisku spojrzenia

      widok sceny przycisku spojrzenia

    3. Kliknij przycisk listy rozwijanej Tag i kliknij pozycję Dodaj tag , aby otworzyć okienko Tagi & Warstwy.

      dodawanie nowego tagu

      wybierz znak plus

    4. Wybierz przycisk + (plus), a następnie w polu Nowa nazwa tagu wprowadź Ciąg GazeButton i naciśnij przycisk Zapisz.

      nazwij nowy tag

    5. Kliknij obiekt GazeButton w panelu hierarchii, a następnie w Panelu inspektora przypisz nowo utworzony tag GazeButton .

      przypisz przycisk spojrzenia na nowy tag

  2. Kliknij prawym przyciskiem myszy obiekt GazeButton w panelu hierarchii i dodaj pusty obiekt GameObject (który zostanie dodany jako obiekt podrzędny ).

  3. Wybierz nowy obiekt i zmień jego nazwę na ShapeSpawnPoint.

    1. Zmień następujące parametry pozycji przekształcania w panelu inspektora:

      X Y Z
      0 -1 0

      aktualizowanie przekształcenia punktu spawn kształtu

      widok sceny punktu spawn kształtu

  4. Następnie utworzysz obiekt tekstowy 3D , aby przekazać opinię na temat stanu usługi platformy Azure.

    Kliknij prawym przyciskiem myszy przycisk GazeButton w panelu hierarchii ponownie i dodaj obiekt 3D Object>3D jako element podrzędny.

    tworzenie nowego obiektu tekstowego 3D

  5. Zmień nazwę obiektu text 3D na AzureStatusText.

  6. Zmień pozycję przekształcania obiektu AzureStatusText w następujący sposób:

    X Y Z
    0 0 -0,6
  7. Zmień skalę przekształcenia obiektu AzureStatusText w następujący sposób: | X | Y | Z | | :---: | :---: | :---: | | 0.1 | 0.1 | 0.1 |

    Uwaga

    Nie martw się, jeśli wydaje się być poza centrum, ponieważ zostanie to naprawione po zaktualizowaniu poniższego składnika usługi Text Mesh.

  8. Zmień składnik usługi Text Mesh , aby był zgodny z poniższymi elementami:

    ustawianie składnika siatki tekstowej

    Porada

    Wybrany kolor to kolor szesnastkowy: 000000FF, choć możesz wybrać własny, po prostu upewnij się, że jest czytelny.

  9. Struktura Panelu hierarchii powinna teraz wyglądać następująco:

    Siatka tekstu w hierarchii

  10. Twoja scena powinna teraz wyglądać następująco:

    Siatka tekstu w widoku sceny

Rozdział 6 . Importowanie usługi Azure Storage dla aparatu Unity

Będziesz używać usługi Azure Storage dla środowiska Unity (która korzysta z zestawu .Net SDK dla platformy Azure). Więcej informacji na ten temat można uzyskać w artykule Azure Storage for Unity( 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 najnowszą wersję ".unitypackage" z usługi GitHub. Następnie wykonaj następujące czynności:

  1. Dodaj plik unitypackage do aparatu Unity przy użyciu opcji menu Importujpakiet>niestandardowypakietu 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.

    importowanie do pakietu

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

  4. Przejdź do folderu Storage w obszarze Plugins (Wtyczki) w widoku Project (Projekt) 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

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

    stosowanie bibliotek dll platformy

    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.

  6. W folderze Wtyczka magazynu wybierz tylko:

    • Microsoft.Data.Services.Client

      zestaw nie przetwarza bibliotek dll

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

    bez przetwarzania

    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ł 7 . Tworzenie klasy AzureServices

Pierwszą klasą, którą utworzysz, jest klasa AzureServices .

Klasa AzureServices będzie odpowiedzialna za:

  • Przechowywanie poświadczeń konta platformy Azure.

  • Wywoływanie funkcji aplikacja systemu Azure.

  • Przekazywanie i pobieranie pliku danych w usłudze Azure Cloud Storage.

Aby utworzyć tę klasę:

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

    utwórz nowy folder

    folder wywołania — skrypty

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

  3. Kliknij prawym przyciskiem myszy w folderze Utwórz>skrypt języka C#. Wywołaj skrypt AzureServices.

  4. Kliknij dwukrotnie nową klasę AzureServices , aby ją otworzyć za pomocą programu Visual Studio.

  5. Dodaj następujące przestrzenie nazw w górnej części usługi AzureServices:

        using System;
        using System.Threading.Tasks;
        using UnityEngine;
        using Microsoft.WindowsAzure.Storage;
        using Microsoft.WindowsAzure.Storage.File;
        using System.IO;
        using System.Net;
    
  6. Dodaj następujące pola inspector w klasie AzureServices :

        /// <summary>
        /// Provides Singleton-like behavior to this class.
        /// </summary>
        public static AzureServices instance;
    
        /// <summary>
        /// Reference Target for AzureStatusText Text Mesh object
        /// </summary>
        public TextMesh azureStatusText;
    
  7. Następnie dodaj następujące zmienne składowe w klasie AzureServices :

        /// <summary>
        /// Holds the Azure Function endpoint - Insert your Azure Function
        /// Connection String here.
        /// </summary>
    
        private readonly string azureFunctionEndpoint = "--Insert here you AzureFunction Endpoint--";
    
        /// <summary>
        /// Holds the Storage Connection String - Insert your Azure Storage
        /// Connection String here.
        /// </summary>
        private readonly string storageConnectionString = "--Insert here you AzureStorage Connection String--";
    
        /// <summary>
        /// Name of the Cloud Share - Hosts directories.
        /// </summary>
        private const string fileShare = "fileshare";
    
        /// <summary>
        /// Name of a Directory within the Share
        /// </summary>
        private const string storageDirectory = "storagedirectory";
    
        /// <summary>
        /// The Cloud File
        /// </summary>
        private CloudFile shapeIndexCloudFile;
    
        /// <summary>
        /// The Linked Storage Account
        /// </summary>
        private CloudStorageAccount storageAccount;
    
        /// <summary>
        /// The Cloud Client
        /// </summary>
        private CloudFileClient fileClient;
    
        /// <summary>
        /// The Cloud Share - Hosts Directories
        /// </summary>
        private CloudFileShare share;
    
        /// <summary>
        /// The Directory in the share that will host the Cloud file
        /// </summary>
        private CloudFileDirectory dir;
    

    Ważne

    Upewnij się, że zastąp wartości punktu końcowego i parametry połączenia wartościami z usługi Azure Storage znajdującymi się w witrynie Azure Portal

  8. Należy teraz dodać kod dla metod Awake() i Start( ). Te metody będą wywoływane, gdy klasa inicjuje:

        private void Awake()
        {
            instance = this;
        }
    
        // Use this for initialization
        private void Start()
        {
            // Set the Status text to loading, whilst attempting connection to Azure.
            azureStatusText.text = "Loading...";
        }
    
        /// <summary>
        /// Call to the Azure Function App to request a Shape.
        /// </summary>
        public async void CallAzureFunctionForNextShape()
        {
    
        }
    

    Ważne

    W przyszłym rozdziale wypełnimy kod CallAzureFunctionForNextShape().

  9. Usuń metodę Update(), ponieważ ta klasa nie będzie jej używać.

  10. Zapisz zmiany w programie Visual Studio, a następnie wróć do aparatu Unity.

  11. Kliknij i przeciągnij klasę AzureServices z folderu Scripts do obiektu Main Camera w panelu hierarchii.

  12. Wybierz aparat główny, a następnie pobierz obiekt podrzędny AzureStatusText pod obiektem GazeButton i umieść go w polu docelowym odwołania AzureStatusText w inspektorze, aby podać odwołanie do skryptu AzureServices .

    przypisywanie obiektu docelowego tekstu stanu platformy Azure

Rozdział 8 . Tworzenie klasy ShapeFactory

Następnym skryptem do utworzenia jest klasa ShapeFactory . Rolą tej klasy jest utworzenie nowego kształtu, gdy jest to wymagane, i zachowanie historii kształtów utworzonych na liście historii kształtów. Za każdym razem, gdy kształt jest tworzony, lista Historia kształtów jest aktualizowana w klasie AzureService , a następnie przechowywana w usłudze Azure Storage. Po uruchomieniu aplikacji, jeśli przechowywany plik zostanie znaleziony w usłudze Azure Storage, lista Historia kształtów zostanie pobrana i odtwarzana, z obiektem tekstowym 3D zapewniającym, czy wygenerowany kształt pochodzi z magazynu, czy też nowego.

Aby utworzyć tę klasę:

  1. Przejdź do utworzonego wcześniej folderu Skrypty .

  2. Kliknij prawym przyciskiem myszy w folderze Utwórz>skrypt języka C#. Wywołaj skrypt ShapeFactory.

  3. Kliknij dwukrotnie nowy skrypt ShapeFactory , aby otworzyć go za pomocą programu Visual Studio.

  4. Upewnij się, że klasa ShapeFactory zawiera następujące przestrzenie nazw:

        using System.Collections.Generic;
        using UnityEngine;
    
  5. Dodaj zmienne przedstawione poniżej do klasy ShapeFactory i zastąp funkcje Start() i Awake() poniższymi funkcjami:

        /// <summary>
        /// Provide this class Singleton-like behaviour
        /// </summary>
        [HideInInspector]
        public static ShapeFactory instance;
    
        /// <summary>
        /// Provides an Inspector exposed reference to ShapeSpawnPoint
        /// </summary>
        [SerializeField]
        public Transform spawnPoint;
    
        /// <summary>
        /// Shape History Index
        /// </summary>
        [HideInInspector]
        public List<int> shapeHistoryList;
    
        /// <summary>
        /// Shapes Enum for selecting required shape
        /// </summary>
        private enum Shapes { Cube, Sphere, Cylinder }
    
        private void Awake()
        {
            instance = this;
        }
    
        private void Start()
        {
            shapeHistoryList = new List<int>();
        }
    
  6. Metoda CreateShape() generuje kształty pierwotne na podstawie podanego parametru liczby całkowitej . Parametr logiczny służy do określania, czy aktualnie utworzony kształt pochodzi z magazynu, czy też nowego. Umieść następujący kod w klasie ShapeFactory poniżej poprzednich metod:

        /// <summary>
        /// Use the Shape Enum to spawn a new Primitive object in the scene
        /// </summary>
        /// <param name="shape">Enumerator Number for Shape</param>
        /// <param name="storageShape">Provides whether this is new or old</param>
        internal void CreateShape(int shape, bool storageSpace)
        {
            Shapes primitive = (Shapes)shape;
            GameObject newObject = null;
            string shapeText = storageSpace == true ? "Storage: " : "New: ";
    
            AzureServices.instance.azureStatusText.text = string.Format("{0}{1}", shapeText, primitive.ToString());
    
            switch (primitive)
            {
                case Shapes.Cube:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
                break;
    
                case Shapes.Sphere:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                break;
    
                case Shapes.Cylinder:
                newObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
                break;
            }
    
            if (newObject != null)
            {
                newObject.transform.position = spawnPoint.position;
    
                newObject.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
    
                newObject.AddComponent<Rigidbody>().useGravity = true;
    
                newObject.GetComponent<Renderer>().material.color = UnityEngine.Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
            }
        }
    
  7. Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.

  8. W edytorze aparatu Unity kliknij i przeciągnij klasę ShapeFactory z folderu Scripts do obiektu Main Camera w panelu hierarchii.

  9. Po wybraniu głównego aparatu zauważysz, że składnik skryptu ShapeFactory nie zawiera odwołania do punktu spawn . Aby rozwiązać ten problem, przeciągnij obiekt ShapeSpawnPoint z panelu hierarchii do obiektu docelowego odwołania do punktu spawn .

    ustawianie elementu docelowego odwołania do fabryki kształtów

Rozdział 9 . Tworzenie klasy Gaze

Ostatni skrypt, który należy utworzyć, to klasa Gaze .

Ta klasa jest odpowiedzialna za utworzenie raycastu , który będzie przewidywany do przodu z kamery głównej, aby wykryć, który obiekt patrzy użytkownik. W takim przypadku raycast będzie musiał określić, czy użytkownik patrzy na obiekt GazeButton w scenie i wyzwoli zachowanie.

Aby utworzyć tę klasę:

  1. Przejdź do utworzonego wcześniej folderu Skrypty .

  2. Kliknij prawym przyciskiem myszy panel projektu Utwórz>skrypt języka C#. Wywołaj spojrzenie skryptu.

  3. Kliknij dwukrotnie nowy skrypt gazecie , aby otworzyć go za pomocą programu Visual Studio.

  4. Upewnij się, że w górnej części skryptu znajduje się następująca przestrzeń nazw:

        using UnityEngine;
    
  5. Następnie dodaj następujące zmienne w klasie Gaze :

        /// <summary>
        /// Provides Singleton-like behavior to this class.
        /// </summary>
        public static Gaze instance;
    
        /// <summary>
        /// The Tag which the Gaze will use to interact with objects. Can also be set in editor.
        /// </summary>
        public string InteractibleTag = "GazeButton";
    
        /// <summary>
        /// The layer which will be detected by the Gaze ('~0' equals everything).
        /// </summary>
        public LayerMask LayerMask = ~0;
    
        /// <summary>
        /// The Max Distance the gaze should travel, if it has not hit anything.
        /// </summary>
        public float GazeMaxDistance = 300;
    
        /// <summary>
        /// The size of the cursor, which will be created.
        /// </summary>
        public Vector3 CursorSize = new Vector3(0.05f, 0.05f, 0.05f);
    
        /// <summary>
        /// The color of the cursor - can be set in editor.
        /// </summary>
        public Color CursorColour = Color.HSVToRGB(0.0223f, 0.7922f, 1.000f);
    
        /// <summary>
        /// Provides when the gaze is ready to start working (based upon whether
        /// Azure connects successfully).
        /// </summary>
        internal bool GazeEnabled = false;
    
        /// <summary>
        /// The currently focused object.
        /// </summary>
        internal GameObject FocusedObject { get; private set; }
    
        /// <summary>
        /// The object which was last focused on.
        /// </summary>
        internal GameObject _oldFocusedObject { get; private set; }
    
        /// <summary>
        /// The info taken from the last hit.
        /// </summary>
        internal RaycastHit HitInfo { get; private set; }
    
        /// <summary>
        /// The cursor object.
        /// </summary>
        internal GameObject Cursor { get; private set; }
    
        /// <summary>
        /// Provides whether the raycast has hit something.
        /// </summary>
        internal bool Hit { get; private set; }
    
        /// <summary>
        /// This will store the position which the ray last hit.
        /// </summary>
        internal Vector3 Position { get; private set; }
    
        /// <summary>
        /// This will store the normal, of the ray from its last hit.
        /// </summary>
        internal Vector3 Normal { get; private set; }
    
        /// <summary>
        /// The start point of the gaze ray cast.
        /// </summary>
        private Vector3 _gazeOrigin;
    
        /// <summary>
        /// The direction in which the gaze should be.
        /// </summary>
        private Vector3 _gazeDirection;
    

Ważne

Niektóre z tych zmiennych będą mogły być edytowane w edytorze.

  1. Teraz należy dodać kod dla metod Awake() i Start( ).

        /// <summary>
        /// The method used after initialization of the scene, though before Start().
        /// </summary>
        private void Awake()
        {
            // Set this class to behave similar to singleton
            instance = this;
        }
    
        /// <summary>
        /// Start method used upon initialization.
        /// </summary>
        private void Start()
        {
            FocusedObject = null;
            Cursor = CreateCursor();
        }
    
  2. Dodaj następujący kod, który spowoduje utworzenie obiektu kursora na początku wraz z metodą Update(), która uruchomi metodę Raycast, wraz z tym, że element logiczny GazeEnabled jest włączony:

        /// <summary>
        /// Method to create a cursor object.
        /// </summary>
        /// <returns></returns>
        private GameObject CreateCursor()
        {
            GameObject newCursor = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            newCursor.SetActive(false);
    
            // Remove the collider, so it doesn't block raycast.
            Destroy(newCursor.GetComponent<SphereCollider>());
            newCursor.transform.localScale = CursorSize;
    
            newCursor.GetComponent<MeshRenderer>().material = new Material(Shader.Find("Diffuse"))
            {
                color = CursorColour
            };
    
            newCursor.name = "Cursor";
    
            newCursor.SetActive(true);
    
            return newCursor;
        }
    
        /// <summary>
        /// Called every frame
        /// </summary>
        private void Update()
        {
            if(GazeEnabled == true)
            {
                _gazeOrigin = Camera.main.transform.position;
    
                _gazeDirection = Camera.main.transform.forward;
    
                UpdateRaycast();
            }
        }
    
  3. Następnie dodaj metodę UpdateRaycast(), która będzie wyświetlać raycast i wykrywać trafiony cel.

        private void UpdateRaycast()
        {
            // Set the old focused gameobject.
            _oldFocusedObject = FocusedObject;
    
            RaycastHit hitInfo;
    
            // Initialise Raycasting.
            Hit = Physics.Raycast(_gazeOrigin,
                _gazeDirection,
                out hitInfo,
                GazeMaxDistance, LayerMask);
    
            HitInfo = hitInfo;
    
            // Check whether raycast has hit.
            if (Hit == true)
            {
                Position = hitInfo.point;
    
                Normal = hitInfo.normal;
    
                // Check whether the hit has a collider.
                if (hitInfo.collider != null)
                {
                    // Set the focused object with what the user just looked at.
                    FocusedObject = hitInfo.collider.gameObject;
                }
                else
                {
                    // Object looked on is not valid, set focused gameobject to null.
                    FocusedObject = null;
                }
            }
            else
            {
                // No object looked upon, set focused gameobject to null.
                FocusedObject = null;
    
                // Provide default position for cursor.
                Position = _gazeOrigin + (_gazeDirection * GazeMaxDistance);
    
                // Provide a default normal.
                Normal = _gazeDirection;
            }
    
            // Lerp the cursor to the given position, which helps to stabilize the gaze.
            Cursor.transform.position = Vector3.Lerp(Cursor.transform.position, Position, 0.6f);
    
            // Check whether the previous focused object is this same 
            //    object. If so, reset the focused object.
            if (FocusedObject != _oldFocusedObject)
            {
                ResetFocusedObject();
    
                if (FocusedObject != null)
                {
                if (FocusedObject.CompareTag(InteractibleTag.ToString()))
                {
                        // Set the Focused object to green - success!
                        FocusedObject.GetComponent<Renderer>().material.color = Color.green;
    
                        // Start the Azure Function, to provide the next shape!
                        AzureServices.instance.CallAzureFunctionForNextShape();
                    }
                }
            }
        }
    
  4. Na koniec dodaj metodę ResetFocusedObject(), która przełączy bieżący kolor obiektów GazeButton, wskazując, czy tworzy nowy kształt, czy nie.

        /// <summary>
        /// Reset the old focused object, stop the gaze timer, and send data if it
        /// is greater than one.
        /// </summary>
        private void ResetFocusedObject()
        {
            // Ensure the old focused object is not null.
            if (_oldFocusedObject != null)
            {
                if (_oldFocusedObject.CompareTag(InteractibleTag.ToString()))
                {
                    // Set the old focused object to red - its original state.
                    _oldFocusedObject.GetComponent<Renderer>().material.color = Color.red;
                }
            }
        }
    
  5. Zapisz zmiany w programie Visual Studio przed powrotem do środowiska Unity.

  6. Kliknij i przeciągnij klasę Gaze z folderu Scripts do obiektu Main Camera w panelu hierarchii.

Rozdział 10 — kończenie klasy AzureServices

Po wykonaniu innych skryptów można teraz ukończyć klasę AzureServices . Zostanie to osiągnięte w następujący sposób:

  1. Dodanie nowej metody o nazwie CreateCloudIdentityAsync(), aby skonfigurować zmienne uwierzytelniania wymagane do komunikowania się z platformą Azure.

    Ta metoda sprawdzi również istnienie wcześniej przechowywanego pliku zawierającego listę kształtów.

    Jeśli plik zostanie znaleziony, spowoduje to wyłączenie uwierzytelniania użytkownika i wyzwolenie tworzenia kształtów zgodnie z wzorcem kształtów przechowywanych w pliku usługi Azure Storage. Użytkownik może to zobaczyć, ponieważ usługa Text Mesh będzie wyświetlać tekst "Storage" lub "New", w zależności od źródła kształtów.

    Jeśli plik nie zostanie znaleziony, włączy funkcję Gaze, umożliwiając użytkownikowi tworzenie kształtów podczas przeglądania obiektu GazeButton w scenie.

        /// <summary>
        /// Create the references necessary to log into Azure
        /// </summary>
        private async void CreateCloudIdentityAsync()
        {
            // Retrieve storage account information from connection string
            storageAccount = CloudStorageAccount.Parse(storageConnectionString);
    
            // Create a file client for interacting with the file service.
            fileClient = storageAccount.CreateCloudFileClient();
    
            // Create a share for organizing files and directories within the storage account.
            share = fileClient.GetShareReference(fileShare);
    
            await share.CreateIfNotExistsAsync();
    
            // Get a reference to the root directory of the share.
            CloudFileDirectory root = share.GetRootDirectoryReference();
    
            // Create a directory under the root directory
            dir = root.GetDirectoryReference(storageDirectory);
    
            await dir.CreateIfNotExistsAsync();
    
            //Check if the there is a stored text file containing the list
            shapeIndexCloudFile = dir.GetFileReference("TextShapeFile");
    
            if (!await shapeIndexCloudFile.ExistsAsync())
            {
                // File not found, enable gaze for shapes creation
                Gaze.instance.GazeEnabled = true;
    
                azureStatusText.text = "No Shape\nFile!";
            }
            else
            {
                // The file has been found, disable gaze and get the list from the file
                Gaze.instance.GazeEnabled = false;
    
                azureStatusText.text = "Shape File\nFound!";
    
                await ReplicateListFromAzureAsync();
            }
        }
    
  2. Następny fragment kodu pochodzi z metody Start(). gdzie zostanie wykonane wywołanie metody CreateCloudIdentityAsync(). Możesz skopiować bieżącą metodę Start() z poniższymi elementami:

        private void Start()
        {
            // Disable TLS cert checks only while in Unity Editor (until Unity adds support for TLS)
    #if UNITY_EDITOR
            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    #endif
    
            // Set the Status text to loading, whilst attempting connection to Azure.
            azureStatusText.text = "Loading...";
    
            //Creating the references necessary to log into Azure and check if the Storage Directory is empty
            CreateCloudIdentityAsync();
        }
    
  3. Wypełnij kod metody CallAzureFunctionForNextShape(). Do żądania indeksu kształtu użyjesz wcześniej utworzonej aplikacji funkcji platformy Azure . Po odebraniu nowego kształtu ta metoda wyśle kształt do klasy ShapeFactory , aby utworzyć nowy kształt w scenie. Użyj poniższego kodu, aby ukończyć treść funkcji CallAzureFunctionForNextShape().

        /// <summary>
        /// Call to the Azure Function App to request a Shape.
        /// </summary>
        public async void CallAzureFunctionForNextShape()
        {
            int azureRandomInt = 0;
    
            // Call Azure function
            HttpWebRequest webRequest = WebRequest.CreateHttp(azureFunctionEndpoint);
    
            WebResponse response = await webRequest.GetResponseAsync();
    
            // Read response as string
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream);
    
                String responseString = reader.ReadToEnd();
    
                //parse result as integer
                Int32.TryParse(responseString, out azureRandomInt);
            }
    
            //add random int from Azure to the ShapeIndexList
            ShapeFactory.instance.shapeHistoryList.Add(azureRandomInt);
    
            ShapeFactory.instance.CreateShape(azureRandomInt, false);
    
            //Save to Azure storage
            await UploadListToAzureAsync();
        }
    
  4. Dodaj metodę, aby utworzyć ciąg, łącząc liczby całkowite przechowywane na liście historii kształtów i zapisując go w pliku usługi Azure Storage.

        /// <summary>
        /// Upload the locally stored List to Azure
        /// </summary>
        private async Task UploadListToAzureAsync()
        {
            // Uploading a local file to the directory created above
            string listToString = string.Join(",", ShapeFactory.instance.shapeHistoryList.ToArray());
    
            await shapeIndexCloudFile.UploadTextAsync(listToString);
        }
    
  5. Dodaj metodę , aby pobrać tekst przechowywany w pliku znajdującym się w pliku usługi Azure Storage i deserializować go na liście.

  6. Po zakończeniu tego procesu metoda ponownie włącza spojrzenie, aby użytkownik mógł dodać więcej kształtów do sceny.

        ///<summary>
        /// Get the List stored in Azure and use the data retrieved to replicate 
        /// a Shape creation pattern
        ///</summary>
        private async Task ReplicateListFromAzureAsync()
        {
            string azureTextFileContent = await shapeIndexCloudFile.DownloadTextAsync();
    
            string[] shapes = azureTextFileContent.Split(new char[] { ',' });
    
            foreach (string shape in shapes)
            {
                int i;
    
                Int32.TryParse(shape.ToString(), out i);
    
                ShapeFactory.instance.shapeHistoryList.Add(i);
    
                ShapeFactory.instance.CreateShape(i, true);
    
                await Task.Delay(500);
            }
    
            Gaze.instance.GazeEnabled = true;
    
            azureStatusText.text = "Load Complete!";
        }
    
  7. Zapisz zmiany w programie Visual Studio przed powrotem do środowiska Unity.

Rozdział 11 — Tworzenie rozwiązania platformy UWP

Aby rozpocząć proces kompilacji:

  1. Przejdź dopozycji Ustawienia kompilacjipliku>.

    tworzenie aplikacji

  2. Kliknij pozycję Kompiluj. Aparat Unity uruchomi okno Eksplorator plików, w którym należy utworzyć, a następnie wybierz folder do skompilowania aplikacji. Utwórz ten folder teraz i nadaj mu nazwę Aplikacja. Następnie po wybraniu folderu Aplikacja naciśnij pozycję Wybierz folder.

  3. Aparat Unity rozpocznie kompilowanie projektu w folderze Aplikacja .

  4. Po zakończeniu kompilowania środowiska Unity (może to trochę potrwać), zostanie otwarte okno Eksplorator plików w lokalizacji kompilacji (sprawdź pasek zadań, ponieważ może nie zawsze pojawiać się nad oknami, ale powiadomi o dodaniu nowego okna).

Rozdział 12 — Wdrażanie aplikacji

Aby wdrożyć aplikację:

  1. Przejdź do folderu Aplikacji , który został utworzony w ostatnim rozdziale. Zostanie wyświetlony plik o nazwie aplikacji z rozszerzeniem ".sln", który należy kliknąć dwukrotnie, aby otworzyć go w programie Visual Studio.

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

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

    W przypadku Microsoft HoloLens można łatwiej ustawić tę opcję na Maszynę zdalną, aby nie być na tym komputerze. Należy jednak również wykonać następujące czynności:

    • Poznaj adres IP urządzenia HoloLens, który można znaleźć w obszarze Ustawienia>Sieć &opcje zaawansowane internetu >Wi-Fi>; adres IPv4 jest adresem, którego należy użyć.
    • Upewnij się, że tryb dewelopera jest włączony; znajduje się w temacie Ustawienia>Aktualizacja & Zabezpieczenia>dla deweloperów.

    wdrażanie rozwiązania

  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, gotowych do uruchomienia i przetestowania.

Zakończono Azure Functions i aplikację magazynu

Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta zarówno z usług Azure Functions, jak i Azure Storage. Aplikacja będzie mogła pobierać przechowywane dane i udostępniać akcję na podstawie tych danych.

końcowy produkt — koniec

Ćwiczenia dodatkowe

Ćwiczenie 1

Utwórz drugi punkt zduplikowania i rekord, na podstawie którego został utworzony punkt duplikowania obiektu. Po załadowaniu pliku danych należy odtworzyć kształty, które zostały zduplikowane z lokalizacji, w której zostały utworzone.

Ćwiczenie 2

Utwórz sposób ponownego uruchomienia aplikacji, zamiast konieczności ponownego otwierania jej za każdym razem. Ładowanie scen jest dobrym miejscem do rozpoczęcia. Następnie utwórz sposób na wyczyszczenie przechowywanej listy w usłudze Azure Storage, aby można było łatwo zresetować ją z aplikacji.