Urządzenia HoloLens (1. generacji) i Azure 308: powiadomienia między urządzeniami
Uwaga
Samouczki akademii rzeczywistości mieszanej zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji) i zestawach słuchawkowych immersyjnych rzeczywistości mieszanej. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków na 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 dla urządzenia 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ć urządzenia HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.
W tym kursie dowiesz się, jak dodać funkcje usługi Notification Hubs do aplikacji rzeczywistości mieszanej przy użyciu usług Azure Notification Hubs, Azure Tables i Azure Functions.
Azure Notification Hubs to usługa firmy Microsoft, która umożliwia deweloperom wysyłanie docelowych i spersonalizowanych powiadomień wypychanych do dowolnej platformy, które są obsługiwane w chmurze. Może to skutecznie umożliwić deweloperom komunikowanie się z użytkownikami końcowymi, a nawet komunikowanie się między różnymi aplikacjami w zależności od scenariusza. Aby uzyskać więcej informacji, odwiedź stronę usługi Azure Notification Hubs.
Azure Functions to usługa firmy Microsoft, która umożliwia deweloperom uruchamianie małych fragmentów kodu "functions" na platformie Azure. Dzięki temu można delegować pracę do chmury, a nie lokalną aplikację, co może mieć wiele korzyści. Usługa Azure Functions obsługuje kilka języków programowania, w tym C#, F#, Node.js, Java i PHP. Aby uzyskać więcej informacji, odwiedź stronę usługi Azure Functions.
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 oferuje bez schematu projekt, umożliwiając ewolucję tabel zgodnie z potrzebami, a tym samym jest bardzo elastyczna. Aby uzyskać więcej informacji, odwiedź stronę Tabele platformy Azure
Po ukończeniu tego kursu będziesz mieć aplikację immersywną rzeczywistości mieszanej oraz aplikację dla komputerów stacjonarnych, która będzie mogła wykonać następujące czynności:
Aplikacja komputerów stacjonarnych umożliwia użytkownikowi przenoszenie obiektu w obszarze 2D (X i Y) przy użyciu myszy.
Ruch obiektów w aplikacji komputera zostanie wysłany do chmury przy użyciu kodu JSON, który będzie w postaci ciągu zawierającego identyfikator obiektu, typ i informacje przekształcenia (współrzędne X i Y).
Aplikacja rzeczywistości mieszanej, która ma identyczną scenę dla aplikacji klasycznej, będzie otrzymywać powiadomienia dotyczące przenoszenia obiektów z usługi Notification Hubs (która właśnie została zaktualizowana przez aplikację komputerową).
Po otrzymaniu powiadomienia, które będzie zawierać identyfikator obiektu, typ i informacje dotyczące przekształcania, aplikacja rzeczywistości mieszanej zastosuje odebrane informacje do własnej sceny.
W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs został zaprojektowany, aby nauczyć cię, jak zintegrować usługę platformy Azure z projektem aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy uzyskanych z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej. Ten kurs jest samodzielnym samouczkiem, który nie obejmuje bezpośrednio żadnych innych laboratoriów rzeczywistości mieszanej.
Obsługa urządzeń
Kurs | HoloLens | Immersyjne zestawy nagłowne |
---|---|---|
MR i Azure 308: powiadomienia między urządzeniami | ✔️ | ✔️ |
Uwaga
Chociaż ten kurs koncentruje się głównie na zestawach nagłownych immersywnych windows Mixed Reality (VR), możesz również zastosować to, czego nauczysz się w tym kursie do urządzenia Microsoft HoloLens. Zgodnie z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być konieczne do zastosowania w celu obsługi urządzenia HoloLens. Podczas korzystania z urządzenia HoloLens można zauważyć echo podczas przechwytywania głosu.
Wymagania wstępne
Uwaga
Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Możesz bezpłatnie korzystać z najnowszego oprogramowania, jak wymieniono w artykule dotyczącym instalacji narzędzi , choć nie należy zakładać, że informacje zawarte 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:
- Komputer deweloperzy zgodny z windows Mixed Reality na potrzeby programowania immersyjnego zestawu słuchawkowego (VR)
- Windows 10 Fall Creators Update (lub nowszy) z włączonym trybem dewelopera
- Najnowszy zestaw SDK systemu Windows 10
- Unity 2017.4
- Visual Studio 2017
- Zestaw słuchawkowy windows Mixed Reality immersywny (VR) lub Microsoft HoloLens z włączonym trybem dewelopera
- Dostęp do Internetu dla konfiguracji platformy Azure i uzyskiwania dostępu do usługi Notification Hubs
Przed rozpoczęciem
- Aby uniknąć problemów podczas tworzenia tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
- Musisz być właścicielem portalu deweloperów firmy Microsoft i portalu rejestracji aplikacji. W przeciwnym razie nie będziesz mieć uprawnień dostępu do aplikacji w rozdziale 2.
Rozdział 1 . Tworzenie aplikacji w portalu deweloperów firmy Microsoft
Aby korzystać z usługi Azure Notification Hubs , należy utworzyć aplikację w portalu deweloperów firmy Microsoft, ponieważ aplikacja musi zostać zarejestrowana, aby mogła wysyłać i odbierać powiadomienia.
Zaloguj się do portalu deweloperów firmy Microsoft.
Musisz zalogować się do konta Microsoft.
Na pulpicie nawigacyjnym kliknij pozycję Utwórz nową aplikację.
Zostanie wyświetlone okno podręczne, w którym musisz 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.
Po utworzeniu aplikacji możesz przejść do następnego rozdziału.
Rozdział 2 . Pobieranie nowych poświadczeń aplikacji
Zaloguj się do portalu rejestracji aplikacji, w którym zostanie wyświetlona nowa aplikacja, i pobierz poświadczenia, które będą używane do konfigurowania usługi Notification Hubs w witrynie Azure Portal.
Przejdź do portalu rejestracji aplikacji.
Ostrzeżenie
Aby zalogować się, musisz użyć konta Microsoft.
Musi to być konto Microsoft, które zostało użyte w poprzednim rozdziale z portalem deweloperów Sklepu Windows.Aplikację znajdziesz w sekcji Moje aplikacje . Po jego znalezieniu kliknij i nastąpi przekierowanie do nowej strony z nazwą aplikacji i rejestracją.
Przewiń w dół stronę rejestracji, aby znaleźć sekcję Wpisy tajne aplikacji i identyfikator SID pakietu dla aplikacji. Skopiuj obie do użycia z konfigurowaniem usługi Azure Notification Hubs w następnym rozdziale.
Rozdział 3 — Konfigurowanie witryny Azure Portal: tworzenie usługi Notification Hubs
Po pobraniu poświadczeń aplikacji należy przejść do witryny Azure Portal, w której utworzysz usługę Azure Notification Hubs.
Zaloguj się do witryny Azure Portal.
Uwaga
Jeśli nie masz jeszcze konta platformy Azure, musisz je utworzyć. Jeśli obserwujesz ten samouczek w sytuacji w klasie lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc przy konfigurowaniu nowego konta.
Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Notification Hub, a następnie kliknij przycisk Enter.
Uwaga
Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.
Nowa strona zawiera opis usługi Notification Hubs . W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.
Po kliknięciu pozycji Utwórz:
Wstaw żądaną nazwę dla tego wystąpienia usługi.
Podaj przestrzeń nazw, którą będzie można skojarzyć z tą aplikacją.
Wybierz lokalizację.
Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.
Wybierz odpowiednią subskrypcję.
Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.
Wybierz pozycję Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi. Może to potrwać minutę.
Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.
Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowego wystąpienia usługi Notification Hub .
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 skonfigurowanej wcześniej.
Po skopiowaniu szczegółów do odpowiednich pól kliknij przycisk Zapisz i otrzymasz powiadomienie po pomyślnym zaktualizowaniu centrum powiadomień.
Rozdział 4 — Konfigurowanie witryny Azure Portal: tworzenie usługi Table Service
Po utworzeniu wystąpienia usługi Notification Hubs przejdź z powrotem do witryny Azure Portal, w której utworzysz usługę Azure Tables Service, tworząc zasób magazynu.
Jeśli jeszcze nie zalogowaliśmy się, zaloguj się do witryny Azure Portal.
Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Konto magazynu, a następnie kliknij Enter.
Uwaga
Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.
Wybierz pozycję Konto magazynu — obiekt blob, plik, tabela, kolejka z listy.
Nowa strona zawiera opis usługi konta magazynu. W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć wystąpienie tej usługi.
Po kliknięciu pozycji Utwórz zostanie wyświetlony panel:
Wstaw żądaną nazwę dla tego wystąpienia usługi (musi mieć wszystkie małe litery).
W obszarze Model wdrażania kliknij pozycję Resource Manager.
W polu Rodzaj konta, korzystając z menu rozwijanego, wybierz pozycję Magazyn (ogólnego przeznaczenia w wersji 1).
Wybierz odpowiednią lokalizację.
W menu rozwijanym Replikacja wybierz pozycję Read-access-geo-redundant storage (RA-GRS).
W obszarze Wydajność kliknij pozycję Standardowa.
W sekcji Wymagany bezpieczny transfer wybierz pozycję Wyłączone.
Z menu rozwijanego Subskrypcja wybierz odpowiednią subskrypcję.
Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.
Pozostaw opcję Sieci wirtualne jako Wyłączone , jeśli jest to opcja.
Kliknij pozycję Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi. Może to potrwać minutę.
Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie. Kliknij powiadomienia, aby zapoznać się z nowym wystąpieniem usługi.
Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowej strony przeglądu wystąpienia usługi Storage.
Na stronie przeglądu po prawej stronie kliknij pozycję Tabele.
Panel po prawej stronie zmieni się, aby wyświetlić informacje o usłudze Table Service , gdzie należy dodać nową tabelę. W tym celu kliknij + przycisk Tabela w lewym górnym rogu.
Zostanie wyświetlona nowa strona, w której należy wprowadzić nazwę tabeli. Jest to nazwa używana do odwoływania się do danych w aplikacji w kolejnych rozdziałach. Wstaw odpowiednią nazwę i kliknij przycisk OK.
Po utworzeniu nowej tabeli będzie można ją zobaczyć na stronie Usługi tabel (u dołu).
Rozdział 5 . Kończenie tabeli platformy Azure w programie Visual Studio
Teraz, gdy konto usługi Table Service Storage zostało skonfigurowane, nadszedł czas, aby dodać do niego dane, które będą używane do przechowywania i pobierania informacji. Edytowanie tabel można wykonać za pomocą programu Visual Studio.
Otwórz program Visual Studio.
W menu kliknij pozycję Wyświetl>Eksplorator chmury.
Eksplorator chmury zostanie otwarty jako zadokowany element (być cierpliwym, ponieważ ładowanie może zająć trochę czasu).
Uwaga
Jeśli subskrypcja użyta do utworzenia kont magazynu nie jest widoczna, upewnij się, że masz:
Zalogowano się na tym samym koncie co konto użyte w witrynie Azure Portal.
Wybierz subskrypcję na stronie zarządzania kontami (może być konieczne zastosowanie filtru z ustawień konta):
Zostaną wyświetlone usługi w chmurze platformy Azure. Znajdź pozycję Konta magazynu i kliknij strzałkę po lewej stronie, aby rozwinąć konta.
Po rozwinięciu nowo utworzone konto magazynu powinno być dostępne. Kliknij strzałkę po lewej stronie magazynu, a następnie po rozwinięciu znajdź pozycję Tabele i kliknij strzałkę obok tej pozycji, aby wyświetlić tabelę utworzoną w ostatnim rozdziale. Kliknij dwukrotnie tabelę.
Tabela zostanie otwarta w środku okna programu Visual Studio. Kliknij ikonę tabeli z ikoną + (plus) na niej.
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 są już podane wartości PartitionKey i RowKey , ponieważ są one używane przez tabelę do znajdowania danych.
Zaktualizuj wartość wartości PartitionKey i RowKey w następujący sposób (pamiętaj, aby to zrobić dla każdej dodawanej właściwości wiersza, choć zwiększa wartość RowKey za każdym razem):
Kliknij pozycję Dodaj właściwość , aby dodać dodatkowe wiersze danych. Utwórz pierwszą pustą tabelę zgodną z poniższą tabelą.
Po zakończeniu kliknij przycisk OK.
Ostrzeżenie
Upewnij się, że zmieniono typ pozycji X, Y i Z na Wartość Podwójna.
Zauważysz, że tabela zawiera teraz wiersz danych. Kliknij ponownie ikonę + (plus), aby dodać inną jednostkę.
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.
Powtórz ostatni krok, aby dodać inną jednostkę. Ustaw wartości dla tej jednostki na pokazane poniżej.
Tabela powinna teraz wyglądać podobnie do poniższej.
Ukończono ten rozdział. Pamiętaj, aby zapisać.
Rozdział 6 . Tworzenie aplikacji funkcji platformy Azure
Utwórz aplikację funkcji platformy Azure, która będzie wywoływana przez aplikację klasyczną 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 ładowanie potrzebnych bibliotek.
Otwórz Notatnik (naciśnij systemu Windows i wpisz Notatnik).
Po otwarciu Notatnika wstaw poniżej strukturę JSON. Po wykonaniu tej czynności zapisz go na pulpicie jako project.json. Ważne jest, aby nazewnictwo było poprawne: upewnij się , że nie ma .txt rozszerzenia pliku. Ten plik definiuje biblioteki, których będzie używać funkcja, jeśli użyto narzędzia 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" } } } }
Zaloguj się do Portalu Azure.
Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Aplikacja funkcji, naciśnij Enter.
Uwaga
Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.
Nowa strona zawiera opis usługi App Service funkcji. W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.
Po kliknięciu pozycji Utwórz wypełnij następujące informacje:
W polu Nazwa aplikacji wstaw żądaną nazwę dla tego wystąpienia usługi.
Wybierz subskrypcję.
Wybierz odpowiednią warstwę cenową , jeśli jest to pierwszy raz podczas tworzenia usługi App Service funkcji, warstwa bezpłatna powinna być dostępna dla Ciebie.
Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.
W przypadku systemu operacyjnego kliknij pozycję Windows, ponieważ jest to przeznaczona platforma.
Wybierz plan hostingu (w tym samouczku jest używany plan zużycia.
Wybierz lokalizację (wybierz tę samą lokalizację co magazyn, który został utworzony w poprzednim kroku)
W sekcji Magazyn musisz wybrać usługę magazynu utworzoną w poprzednim kroku.
Nie potrzebujesz usługi Application Insights w tej aplikacji, więc możesz pozostawić ją wyłączoną.
Kliknij pozycję Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać na utworzenie usługi, może to potrwać minutę.
Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.
Kliknij powiadomienia, aby zapoznać się z nowym wystąpieniem usługi.
Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi.
Kliknij ikonę + (plus) obok pozycji Funkcje, aby utworzyć nową.
W panelu centralnym zostanie wyświetlone okno Tworzenie funkcji . Zignoruj informacje w górnej części panelu, a następnie kliknij pozycję Funkcja niestandardowa znajdująca się w dolnej części (w niebieskim obszarze, jak pokazano poniżej).
Nowa strona w oknie będzie zawierać różne typy funkcji. Przewiń w dół, aby wyświetlić purpurowe typy, a następnie kliknij element HTTP PUT .
Ważne
Może być konieczne przewinięcie w dół strony (a ten obraz może nie wyglądać dokładnie tak samo, jeśli nastąpiły aktualizacje witryny Azure Portal), jednak szukasz elementu o nazwie HTTP PUT.
Zostanie wyświetlone okno HTTP PUT , w którym należy skonfigurować funkcję (zobacz poniżej, aby wyświetlić obraz).
W obszarze Język , korzystając z menu rozwijanego, wybierz pozycję C#.
W polu Nazwa wprowadź odpowiednią nazwę.
W menu rozwijanym Poziom uwierzytelniania wybierz pozycję Funkcja.
W sekcji Nazwa tabeli należy użyć dokładnej nazwy użytej do wcześniejszego utworzenia usługi Table Service (w tym tej samej litery).
W sekcji Połączenie konta magazynu użyj menu rozwijanego i wybierz konto magazynu. Jeśli tam nie ma, kliknij hiperlink Nowy obok tytułu sekcji, aby wyświetlić inny panel, w którym powinno być wyświetlane konto magazynu.
Kliknij przycisk Utwórz i otrzymasz powiadomienie o pomyślnym zaktualizowaniu ustawień.
Po kliknięciu przycisku Utwórz nastąpi przekierowanie do edytora funkcji.
Wstaw następujący kod do edytora funkcji (zastępując kod w funkcji):
#r "Microsoft.WindowsAzure.Storage" using System; using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Table; using Microsoft.Azure.NotificationHubs; using Newtonsoft.Json; public static async Task Run(UnityGameObject gameObj, CloudTable table, IAsyncCollector<Notification> notification, TraceWriter log) { //RowKey of the table object to be changed string rowKey = gameObj.RowKey; //Retrieve the table object by its RowKey TableOperation operation = TableOperation.Retrieve<UnityGameObject>("UnityPartitionKey", rowKey); TableResult result = table.Execute(operation); //Create a UnityGameObject so to set its parameters UnityGameObject existingGameObj = (UnityGameObject)result.Result; existingGameObj.RowKey = rowKey; existingGameObj.X = gameObj.X; existingGameObj.Y = gameObj.Y; existingGameObj.Z = gameObj.Z; //Replace the table appropriate table Entity with the value of the UnityGameObject operation = TableOperation.Replace(existingGameObj); table.Execute(operation); log.Verbose($"Updated object position"); //Serialize the UnityGameObject string wnsNotificationPayload = JsonConvert.SerializeObject(existingGameObj); log.Info($"{wnsNotificationPayload}"); var headers = new Dictionary<string, string>(); headers["X-WNS-Type"] = @"wns/raw"; //Send the raw notification to subscribed devices await notification.AddAsync(new WindowsNotification(wnsNotificationPayload, headers)); log.Verbose($"Sent notification"); } // This UnityGameObject represent a Table Entity public class UnityGameObject : TableEntity { public string Type { get; set; } public double X { get; set; } public double Y { get; set; } public double Z { get; set; } public string RowKey { get; set; } }
Uwaga
Korzystając z dołączonych bibliotek, funkcja odbiera nazwę i lokalizację obiektu, który został przeniesiony w scenie aparatu Unity (jako obiekt C#, o nazwie UnityGameObject). Ten obiekt jest następnie używany do aktualizowania parametrów obiektu w utworzonej tabeli. Po wykonaniu tej czynności funkcja wywołuje utworzoną usługę Notification Hub, która powiadamia wszystkie subskrybowane aplikacje.
Po kodzie kliknij przycisk Zapisz.
Następnie kliknij ikonę (strzałki < ) po prawej stronie strony.
Panel będzie przesuwał się z prawej strony. Na tym panelu kliknij pozycję Przekaż, a zostanie wyświetlona przeglądarka plików.
Przejdź do i kliknij plik project.json utworzony wcześniej w Notatniku, a następnie kliknij przycisk Otwórz. Ten plik definiuje biblioteki, których będzie używać funkcja.
Po przekazaniu pliku pojawi się on w panelu po prawej stronie. Kliknięcie go spowoduje otwarcie go w edytorze funkcji . Musi ona wyglądać dokładnie tak samo jak następnego obrazu (poniżej kroku 23).
Następnie w panelu po lewej stronie pod pozycją Funkcje kliknij link Integruj.
Na następnej stronie w prawym górnym rogu kliknij pozycję Edytor zaawansowany (jak pokazano poniżej).
Plik function.json zostanie otwarty w panelu środkowym, który musi zostać zastąpiony następującym fragmentem kodu. Definiuje ona kompilowaną funkcję i parametry przekazywane do funkcji.
{ "bindings": [ { "authLevel": "function", "type": "httpTrigger", "methods": [ "get", "post" ], "name": "gameObj", "direction": "in" }, { "type": "table", "name": "table", "tableName": "SceneObjectsTable", "connection": "mrnothubstorage_STORAGE", "direction": "in" }, { "type": "notificationHub", "direction": "out", "name": "notification", "hubName": "MR_NotHub_ServiceInstance", "connection": "MRNotHubNS_DefaultFullSharedAccessSignature_NH", "platform": "wns" } ] }
Edytor powinien teraz wyglądać podobnie do poniższego obrazu:
Możesz zauważyć, że właśnie wstawione parametry wejściowe mogą nie być zgodne ze szczegółami tabeli i magazynu, dlatego należy zaktualizować informacje. Nie rób tego tutaj, ponieważ jest on omówiony dalej. Kliknij link Edytor standardowy w prawym górnym rogu strony, aby wrócić.
W edytorze w warstwie Standardowa kliknij pozycję Azure Table Storage (tabela), w obszarze Dane wejściowe.
Upewnij się, że informacje są zgodne z następującymi informacjami, ponieważ mogą się one różnić (poniżej przedstawiono obraz poniżej następujących kroków):
Nazwa tabeli: nazwa tabeli utworzonej w usłudze Azure Storage, Tables.
Połączenie konta magazynu: kliknij przycisk nowy, który zostanie wyświetlony obok menu rozwijanego, a panel pojawi się po prawej stronie okna.
Wybierz konto magazynu utworzone wcześniej, aby hostować aplikacje funkcji.
Zauważysz, że utworzono wartość połączenia konta magazynu.
Pamiętaj, aby po zakończeniu nacisnąć przycisk Zapisz .
Strona Dane wejściowe powinna być teraz zgodna z poniższymi informacjami.
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 obraz poniżej następujących kroków):
Nazwa centrum powiadomień: jest to nazwa utworzonego wcześniej wystąpienia usługi Notification Hub .
Połączenie przestrzeni nazw usługi Notification Hubs: kliknij przycisk nowy, który zostanie wyświetlony obok menu rozwijanego.
Zostanie wyświetlone okno podręczne Połączenie (zobacz obraz poniżej), w którym należy wybrać przestrzeń nazw centrum powiadomień, która została wcześniej skonfigurowana.
Wybierz nazwę centrum powiadomień z środkowego menu rozwijanego.
Ustaw menu rozwijane Zasady na DefaultFullSharedAccessSignature.
Kliknij przycisk Wybierz, aby wrócić.
Strona Dane wyjściowe powinna być teraz zgodna z poniższymi informacjami, ale zamiast tego powinna zawierać informacje. Pamiętaj, aby nacisnąć przycisk Zapisz.
Ostrzeżenie
Nie edytuj bezpośrednio nazwy centrum powiadomień (wszystkie te czynności należy wykonać przy użyciu Edytor zaawansowany, pod warunkiem, że zostały wykonane poprzednie kroki poprawnie.
W tym momencie należy przetestować funkcję, aby upewnić się, że działa. Czynność:
Przejdź do strony funkcji jeszcze raz:
Po powrocie na stronę funkcji kliknij kartę Test po prawej stronie, aby otworzyć blok Test :
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 }
Po uruchomieniu kodu testowego kliknij przycisk Uruchom w prawym dolnym rogu, a test zostanie uruchomiony. Dzienniki wyjściowe testu zostaną wyświetlone w obszarze konsoli poniżej kodu funkcji.
Ostrzeżenie
Jeśli powyższy test zakończy się niepowodzeniem, należy dokładnie sprawdzić, czy wykonano powyższe kroki, szczególnie ustawienia w panelu integracji.
Rozdział 7 — Konfigurowanie projektu aparatu Unity dla komputerów stacjonarnych
Ważne
Aplikacja klasyczna, którą tworzysz, nie będzie działać w Edytorze aparatu Unity. Należy go uruchomić poza edytorem, postępując zgodnie z kompilacją aplikacji przy użyciu programu Visual Studio (lub wdrożonej aplikacji).
Poniżej przedstawiono typową konfigurację do opracowywania za pomocą aparatu Unity i rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.
Skonfiguruj i przetestuj immersywny zestaw słuchawkowy rzeczywistości mieszanej.
Uwaga
Na potrzeby tego kursu nie będzie wymagane kontrolery ruchu. Jeśli potrzebujesz obsługi konfigurowania immersyjnego zestawu słuchawkowego, skorzystaj z tego linku, aby dowiedzieć się, jak skonfigurować środowisko Windows Mixed Reality.
Otwórz aparat Unity i kliknij pozycję Nowy.
Musisz podać nazwę projektu aparatu Unity, wstawić obiekt UnityDesktopNotifHub. Upewnij się, że typ projektu jest ustawiony na 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.
Po otwarciu aparatu Unity warto sprawdzić, czy domyślny edytor skryptów jest 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.
Następnie przejdź do pozycji Ustawienia kompilacji pliku>i wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij przycisk Przełącz platformę, aby zastosować wybór.
Nadal w obszarze Ustawienia kompilacji pliku>upewnij się, że:
Urządzenie docelowe jest ustawione na dowolne urządzenie
Ta aplikacja będzie dla twojego pulpitu, więc musi być dowolne urządzenie
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Dla wersji programu Visual Studio jest ustawiona wartość Najnowsza zainstalowana
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
W tym miejscu warto zapisać scenę i dodać ją do kompilacji.
W tym celu wybierz pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
Utwórz nowy folder dla tego i dowolnej przyszłości sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.
Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz NH_Desktop_Scene, a następnie naciśnij przycisk Zapisz.
Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.
W tym samym oknie kliknij przycisk Ustawienia odtwarzacza, spowoduje to otwarcie powiązanego panelu w miejscu, w którym znajduje się inspektor .
W tym panelu należy zweryfikować kilka ustawień:
Na karcie Inne ustawienia:
Wersja środowiska uruchomieniowego skryptów powinna być eksperymentalna (odpowiednik platformy.NET 4.6)
Zaplecze skryptów powinno mieć wartość .NET
Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6
Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:
InternetClient
Po powrocie do ustawień kompilacji Projekty języka C# środowiska Unity nie są już wyszarzone; zaznacz pole wyboru obok tego.
Zamknij okno Build Settings (Ustawienia kompilacji).
Zapisz scenę i plik projektu >Zapisz scenę / Plik>Zapisz projekt.
Ważne
Jeśli chcesz pominąć składnik Konfiguracji aparatu Unity dla tego projektu (aplikacja klasyczna) i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 9. Nadal trzeba będzie dodać składniki skryptu.
Rozdział 8 . Importowanie bibliotek DLL w a unity
Będziesz używać usługi Azure Storage dla aparatu Unity (która korzysta z zestawu .Net SDK dla platformy Azure). Aby uzyskać więcej informacji, użyj tego linku dotyczącego usługi Azure Storage dla aparatu Unity.
Obecnie w środowisku 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 rozwiązaniu usterki.
Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage z usługi GitHub. Następnie wykonaj następujące czynności:
Dodaj pakiet unitypackage do aparatu Unity przy użyciu opcji menu Importuj pakiet > niestandardowy pakietu Assets>.
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.
Kliknij przycisk Importuj, aby dodać elementy do projektu.
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
Po wybraniu tych określonych wtyczek usuń zaznaczenie pola Wyboru Dowolna platforma i usuń zaznaczenie pola wyboru WSAPlayer, a następnie kliknij przycisk Zastosuj.
Uwaga
Oznaczamy te konkretne wtyczki do użycia tylko w edytorze aparatu Unity. Jest to spowodowane tym, że istnieją różne wersje tych samych wtyczek w folderze WSA, które będą używane po wyeksportowaniu projektu z aparatu Unity.
W folderze Wtyczka magazynu wybierz tylko:
Microsoft.Data.Services.Client
Zaznacz pole Nie przetwarzaj w obszarze Ustawienia platformy i kliknij przycisk Zastosuj.
Uwaga
Oznaczamy tę wtyczkę "Nie przetwarzaj", ponieważ patcher zestawu aparatu Unity ma trudności z przetwarzaniem tej wtyczki. Wtyczka będzie nadal działać, mimo że nie jest przetworzona.
Rozdział 9 . Tworzenie klasy TableToScene w projekcie aparatu Unity pulpitu
Teraz należy 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 obiekty do zduplikowania i w jakiej pozycji.
Drugi skrypt, który należy utworzyć, to CloudScene, który jest odpowiedzialny za:
- Zarejestrowanie zdarzenia kliknięcia po lewej stronie w celu umożliwienia użytkownikowi przeciągania obiektów wokół sceny.
- Serializowanie danych obiektu z tej sceny aparatu Unity i wysyłanie ich do aplikacji funkcji platformy Azure.
Aby utworzyć tę klasę:
Kliknij prawym przyciskiem myszy folder elementów zawartości znajdujący się w panelu projektu Utwórz>folder. Nadaj folderowi nazwę Scripts( Skrypty).
Kliknij dwukrotnie właśnie utworzony folder, aby go otworzyć.
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty), kliknij polecenie Create C# Script (Utwórz>skrypt języka C#). Nadaj skryptowi nazwę TableToScene.
Kliknij dwukrotnie skrypt, aby otworzyć go w programie Visual Studio 2017.
Dodaj następujące przestrzenie nazw:
using Microsoft.WindowsAzure.Storage; using Microsoft.WindowsAzure.Storage.Auth; using Microsoft.WindowsAzure.Storage.Table; using UnityEngine;
W klasie wstaw następujące zmienne:
/// <summary> /// allows this class to behave like a singleton /// </summary> public static TableToScene instance; /// <summary> /// Insert here you Azure Storage name /// </summary> private string accountName = " -- Insert your Azure Storage name -- "; /// <summary> /// Insert here you Azure Storage key /// </summary> private string accountKey = " -- Insert your Azure Storage key -- ";
Uwaga
Zastąp wartość accountName nazwą usługi Azure Storage i wartością accountKey wartością klucza znajdującą się w usłudze Azure Storage w witrynie Azure Portal (zobacz obraz poniżej).
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(); }
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); }
Poza klasą TableToScene należy zdefiniować klasę używaną przez aplikację do serializacji i deserializacji jednostek tabeli.
/// <summary> /// This objects is used to serialize and deserialize the Azure Table Entity /// </summary> [System.Serializable] public class AzureTableEntity : TableEntity { public AzureTableEntity(string partitionKey, string rowKey) : base(partitionKey, rowKey) { } public AzureTableEntity() { } public string Type { get; set; } public double X { get; set; } public double Y { get; set; } public double Z { get; set; } }
Przed powrotem do edytora aparatu Unity upewnij się, że polecenie Zapisz .
Kliknij kartę Main Camera (Aparat główny) z panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.
Po otwarciu folderu Scripts wybierz plik TableToScene skryptu i przeciągnij go do aparatu głównego. Wynik powinien być następujący:
Rozdział 10 — Tworzenie klasy CloudScene w projekcie aparatu Unity dla komputerów stacjonarnych
Drugi skrypt, który należy utworzyć, to CloudScene, który jest odpowiedzialny za:
Zarejestrowanie zdarzenia kliknięcia po lewej stronie w celu umożliwienia użytkownikowi przeciągania obiektów wokół sceny.
Serializowanie danych obiektu z tej sceny aparatu Unity i wysyłanie ich do aplikacji funkcji platformy Azure.
Aby utworzyć drugi skrypt:
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create (Utwórz), C# Script (Skrypt języka C#). Nadaj skryptowi nazwę CloudScene
Dodaj następujące przestrzenie nazw:
using Newtonsoft.Json; using System.Collections; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking;
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;
Zastąp wartość azureFunctionEndpoint adresem URL aplikacji funkcji platformy Azure znajdującym się w usłudze Azure Function App Service w witrynie Azure Portal, jak pokazano na poniższej ilustracji:
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(); }
W metodzie Update() dodaj następujący kod, który wykryje wprowadzanie i przeciąganie myszy, co z kolei spowoduje przeniesienie obiektów GameObjects w scenie. Jeśli użytkownik przeciągnął i porzucił obiekt, przekaże nazwę i współrzędne obiektu do metody UpdateCloudScene(), która wywoła usługę Azure Function App Service, która zaktualizuje tabelę platformy Azure i wyzwoli powiadomienie.
/// <summary> /// Update is called once per frame /// </summary> void Update() { //Enable Drag if button is held down if (Input.GetMouseButton(0)) { // Get the mouse position Vector3 mousePosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, 10); Vector3 objPos = Camera.main.ScreenToWorldPoint(mousePosition); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; // Raycast from the current mouse position to the object overlapped by the mouse if (Physics.Raycast(ray, out hit)) { // update the position of the object "hit" by the mouse hit.transform.position = objPos; gameObjHasMoved = true; gameObjHeld = hit.transform; } } // check if the left button mouse is released while holding an object if (Input.GetMouseButtonUp(0) && gameObjHasMoved) { gameObjHasMoved = false; // Call the Azure Function that will update the appropriate Entity in the Azure Table // and send a Notification to all subscribed Apps Debug.Log("Calling Azure Function"); StartCoroutine(UpdateCloudScene(gameObjHeld.name, gameObjHeld.position.x, gameObjHeld.position.y, gameObjHeld.position.z)); } }
Teraz dodaj metodę UpdateCloudScene(), jak pokazano poniżej:
private IEnumerator UpdateCloudScene(string objName, double xPos, double yPos, double zPos) { WWWForm form = new WWWForm(); // set the properties of the AzureTableEntity azureTableEntity.RowKey = objName; azureTableEntity.X = xPos; azureTableEntity.Y = yPos; azureTableEntity.Z = zPos; // Serialize the AzureTableEntity object to be sent to Azure string jsonObject = JsonConvert.SerializeObject(azureTableEntity); using (UnityWebRequest www = UnityWebRequest.Post(azureFunctionEndpoint, jsonObject)) { byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(jsonObject); www.uploadHandler = new UploadHandlerRaw(jsonToSend); www.uploadHandler.contentType = "application/json"; www.downloadHandler = new DownloadHandlerBuffer(); www.SetRequestHeader("Content-Type", "application/json"); yield return www.SendWebRequest(); string response = www.responseCode.ToString(); } }
Zapisz kod i wróć do aparatu Unity
Przeciągnij skrypt CloudScene na aparat główny.
Kliknij kartę Main Camera (Aparat główny) z panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.
Po otwarciu folderu Scripts wybierz skrypt CloudScene i przeciągnij go na aparat główny. Wynik powinien być następujący:
Rozdział 11 — Kompilowanie projektu klasycznego do platformy UWP
Wszystko, co jest potrzebne w sekcji aparatu Unity tego projektu, zostało ukończone.
Przejdź do obszaru Ustawienia kompilacji (ustawienia kompilacji pliku>).
W oknie Ustawienia kompilacji kliknij pozycję Kompiluj.
Zostanie wyświetlone okno Eksplorator plików z monitem o lokalizację kompilacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj mu nazwę BUILDS.
Otwórz nowy folder BUILDS i utwórz inny folder (ponownie użyj nowego folderu ) i nadaj mu nazwę NH_Desktop_App.
Po wybraniu NH_Desktop_App . kliknij pozycję Wybierz folder. Skompilowanie projektu potrwa minutę.
Po kompilacji zostanie wyświetlona Eksplorator plików z lokalizacją nowego projektu. Nie trzeba go jednak otwierać, ponieważ musisz najpierw utworzyć inny projekt aparatu Unity w kilku następnych rozdziałach.
Rozdział 12 — Konfigurowanie projektu aparatu Unity rzeczywistości mieszanej
Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.
Otwórz aparat Unity i kliknij pozycję Nowy.
Teraz musisz podać nazwę projektu aparatu Unity, wstawić aparat UnityMRNotifHub. Upewnij się, że typ projektu jest ustawiony na 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.
Po otwarciu aparatu Unity warto sprawdzić, czy domyślny edytor skryptów jest 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.
Następnie przejdź do pozycji Ustawienia kompilacji plików>i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.
Przejdź do pozycji Ustawienia kompilacji pliku>i upewnij się, że:
Urządzenie docelowe jest ustawione na dowolne urządzenie
W przypadku urządzenia Microsoft HoloLens ustaw wartość Urządzenie docelowe na HoloLens.
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Dla wersji programu Visual Studio jest ustawiona wartość Najnowsza zainstalowana
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
W tym miejscu warto zapisać scenę i dodać ją do kompilacji.
W tym celu wybierz pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
Utwórz nowy folder dla tego i dowolnej przyszłości sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.
Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz NH_MR_Scene, a następnie naciśnij przycisk Zapisz.
Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.
W tym samym oknie kliknij przycisk Ustawienia odtwarzacza, spowoduje to otwarcie powiązanego panelu w miejscu, w którym znajduje się inspektor .
W tym panelu należy zweryfikować kilka ustawień:
Na karcie Inne ustawienia:
Wersja środowiska uruchomieniowego skryptów powinna być eksperymentalna (odpowiednik platformy.NET 4.6)
Zaplecze skryptów powinno mieć wartość .NET
Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6
W dalszej części panelu w obszarze Ustawienia XR (znaleziono poniżej ustawień publikowania), zaznacz pole Virtual Reality Supported (Obsługiwane w rzeczywistości wirtualnej), upewnij się, że dodano zestaw WINDOWS Mixed Reality SDK
Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:
InternetClient
Po powrocie do ustawień kompilacji projekty języka C# aparatu Unity nie są już wyszarzone: zaznacz pole wyboru obok tego.
Po wykonaniu tych zmian zamknij okno Ustawienia kompilacji.
Zapisz scenę i plik projektu >Zapisz scenę / Plik>Zapisz projekt.
Ważne
Jeśli chcesz pominąć składnik Konfiguracji aparatu Unity dla tego projektu (aplikacja rzeczywistości mieszanej) i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 14. Nadal trzeba będzie dodać składniki skryptu.
Rozdział 13 . Importowanie bibliotek DLL w projekcie aparatu Unity rzeczywistości mieszanej
Będziesz używać biblioteki usługi Azure Storage dla aparatu Unity (która używa zestawu SDK platformy .Net dla platformy Azure). Skorzystaj z tego linku, aby dowiedzieć się, jak używać usługi Azure Storage z aparatem Unity. Obecnie w środowisku 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 rozwiązaniu usterki.
Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage. Następnie wykonaj następujące czynności:
Dodaj pakiet unitypackage pobrany z powyższych elementów do aparatu Unity przy użyciu opcji menu Importuj pakiet niestandardowy pakietu>Assets>.
W wyświetlonym oknie Importuj pakiet aparatu Unity możesz wybrać wszystko w obszarze Wtyczka>Storage.
Kliknij przycisk Importuj, aby dodać elementy do projektu.
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
Po wybraniu tych określonych wtyczek usuń zaznaczenie pola Wyboru Dowolna platforma i usuń zaznaczenie pola wyboru WSAPlayer, a następnie kliknij przycisk Zastosuj.
Uwaga
Oznaczasz te konkretne wtyczki, które mają być używane tylko w Edytorze aparatu Unity. Jest to spowodowane tym, że istnieją różne wersje tych samych wtyczek w folderze WSA, które będą używane po wyeksportowaniu projektu z aparatu Unity.
W folderze Wtyczka magazynu wybierz tylko:
Microsoft.Data.Services.Client
Zaznacz pole Nie przetwarzaj w obszarze Ustawienia platformy i kliknij przycisk Zastosuj.
Uwaga
Oznaczasz tę wtyczkę "Nie przetwarzaj", ponieważ patcher zestawu aparatu Unity ma trudności z przetwarzaniem tej wtyczki. Wtyczka będzie nadal działać, mimo że nie jest przetworzona.
Rozdział 14 — Tworzenie klasy TableToScene w projekcie aparatu Unity rzeczywistości mieszanej
Klasa TableToScene jest taka sama jak klasa wyjaśniona w rozdziale 9. Utwórz tę samą klasę w projekcie aparatu Unity rzeczywistości mieszanej, wykonując tę samą procedurę opisaną w rozdziale 9.
Po ukończeniu tego rozdziału obie projekty aparatu Unity będą miały tę klasę skonfigurowaną w aparacie głównym.
Rozdział 15 . Tworzenie klasy NotificationReceiver w projekcie aparatu Unity rzeczywistości mieszanej
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ń.
- Deserializowanie danych obiektu z odebranych powiadomień.
- Przenieś obiekty GameObjects w scenie na podstawie zdeserializowanych danych.
Aby utworzyć skrypt NotificationReceiver :
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij polecenie Create (Utwórz), C# Script (Skrypt języka C#). Nadaj skryptowi nazwę NotificationReceiver.
Kliknij dwukrotnie skrypt, aby go otworzyć.
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
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-";
Zastąp wartość hubName nazwą usługi Notification Hub i wartością hubListenEndpoint wartością punktu końcowego znajdującą się na karcie Zasady dostępu, usługą Azure Notification Hub w witrynie Azure Portal (zobacz obraz poniżej).
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()); }
Dodaj metodę WaitForNotification , aby umożliwić aplikacji odbieranie powiadomień z biblioteki centrum powiadomień bez starcia z wątkiem głównym:
/// <summary> /// This notification listener is necessary to avoid clashes /// between the notification hub and the main thread /// </summary> private IEnumerator WaitForNotification() { while (true) { // Checks for notifications each second yield return new WaitForSeconds(1f); if (notifReceived) { // If a notification is arrived, moved the appropriate object to the new position GameObject.Find(gameObjectName).transform.position = newObjPosition; // Reset the flag notifReceived = false; } } }
Poniższa metoda, InitNotificationAsync(), zarejestruje aplikację w usłudze notification Hub podczas inicjowania. Kod jest komentowany, ponieważ aparat Unity nie będzie mógł skompilować projektu. Komentarze zostaną usunięte podczas importowania pakietu NuGet usługi Azure Messaging w programie 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; // } }
Następująca procedura obsługi, Channel_PushNotificationReceived(), zostanie wyzwolona za każdym razem, gdy zostanie odebrane powiadomienie. Spowoduje to deserializacji powiadomienia, które będzie jednostką tabeli platformy Azure przeniesioną w aplikacji klasycznej, a następnie przenieś odpowiedni obiekt GameObject w scenie mr do tej samej pozycji.
Ważne
Kod jest komentowany, ponieważ kod odwołuje się do biblioteki Azure Messaging, którą dodasz po utworzeniu projektu aparatu Unity przy użyciu Menedżer pakietów Nuget w programie Visual Studio. W związku z tym projekt aparatu Unity nie będzie mógł skompilować, chyba że zostanie on skomentowany. Należy pamiętać, że jeśli utworzysz projekt, a następnie chcesz powrócić do środowiska Unity, musisz ponownie oznaczyć ten kod jako komentarz .
///// <summary> ///// Handler called when a Push Notification is received ///// </summary> //private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) //{ // Debug.Log("New Push Notification Received"); // // if (args.NotificationType == PushNotificationType.Raw) // { // // Raw content of the Notification // string jsonContent = args.RawNotification.Content; // // // Deserialise the Raw content into an AzureTableEntity object // AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent); // // // The name of the Game Object to be moved // gameObjectName = ate.RowKey; // // // The position where the Game Object has to be moved // newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z); // // // Flag thats a notification has been received // notifReceived = true; // } //}
Pamiętaj, aby zapisać zmiany przed powrotem do edytora aparatu Unity.
Kliknij kartę Main Camera (Aparat główny) z panelu Hierarchy (Hierarchia), aby jego właściwości pojawiały się w inspektorze.
Po otwarciu folderu Scripts wybierz skrypt NotificationReceiver i przeciągnij go do aparatu głównego. Wynik powinien być następujący:
Uwaga
Jeśli opracowujesz tę aplikację dla urządzenia Microsoft HoloLens, musisz zaktualizować składnik Aparat główny aparatu fotograficznego, aby:
- Wyczyść flagi: kolor stały
- Tło:
Rozdział 16 . Tworzenie projektu rzeczywistości mieszanej na platformie UWP
Ten rozdział jest identyczny z procesem kompilacji dla poprzedniego projektu. Wszystko, co jest potrzebne w sekcji aparatu Unity tego projektu, zostało ukończone, więc nadszedł czas, aby skompilować go z poziomu aparatu Unity.
Przejdź do obszaru Ustawienia kompilacji (Ustawienia kompilacji pliku>).
W menu Ustawienia kompilacji upewnij się, że zaznaczono znacznik Projekty języka C# aparatu Unity * (co umożliwi edytowanie skryptów w tym projekcie po kompilacji).
Po zakończeniu kliknij pozycję Kompiluj.
Zostanie wyświetlone okno Eksplorator plików z monitem o lokalizację kompilacji. Utwórz nowy folder (klikając pozycję Nowy folder w lewym górnym rogu) i nadaj mu nazwę BUILDS.
Otwórz nowy folder BUILDS i utwórz kolejny folder (ponownie użyj nowego folderu ) i nadaj mu nazwę NH_MR_App.
Po wybraniu NH_MR_App . kliknij pozycję Wybierz folder. Skompilowanie projektu potrwa minutę.
Po kompilacji zostanie otwarte okno Eksplorator plików w lokalizacji nowego projektu.
Rozdział 17 — Dodawanie pakietów NuGet do rozwiązania UnityMRNotifHub
Ostrzeżenie
Pamiętaj, że po dodaniu następujących pakietów NuGet (i usunięciu komentarza z kodu w następnym rozdziale) kod, po ponownym otwarciu w projekcie aparatu Unity, będą przedstawiać błędy. Jeśli chcesz wrócić i kontynuować edycję w Edytorze aparatu Unity, musisz dodać komentarz do błędnego kodu, a następnie ponownie usunąć komentarz później, gdy wrócisz do programu Visual Studio.
Po zakończeniu kompilacji rzeczywistości mieszanej przejdź do utworzonego projektu rzeczywistości mieszanej, a następnie kliknij dwukrotnie plik rozwiązania (.sln) w tym folderze, aby otworzyć rozwiązanie za pomocą programu Visual Studio 2017. Teraz należy dodać pakiet NuGet WindowsAzure.Messaging.managed . Jest to biblioteka używana do odbierania powiadomień z centrum powiadomień.
Aby zaimportować pakiet NuGet:
W Eksplorator rozwiązań kliknij prawym przyciskiem myszy rozwiązanie
Kliknij pozycję Zarządzaj pakietami NuGet.
Wybierz kartę Przeglądaj i wyszukaj ciąg WindowsAzure.Messaging.managed.
Wybierz wynik (jak pokazano poniżej), a w oknie po prawej stronie zaznacz pole wyboru obok pozycji Project. Spowoduje to umieszczenie znacznika w polu wyboru obok pozycji Project wraz z polem wyboru obok projektu Assembly-CSharp i UnityMRNotifHub .
Początkowo podana wersja może nie być zgodna z tym projektem. W związku z tym kliknij menu rozwijane obok pozycji Wersja, a następnie kliknij pozycję Wersja 0.1.7.9, a następnie kliknij przycisk Zainstaluj.
Zakończono instalowanie pakietu NuGet. Znajdź skomentowany kod wprowadzony w klasie NotificationReceiver i usuń komentarze.
Rozdział 18 — Edytowanie aplikacji UnityMRNotifHub, klasy NotificationReceiver
Po dodaniu pakietów NuGet należy usunąć komentarz z kodu w klasie NotificationReceiver .
Obejmuje to:
Przestrzeń nazw u góry:
using Microsoft.WindowsAzure.Messaging;
Cały kod w metodzie InitNotificationsAsync():
/// <summary> /// Register this application to the Notification Hub Service /// </summary> private async void InitNotificationsAsync() { PushNotificationChannel channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); NotificationHub hub = new NotificationHub(hubName, hubListenEndpoint); Registration result = await hub.RegisterNativeAsync(channel.Uri); // If registration was successful, subscribe to Push Notifications if (result.RegistrationId != null) { Debug.Log($"Registration Successful: {result.RegistrationId}"); channel.PushNotificationReceived += Channel_PushNotificationReceived; } }
Ostrzeżenie
Powyższy kod zawiera komentarz: upewnij się, że komentarz nie został przypadkowo usunięty z komentarza (ponieważ kod nie zostanie skompilowany , jeśli masz!).
I wreszcie zdarzenie Channel_PushNotificationReceived :
/// <summary> /// Handler called when a Push Notification is received /// </summary> private void Channel_PushNotificationReceived(PushNotificationChannel sender, PushNotificationReceivedEventArgs args) { Debug.Log("New Push Notification Received"); if (args.NotificationType == PushNotificationType.Raw) { // Raw content of the Notification string jsonContent = args.RawNotification.Content; // Deserialize the Raw content into an AzureTableEntity object AzureTableEntity ate = JsonConvert.DeserializeObject<AzureTableEntity>(jsonContent); // The name of the Game Object to be moved gameObjectName = ate.RowKey; // The position where the Game Object has to be moved newObjPosition = new Vector3((float)ate.X, (float)ate.Y, (float)ate.Z); // Flag thats a notification has been received notifReceived = true; } }
Po wybraniu tych komentarzów upewnij się, że zapiszesz, a następnie przejdź do następnego rozdziału.
Rozdział 19 — Kojarzenie projektu rzeczywistości mieszanej z aplikacją ze Sklepu
Teraz musisz skojarzyć projekt rzeczywistości mieszanej z aplikacją ze sklepu utworzoną na początku laboratorium.
Otwórz rozwiązanie.
Kliknij prawym przyciskiem myszy projekt aplikacji platformy UWP w panelu Eksplorator rozwiązań, przejdź do sklepu i skojarz aplikację ze Sklepem....
Zostanie wyświetlone nowe okno o nazwie Kojarzenie aplikacji ze Sklepem Windows. Kliknij przycisk Dalej.
Spowoduje to załadowanie wszystkich aplikacji skojarzonych z kontem, w którym się zalogowano. Jeśli nie zalogowano się na koncie, możesz zalogować się na tej stronie.
Znajdź nazwę aplikacji ze sklepu utworzoną na początku tego samouczka i wybierz ją. Następnie kliknij przycisk Dalej.
Kliknij pozycję Skojarz.
Aplikacja jest teraz skojarzona z aplikacją ze sklepu. Jest to konieczne w przypadku włączania powiadomień.
Rozdział 20 — Wdrażanie aplikacji UnityMRNotifHub i UnityDesktopNotifHub
Ten rozdział może być łatwiejszy w przypadku dwóch osób, ponieważ w rezultacie zostaną uruchomione obie aplikacje, jedna uruchomiona na komputerze, a druga w zestawie słuchawkowym immersywnym.
Immersywna aplikacja zestawu słuchawkowego oczekuje na odebranie zmian w scenie (zmiany pozycji lokalnych obiektów GameObjects), a aplikacja klasyczna wprowadza zmiany w ich lokalnej scenie (zmiany pozycji), które zostaną udostępnione aplikacji MR. Najpierw należy wdrożyć aplikację MR, a następnie aplikację klasyczną, aby odbiornik mógł rozpocząć nasłuchiwanie.
Aby wdrożyć aplikację UnityMRNotifHub na komputerze lokalnym:
Otwórz plik rozwiązania aplikacji UnityMRNotifHub w programie Visual Studio 2017.
W polu Platforma rozwiązania wybierz pozycję x86, Komputer lokalny.
W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.
Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie, aby załadować aplikację bezpośrednio na maszynę.
Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji gotowych do uruchomienia.
Aby wdrożyć aplikację UnityDesktopNotifHub na komputerze lokalnym:
Otwórz plik rozwiązania aplikacji UnityDesktopNotifHub w programie Visual Studio 2017.
W polu Platforma rozwiązania wybierz pozycję x86, Komputer lokalny.
W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.
Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie, aby załadować aplikację bezpośrednio na maszynę.
Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji gotowych do uruchomienia.
Uruchom aplikację rzeczywistości mieszanej, a następnie aplikację klasyczną.
Po uruchomieniu obu aplikacji przenieś obiekt na scenie pulpitu (przy użyciu przycisku Lewa mysz). Te zmiany pozycyjne zostaną wprowadzone lokalnie, serializowane i wysyłane do usługi App Service funkcji. Następnie usługa App Service funkcji zaktualizuje tabelę wraz z centrum powiadomień. Po otrzymaniu aktualizacji centrum powiadomień wyśle zaktualizowane dane bezpośrednio do wszystkich zarejestrowanych aplikacji (w tym przypadku aplikacji immersyjnego zestawu słuchawkowego), która następnie zdeserializuje dane przychodzące i zastosuje nowe dane pozycyjne do obiektów lokalnych, przenosząc je w scenę.
Ukończono aplikację usługi Azure Notification Hubs
Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z usługi Azure Notification Hubs i umożliwia komunikację między aplikacjami.
Ćwiczenia dodatkowe
Ćwiczenie 1
Czy możesz wypracować, jak zmienić kolor obiektów GameObjects i wysłać to powiadomienie do innych aplikacji wyświetlających scenę?
Ćwiczenie 2
Czy możesz dodać ruch obiektów GameObjects do aplikacji MR i zobaczyć zaktualizowaną scenę w aplikacji klasycznej?