Urządzenia HoloLens (1. gen) i Azure 308: powiadomienia między urządzeniami
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.
W tym kursie dowiesz się, jak dodać funkcje usługi Notification Hubs do aplikacji rzeczywistości mieszanej przy użyciu usługi Azure Notification Hubs, tabel platformy Azure 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, wszystkie 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. 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ź stronę 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 jest łatwo dostępna w dowolnym miejscu. Usługa oferuje bez schematowy projekt, co pozwala na 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ą zestawu słuchawkowego rzeczywistości mieszanej oraz aplikację klasyczną, która będzie mogła wykonać następujące czynności:
Aplikacja komputerów stacjonarnych umożliwi użytkownikowi przeniesienie obiektu w przestrzeń 2D (X i Y) przy użyciu myszy.
Ruch obiektów w aplikacji komputera zostanie wysłany do chmury przy użyciu formatu JSON, który będzie w postaci ciągu zawierającego identyfikator obiektu, typ i informacje o przekształcaniu (współrzędne X i Y).
Aplikacja rzeczywistości mieszanej, która ma identyczną scenę z aplikacją klasyczną, otrzyma powiadomienia dotyczące przenoszenia obiektów z usługi Notification Hubs (która została właśnie zaktualizowana przez aplikację komputerów stacjonarnych).
Po otrzymaniu powiadomienia, które będzie zawierać identyfikator obiektu, typ i informacje o przekształcaniu, 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 Mixed Reality Labs.
Obsługa urządzeń
Kurs | HoloLens | Immersyjne zestawy słuchawkowe |
---|---|---|
MR i Azure 308: powiadomienia między urządzeniami | ✔️ | ✔️ |
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. 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 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:
- Komputer deweloperskich, zgodny z Windows Mixed Reality do opracowywania immersyjnych zestawów słuchawkowych (VR)
- Windows 10 Fall Creators Update (lub nowszy) z włączonym trybem dewelopera
- Najnowszy zestaw SDK Windows 10
- Unity 2017.4
- Visual Studio 2017
- Zestaw słuchawkowy Windows Mixed Reality immersyjny (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 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).
- 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 , musisz 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 wyskakujące okienko, w którym musisz zarezerwować nazwę nowej aplikacji. W polu tekstowym wstaw odpowiednią nazwę; jeśli wybrana nazwa jest dostępna, znacznik pojawi się po prawej stronie pola tekstowego. Po wstawieniu dostępnej nazwy kliknij przycisk Rezerwuj nazwę produktu w lewym dolnym rogu wyskakującego okienka.
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
Musisz użyć konta Microsoft do logowania.
Musi to być konto Microsoft, które zostało użyte w poprzednim rozdziale z portalem deweloperów sklepu Windows Store.Aplikację znajdziesz w sekcji Moje aplikacje . Po znalezieniu kliknij ją i nastąpi przekierowanie do nowej strony, na której znajduje się nazwa aplikacji i rejestracja.
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 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.
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ę przechowywanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.
Wybierz odpowiednią subskrypcję.
Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.
Wybierz przycisk Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać, aż usługa zostanie utworzona, 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 skonfigurowanej wcześniej aplikacji.
Po skopiowaniu szczegółów do poprawnych pól kliknij przycisk Zapisz i otrzymasz powiadomienie o 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 przycisk 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ę przechowywanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.
Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, skorzystaj z tego linku, aby dowiedzieć się, jak zarządzać grupą zasobów.
Pozostaw pozycję Sieci wirtualnejako Wyłączone , jeśli jest to opcja dla Ciebie.
Kliknij pozycję Utwórz.
Po kliknięciu pozycji Utwórz trzeba będzie poczekać, aż usługa zostanie utworzona, 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ę. Zrób to, klikając + 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 pośrednictwem programu Visual Studio.
Otwórz program Visual Studio.
W menu kliknij pozycję Wyświetl>Eksploratora chmury.
Eksplorator chmury otworzy się 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ę do tego samego konta co użyte w witrynie Azure Portal.
Wybrano subskrypcję ze strony zarządzania kontami (może być konieczne zastosowanie filtru z ustawień konta):
Zostaną wyświetlone usługi w chmurze platformy Azure. Znajdź 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ź 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 w sumie trzy jednostki, z których każda ma kilka właściwości. Zauważysz, że są już podane wartości PartitionKey i RowKey , ponieważ są one używane przez tabelę do znajdowania danych.
Zaktualizuj wartość elementu PartitionKey i RowKey w następujący sposób (pamiętaj, aby to zrobić dla każdej dodawanej właściwości wiersza, choć 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.
Zobaczysz, że tabela ma 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ć kolejną 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 o zapisaniu.
Rozdział 6 — Tworzenie aplikacji funkcji platformy Azure
Utwórz aplikację funkcji platformy Azure, która zostanie wywołana 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 klawisz systemu Windows i wpisz Notatnik).
Po otwarciu Notatnika wstaw poniżej strukturę JSON. Po wykonaniu tej czynności zapisz go na pulpicie jako plik 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 witryny Azure Portal.
Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Aplikacja funkcji, naciśnij klawisz 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 warstwę cenową odpowiednią dla Ciebie, jeśli jest to pierwszy raz podczas tworzenia 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 utworzony w poprzednim kroku)
W sekcji Magazynmusisz 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ć fioletowe typy, a następnie kliknij pozycję 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 miały miejsce 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 zapoznać się z obrazem).
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 musisz 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. W tym celu funkcja wywołuje utworzoną usługę Notification Hub, która powiadamia wszystkie subskrybowane aplikacje.
Po kodzie kliknij przycisk Zapisz.
Następnie kliknij ikonę < (strzałka) 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 pliku project.json utworzonego wcześniej w Notatniku i kliknij go, a następnie kliknij przycisk Otwórz . Ten plik definiuje biblioteki, których będzie używać funkcja.
Po przekazaniu pliku zostanie on wyświetlony w panelu po prawej stronie. Kliknięcie go spowoduje otwarcie go w edytorze funkcji . Musi ona wyglądać dokładnie tak samo jak na następnym obrazie (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 należy zastąpić poniższym fragmentem kodu. Definiuje 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 wstawione parametry wejściowe mogą nie być zgodne ze szczegółami tabeli i magazynu, dlatego należy je zaktualizować przy użyciu informacji. Nie rób tego tutaj, ponieważ zostanie omówiony w następnej kolejności. 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 znajduje się 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 pojawi się obok menu rozwijanego, a panel pojawi się po prawej stronie okna.
Wybierz konto magazynu utworzone wcześniej do hostowania aplikacji 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 informacje są zgodne z następującymi informacjami, 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 pojawi się obok menu rozwijanego.
Zostanie wyświetlone okno podręczne Połączenie (zobacz obraz poniżej), w którym musisz wybrać przestrzeń nazwcentrum powiadomień, która została skonfigurowana wcześniej.
Wybierz nazwę centrum powiadomień z środkowego menu rozwijanego.
Ustaw menu rozwijane Zasady na Wartość DefaultFullSharedAccessSignature.
Kliknij przycisk Wybierz , aby wrócić.
Strona Dane wyjściowe powinna teraz być zgodna z poniższymi informacjami, ale z informacjami . Pamiętaj, aby nacisnąć przycisk Zapisz.
Ostrzeżenie
Nie edytuj nazwy centrum powiadomień bezpośrednio (należy to zrobić przy użyciu Edytor zaawansowany, pod warunkiem, że wykonano poprzednie kroki prawidłowo.
W tym momencie należy przetestować funkcję, aby upewnić się, że działa. W tym celu:
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ą teraz tworzysz, nie będzie działać w Edytorze aparatu Unity. Należy go uruchomić poza edytorem, po utworzeniu 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 pomocy technicznej dotyczącej konfigurowania immersyjnego zestawu słuchawkowego, skorzystaj z tego linku, aby dowiedzieć się, jak skonfigurować Windows Mixed Reality.
Otwórz aparat Unity i kliknij pozycję Nowy.
Musisz podać nazwę projektu aparatu Unity, wstawić element UnityDesktopNotifHub. Upewnij się, że typ projektu ma ustawioną wartość 3D. Ustaw lokalizację na odpowiednią dla Ciebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.
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 .
Następnie przejdź dopozycji Ustawienia kompilacjiplików> i wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij przycisk Przełącz platformę, aby zastosować wybór.
Nadal wobszarze Ustawienia kompilacjipliku> upewnij się, że:
Urządzenie docelowe jest ustawione na dowolne urządzenie
Ta aplikacja będzie przeznaczona dla komputera, więc musi być dowolne urządzenie
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Wersja programu Visual Studio jest ustawiona na najnowszą zainstalowaną
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
W tym miejscu warto zapisać scenę i dodać ją do kompilacji.
Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
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.
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 przestrzeni, w której 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
W obszarze Ustawienia kompilacjiProjekty aparatu Unity C# nie są już wyszarzone; zaznacz pole wyboru obok tego.
Zamknij okno Build Settings (Ustawienia kompilacji).
Zapisz scenę i plik> projektuZapisz 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 środowisku Unity
Będziesz używać usługi Azure Storage dla środowiska Unity (która korzysta z zestawu .Net SDK dla platformy Azure). Aby uzyskać więcej informacji, postępuj zgodnie z tym linkiem dotyczącym usługi Azure Storage for Unity.
Obecnie istnieje znany problem w środowisku Unity, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (4–7 w tej sekcji) nie będą już wymagane po rozwiązaniu usterki.
Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage z 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 Projekt 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 wtyczekusuń zaznaczenie pola wyboru Dowolna platforma i usuń zaznaczenie pola wyboruWSAPlayer, a następnie kliknij przycisk Zastosuj.
Uwaga
Oznaczamy 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 następujące opcje:
Microsoft.Data.Services.Client
Zaznacz pole Nie przetwarzaj w obszarze Ustawienia platformy i kliknij przycisk Zastosuj.
Uwaga
Oznaczamy tę wtyczkę "Nie przetwarzaj", ponieważ poprawka zestawu aparatu Unity ma trudności z przetwarzaniem tej wtyczki. Wtyczka będzie nadal działać, mimo że nie jest przetwarzana.
Rozdział 9 — Tworzenie klasy TableToScene w projekcie aparatu Unity dla komputerów stacjonarnych
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), a następnie kliknij polecenie CreateC# 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 kamerę główną z panelu 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 App Service funkcji platformy Azure 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 myszą, co z kolei spowoduje przeniesienie obiektów GameObject w scenie. Jeśli użytkownik przeciągnął i upuścił obiekt, przekaże nazwę i współrzędne obiektu do metody UpdateCloudScene(), która wywoła usługę 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 kamerę główną z panelu Hierarchia , aby jego właściwości pojawiały się w inspektorze.
Po otwarciu folderu Scripts (Skrypty ) wybierz skrypt CloudScene i przeciągnij go do głównego aparatu fotograficznego. 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 pozycji Ustawienia kompilacji (ustawienia kompilacjipliku>).
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 kolejny folder (przy użyciu nowego folderu po raz kolejny) i nadaj mu nazwę NH_Desktop_App.
Po wybraniu NH_Desktop_App . kliknij pozycję Wybierz folder. Kompilacja projektu może potrwać kilka minut.
Po zakończeniu kompilacji Eksplorator plików zostanie wyświetlona lokalizacja nowego projektu. Nie trzeba go jednak otwierać, ponieważ musisz najpierw utworzyć inny projekt aparatu Unity, w kilku następnych rozdziałach.
Rozdział 12 — Konfigurowanie projektu Mixed Reality Unity
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 Siebie (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ź dopozycji Ustawienia kompilacjiplików> i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.
Przejdź dopozycji Ustawienia kompilacjipliku> i upewnij się, że:
Urządzenie docelowe jest ustawione na dowolne urządzenie
W przypadku Microsoft HoloLens ustaw wartość Urządzenie docelowe na HoloLens.
Typ kompilacji jest ustawiony na D3D
Zestaw SDK jest ustawiony na najnowszą zainstalowaną
Wersja programu Visual Studio jest ustawiona na najnowszą zainstalowaną
Kompilowanie i uruchamianie jest ustawione na komputer lokalny
W tym miejscu warto zapisać scenę i dodać ją do kompilacji.
Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.
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.
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 przestrzeni, w której 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ługiwana rzeczywistość wirtualna), upewnij się, że dodano zestaw SDK Windows Mixed Reality
Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:
InternetClient
Po powrocie do ustawień kompilacjiprojekty 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> projektuZapisz scenę / plik>Zapisz projekt.
Ważne
Jeśli chcesz pominąć składnik Unity Set up 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 Mixed Reality Unity
Będziesz używać biblioteki usługi Azure Storage dla aparatu Unity (która korzysta z 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 istnieje znany problem w środowisku Unity, który wymaga ponownego skonfigurowania wtyczek po zaimportowaniu. Te kroki (4–7 w tej sekcji) nie będą już wymagane po rozwiązaniu usterki.
Aby zaimportować zestaw SDK do własnego projektu, upewnij się, że pobrano najnowszy pakiet unitypackage. Następnie wykonaj następujące czynności:
Dodaj pakiet unitypackage pobrany z powyższej strony do aparatu Unity przy użyciu opcji menu Importujpakiet>niestandardowypakietu zasobów>.
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 Projektu 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 wtyczekusuń zaznaczenie polaWyboru Dowolna platforma i usuń zaznaczeniepola wyboru WSAPlayer , a następnie kliknij przycisk Zastosuj.
Uwaga
Oznaczasz 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.
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 nadal będzie działać, mimo że nie jest przetworzona.
Rozdział 14 — Tworzenie klasy TableToScene w projekcie aparatu Unity rzeczywistości mieszanej
Klasa TableToScene jest identyczna z klasą objaśnianą w rozdziale 9. Utwórz tę samą klasę w projekcie unity rzeczywistości mieszanej zgodnie z tą samą procedurą opisaną w rozdziale 9.
Po zakończeniu tego rozdziału oba projekty aparatu Unity będą miały tę klasę skonfigurowaną na głównym aparacie.
Rozdział 15 — Tworzenie klasy NotificationReceiver w projekcie aparatu Unity Mixed Reality
Drugi skrypt, który należy utworzyć, to NotificationReceiver, który jest odpowiedzialny za:
- Zarejestrowanie aplikacji przy użyciu 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 deserializacji danych.
Aby utworzyć skrypt NotificationReceiver :
Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), kliknij pozycję 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; } } }
Następująca metoda , InitNotificationAsync(), zarejestruje aplikację w usłudze notification Hub podczas inicjowania. Kod jest komentowany, ponieważ aparat Unity nie będzie mógł skompilować projektu. Komentarze zostaną usunięte podczas importowania pakietu NuGet usługi Azure Messaging w 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; // } }
Poniższa 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 na tę samą pozycję.
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żera 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. Pamiętaj, że jeśli skompilujesz projekt, a następnie chcesz powrócić do aparatu 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 kamerę główną z panelu 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 Microsoft HoloLens, musisz zaktualizować składnik Kamery głównej, tak aby:
- Wyczyść flagi: kolor jednolity
- Tło: czarny
Rozdział 16 — Tworzenie projektu Mixed Reality do platformy 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 utworzyć go z poziomu aparatu Unity.
Przejdź do obszaru Ustawienia kompilacji (Ustawienia kompilacjipliku> ).
W menu Ustawienia kompilacji upewnij się, że pozycja Projekty C# aparatu Unity* jest zaznaczona (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 ponownie utwórz inny folder (przy użyciu nowego folderu ) i nadaj mu nazwę NH_MR_App.
Po wybraniu NH_MR_App . kliknij pozycję Wybierz folder. Kompilacja projektu może potrwać kilka 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, po powrocie 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 musisz 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 następnie w oknie po prawej stronie zaznacz pole wyboru obok pozycji Projekt. Spowoduje to umieszczenie znacznika w polu wyboru obok pozycji Project (Projekt) 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ź kod komentarza wprowadzony w klasie NotificationReceiver i usuń komentarze.
Rozdział 18 — Edytowanie aplikacji UnityMRNotifHub, klasy NotificationReceiver
Po dodaniu pakietów NuGet należy usunąć komentarz z kodu w klasie NotificationReceiver .
Obejmuje on:
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 uniwersalnej systemu Windows 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, które zostało zalogowane. 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.
Twoja aplikacja jest teraz skojarzona z aplikacją ze sklepu. Jest to niezbędne do włączenia powiadomień.
Rozdział 20 — Wdrażanie aplikacji UnityMRNotifHub i UnityDesktopNotifHub
Ten rozdział może być łatwiejszy w przypadku dwóch osób, ponieważ w rezultacie zostaną uruchomione obie aplikacje, jedna uruchomiona na komputerze, a druga w immersywnym zestawie słuchawkowym.
Aplikacja immersywnego zestawu nagłownego oczekuje na odebranie zmian w scenie (zmiany położenia lokalnych obiektów GameObject), a aplikacja klasyczna będzie wprowadzać zmiany w ich lokalnej scenie (zmiany położenia), 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 w scenie pulpitu (przy użyciu przycisku myszy po lewej stronie). Te zmiany pozycyjne zostaną wprowadzone lokalnie, serializowane i wysyłane do usługi aplikacji funkcji. Następnie usługa Aplikacji funkcji zaktualizuje tabelę wraz z centrum powiadomień. Po otrzymaniu aktualizacji centrum powiadomień wyśle zaktualizowane dane bezpośrednio do wszystkich zarejestrowanych aplikacji (w tym przypadku aplikacji immersyjnego zestawu nagłownego), która następnie zdeserializuje dane przychodzące i zastosuje nowe dane pozycyjne do obiektów lokalnych, przenosząc je w scenie.
Ukończono aplikację usługi Azure Notification Hubs
Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z usługi Azure Notification Hubs i zezwala na 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?