Udostępnij za pośrednictwem


MR Sharing 250: HoloLens i immersyjne zestawy słuchawkowe

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. Opublikowano nową serię samouczków dla HoloLens 2.

Dzięki elastyczności platforma uniwersalna systemu Windows (UWP) można łatwo utworzyć aplikację, która obejmuje wiele urządzeń. Dzięki tej elastyczności możemy tworzyć środowiska wykorzystujące mocne strony każdego urządzenia. Ten samouczek obejmuje podstawowe środowisko udostępnione, które działa zarówno na urządzeniu HoloLens, jak i Windows Mixed Reality immersywnych zestawów słuchawkowych. Ta zawartość została pierwotnie dostarczona na konferencji Microsoft Build 2017 w Seattle w WA.

W tym samouczku zostaną wykonane następujące czynności:

  • Konfigurowanie sieci przy użyciu sieci UNET.
  • Udostępnianie hologramów na urządzeniach rzeczywistości mieszanej.
  • Ustanów inny widok aplikacji w zależności od używanego urządzenia rzeczywistości mieszanej.
  • Utwórz wspólne środowisko, w którym użytkownicy urządzenia HoloLens prowadzą użytkowników immersywnych zestawów słuchawkowych za pośrednictwem kilku prostych zagadki.

Obsługa urządzeń

Kurs HoloLens Immersyjne zestawy słuchawkowe
MR Sharing 250: HoloLens i immersyjne zestawy słuchawkowe ✔️ ✔️

Przed rozpoczęciem

Wymagania wstępne

Pliki projektu

Uwaga

Jeśli chcesz przejrzeć kod źródłowy przed pobraniem, jest on dostępny w witrynie GitHub.

Rozdział 1 — Holo World

Cele

Upewnij się, że środowisko projektowe jest gotowe do pracy z prostym projektem.

Co utworzymy

Aplikacja przedstawiająca hologram na urządzeniu HoloLens lub Windows Mixed Reality immersywny zestaw słuchawkowy.

Kroki

  • Otwórz aparat Unity.
    • Wybierz pozycję Otwórz.
    • Przejdź do lokalizacji, w której wyodrębniono pliki projektu.
    • Kliknij przycisk Wybierz folder.
    • Przetwarzanie projektu przy pierwszym uruchomieniu projektu zajmie trochę czasu.
  • Sprawdź, czy Mixed Reality jest włączona w środowisku Unity.
    • Otwórz okno dialogowe ustawień kompilacji (Kontrolka+Shift+B lub Ustawienia kompilacji pliku > ...).
    • Wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij pozycję Przełącz platformę.
    • Wybierz pozycję Edytuj>ustawienia odtwarzacza.
    • W panelu Inspektor po prawej stronie rozwiń pozycję Ustawienia XR.
    • Zaznacz pole Obsługiwane przez rzeczywistość wirtualną .
    • Windows Mixed Reality powinien być zestawEM SDK rzeczywistości wirtualnej.
  • Utwórz scenę.
    • W hierarchii kliknij prawym przyciskiem myszy pozycję Główny aparat wybierz pozycję Usuń.
    • W prefabrykach wejściowych > HoloToolkit > przeciągnij element MixedRealityCameraParent do hierarchii.
  • Dodawanie hologramów do sceny
    • W obszarze AppPrefabs przeciągnij skybox do widoku sceny.
    • W obszarze AppPrefabs przeciągnij menedżerów do hierarchii.
    • Z poziomu aplikacji AppPrefabs przeciągnij wyspę do hierarchii.
  • Zapisywanie i kompilowanie
    • Zapisz (kontrolka+S lub scenę zapisywania plików>)
    • Ponieważ jest to nowa scena, musisz ją nazwać. Nazwa nie ma znaczenia, ale używamy wartości SharedMixedReality.
  • Eksportowanie do programu Visual Studio
    • Otwórz menu kompilacji (Kontrolka+Shift+B lub Ustawienia kompilacji pliku>)
    • Kliknij pozycję Dodaj otwarte sceny.
    • Sprawdzanie projektów języka C# aparatu Unity
    • Kliknij pozycję Skompiluj.
    • W wyświetlonym oknie Eksploratora plików utwórz nowy folder o nazwie Aplikacja.
    • Jednym kliknięciem folderu Aplikacja .
    • Naciśnij pozycję Wybierz folder.
    • Poczekaj na ukończenie kompilacji
    • W wyświetlonym oknie Eksploratora plików przejdź do folderu Aplikacja .
    • Kliknij dwukrotnie plik SharedMixedReality.sln , aby uruchomić program Visual Studio
  • Kompilowanie z poziomu programu Visual Studio
    • Za pomocą górnego paska narzędzi zmień element docelowy na Release i x86.
    • Kliknij strzałkę obok pozycji Maszyna lokalna i wybierz pozycję Urządzenie do wdrożenia na urządzeniu HoloLens
    • Kliknij strzałkę obok pozycji Urządzenie i wybierz pozycję Maszyna lokalna , aby wdrożyć zestaw słuchawkowy rzeczywistości mieszanej.
    • Kliknij przycisk Uruchom debugowanie> bez debugowania lub kontrolki+F5 , aby uruchomić aplikację.

Kopanie kodu

W panelu projektu przejdź do pozycji Assets\HoloToolkit\Input\Scripts\Utilities i kliknij dwukrotnie plik MixedRealityCameraManager.cs , aby go otworzyć.

Przegląd: MixedRealityCameraManager.cs to prosty skrypt, który dostosowuje poziom jakości i ustawienia w tle na podstawie urządzenia. Kluczem tutaj jest HolographicSettings.IsDisplayOpaque, który umożliwia skryptowi wykrywanie, czy urządzenie jest urządzeniem HoloLens (IsDisplayOpaque zwraca wartość false) lub immersywny zestaw słuchawkowy (IsDisplayOpaque zwraca wartość true).

Ciesz się swoim postępem

W tym momencie aplikacja po prostu renderuje hologram. Dodamy interakcję do hologramu później. Oba urządzenia będą renderować hologram tak samo. Immersyjny zestaw słuchawkowy będzie również renderować niebieskie niebo i chmury tła.

Rozdział 2 — Interakcja

Cele

Pokaż sposób obsługi danych wejściowych dla aplikacji Windows Mixed Reality.

Co utworzymy

Korzystając z aplikacji z rozdziału 1, dodamy funkcjonalność umożliwiającą użytkownikowi odbiór hologramu i umieszczenie go na rzeczywistej powierzchni na urządzeniu HoloLens lub na tabeli wirtualnej w immersywnym zestawie słuchawkowym.

Odświeżanie danych wejściowych: Na urządzeniu HoloLens gest wyboru jest naciśnięciem powietrza. Na immersyjnych zestawach słuchawkowych użyjemy przycisku A na kontrolerze Xbox. Aby uzyskać więcej informacji, zapoznaj się z omówieniem modelu interakcji.

Kroki

  • Dodawanie menedżera danych wejściowych
    • W prefabrykach wejściowych > holoToolkit > przeciągnij element InputManager do hierarchii jako element podrzędnymenedżerów.
    • Z elementu HoloToolkit > Input > Prefabs > Cursor przeciągnij kursor do hierarchii.
  • Dodawanie mapowania przestrzennego
    • Z elementu HoloToolkit > SpatialMapping > Prefabs przeciągnij element SpatialMapping do hierarchii.
  • Dodaj wirtualną przestrzeń odtwarzania
    • W obszarze Hierarchia rozwiń węzeł MixedRealityCameraParent wybierz pozycję Granica
    • W panelu Inspektor zaznacz pole wyboru, aby włączyć granicę
    • Z poziomu aplikacji AppPrefabs przeciągnij pozycję VRRoom do hierarchii.
  • Dodawanie menedżera WorldAnchorManager
    • W obszarze Hierarchia wybierz pozycję Menedżerowie.
    • W obszarze Inspector (Inspektor) kliknij pozycję Add Component (Dodaj składnik).
    • Wpisz World Anchor Manager.
    • Wybierz pozycję World Anchor Manager , aby go dodać.
  • Dodawanie tapToPlace do wyspy
    • W obszarze Hierarchy (Hierarchia) rozwiń pozycję Island (Wyspa).
    • Wybierz pozycję MixedRealityLand.
    • W obszarze Inspector (Inspektor) kliknij pozycję Add Component (Dodaj składnik).
    • Wpisz Naciśnij, aby umieścić i wybierz go.
    • Zaznacz pole wyboru elementu nadrzędnego po naciśnięciu.
    • Ustaw przesunięcie położeniana (0, 0,1, 0).
  • Zapisz i skompiluj tak jak wcześniej

Kopanie w kodzie

Skrypt 1 — GamepadInput.cs

W panelu projektu przejdź do pozycji Assets\HoloToolkit\Input\Scripts\InputSources i kliknij dwukrotnie plik GamepadInput.cs , aby go otworzyć. Na tej samej ścieżce w panelu projektu kliknij dwukrotnie plik InteractionSourceInputSource.cs.

Należy pamiętać, że oba skrypty mają wspólną klasę bazową BaseInputSource.

Element BaseInputSource przechowuje odwołanie do elementu InputManager, który umożliwia skryptowi wyzwalanie zdarzeń. W tym przypadku zdarzenie InputClicked jest istotne. Będzie to ważne, aby pamiętać, kiedy przejdziemy do skryptu 2, TapToPlace. W przypadku gamePadInput sondujemy przycisk A na kontrolerze, który ma zostać naciśnięty, a następnie zgłaszamy zdarzenie InputClicked. W przypadku elementu InteractionSourceInputSource zgłaszamy zdarzenie InputClicked w odpowiedzi na zdarzenie TappedEvent.

Skrypt 2 — TapToPlace.cs

W panelu projektu przejdź do folderu Assets\HoloToolkit\SpatialMapping\Scripts i kliknij dwukrotnie plik TapToPlace.cs , aby go otworzyć.

Pierwszą rzeczą, którą wielu deweloperów chce zaimplementować podczas tworzenia aplikacji holograficznej, jest przeniesienie hologramów z danymi wejściowymi gestu. W związku z tym staraliśmy się dokładnie skomentować ten skrypt. W tym samouczku warto zwrócić uwagę na kilka kwestii.

Najpierw należy pamiętać, że funkcja TapToPlace implementuje program IInputClickHandler. IInputClickHandler uwidacznia funkcje obsługujące zdarzenie InputClicked wywoływane przez GamePadInput.cs lub InteractionSourceInputSource.cs. Element OnInputClicked jest wywoływany, gdy element BaseInputSource wykryje kliknięcie, gdy obiekt z funkcją TapToPlace znajduje się w fokusie. Wyzwolanie na urządzeniu HoloLens lub naciśnięcie przycisku A na kontrolerze Xbox spowoduje wyzwolenie zdarzenia.

Po drugie kod jest wykonywany w aktualizacji, aby sprawdzić, czy powierzchnia jest sprawdzana, abyśmy mogli umieścić obiekt gry na powierzchni, jak tabela. Immersywny zestaw słuchawkowy nie ma pojęcia rzeczywistych powierzchni, więc obiekt reprezentujący górę tabeli (Vroom > TableThingy > Cube) został oznaczony warstwą fizyki SpatialMapping, więc rzut promieniowy w aktualizacji zderzy się z wirtualną górą tabeli.

Ciesz się postępem

Tym razem możesz wybrać wyspę, aby ją przenieść. Na urządzeniu HoloLens możesz przenieść wyspę na rzeczywistą powierzchnię. W immersywnym zestawie słuchawkowym możesz przenieść wyspę do tabeli wirtualnej, którą dodaliśmy.

Rozdział 3 — Udostępnianie

Cele

Upewnij się, że sieć jest poprawnie skonfigurowana i szczegółowo określa sposób udostępniania kotwic przestrzennych między urządzeniami.

Co utworzymy

Przekonwertujemy nasz projekt na projekt dla wielu graczy. Dodamy interfejs użytkownika i logikę do hostowania lub dołączania sesji. Użytkownicy urządzenia HoloLens zobaczą się nawzajem podczas sesji z chmurami nad głowami, a immersywni użytkownicy zestawu nagłownego mają chmury w pobliżu miejsca, w którym znajduje się kotwica. Użytkownicy immersywnych zestawów słuchawkowych zobaczą użytkowników urządzenia HoloLens względem źródła sceny. Użytkownicy urządzenia HoloLens zobaczą hologram wyspy w tym samym miejscu. Należy pamiętać, że użytkownicy immersywnych zestawów nagłownych nie będą znajdować się na wyspie w tym rozdziale, ale będą zachowywać się bardzo podobnie do urządzenia HoloLens, z widokiem na wyspę.

Kroki

  • Usuwanie wyspy i VRRoom
    • W obszarze Hierarchia kliknij prawym przyciskiem myszy pozycję Wyspa wybierz polecenie Usuń
    • W obszarze Hierarchia kliknij prawym przyciskiem myszy pozycję VRRoom wybierz polecenie Usuń
  • Dodaj usland
    • Z obszaru AppPrefabs przeciągnij pozycję Usland do hierarchii.
  • Z poziomu aplikacji AppPrefabs przeciągnij każdą z następujących opcji do hierarchii:
    • UNETSharingStage
    • UNetAnchorRoot
    • UIContainer
    • DebugPanelButton
  • Zapisz i skompiluj tak jak wcześniej

Kopanie w kodzie

W panelu projektu przejdź do folderu Assets\AppPrefabs\Support\SharingWithUnet\Scripts i kliknij dwukrotnie plik UnetAnchorManager.cs. Możliwość udostępniania informacji śledzenia innym urządzeniom HoloLens przez jeden holoLens, tak aby oba urządzenia mogły współdzielić tę samą przestrzeń, jest niemal magiczne. Moc rzeczywistości mieszanej jest aktywna, gdy co najmniej dwie osoby mogą współpracować przy użyciu tych samych danych cyfrowych.

Kilka kwestii, które należy zwrócić uwagę na ten skrypt:

W funkcji start zwróć uwagę na sprawdzanie elementu IsDisplayOpaque. W tym przypadku udajemy, że kotwica została ustanowiona. Dzieje się tak, ponieważ immersyjne zestawy nagłowne nie uwidaczniają sposobu importowania ani eksportowania kotwic. Jeśli jednak korzystamy z urządzenia HoloLens, ten skrypt implementuje udostępnianie kotwic między urządzeniami. Urządzenie, które uruchamia sesję, utworzy kotwicę do eksportowania. Urządzenie przyłączone do sesji zażąda zakotwiczenia z urządzenia, które uruchomiło sesję.

Eksportujących:

Gdy użytkownik utworzy sesję, funkcja NetworkDiscoveryWithAnchors wywoła funkcję CreateAnchorManagers UNETAnchorManagers. Przyjrzyjmy się przepływowi CreateAnchor.

Zaczynamy od wykonywania pewnych czynności w celu wyczyszczenia wszelkich danych, które mogliśmy zebrać dla poprzednich kotwic. Następnie sprawdzamy, czy do załadowania jest buforowana kotwica. Dane kotwicy mają zwykle rozmiar od 5 do 20 MB, więc ponowne użycie buforowanych kotwic może zaoszczędzić na ilości danych potrzebnych do transferu przez sieć. Zobaczymy, jak to działa nieco później. Nawet jeśli ponownie używamy kotwicy, musimy przygotować dane kotwicy na wypadek, gdyby nowy klient dołączył, który nie ma kotwicy.

Mówiąc o przygotowaniu danych kotwicy, klasa WorldAnchorTransferBatch uwidacznia funkcje przygotowywania danych kotwicy do wysyłania do innego urządzenia lub aplikacji oraz funkcje importowania danych kotwicy. Ponieważ znajdujemy się na ścieżce eksportu, dodamy naszą kotwicę do kontrolki WorldAnchorTransferBatch i wywołamy funkcję ExportAsync. Funkcja ExportAsync wywoła wywołanie zwrotne writeBuffer, ponieważ generuje dane do eksportu. Po wyeksportowaniu wszystkich danych zostanie wywołana funkcja ExportComplete. W poleceniu WriteBuffer dodajemy fragment danych do listy, która będzie eksportowana. W obszarze ExportComplete konwertujemy listę na tablicę. Zmienna AnchorName jest również ustawiona, co spowoduje wyzwolenie innych urządzeń w celu zażądania kotwicy, jeśli jej nie ma.

W niektórych przypadkach kotwica nie zostanie wyeksportowana lub utworzy tak mało danych, które spróbujemy ponownie. W tym miejscu po prostu ponownie wywołamy metodę CreateAnchor.

Końcową funkcją w ścieżce eksportu jest AnchorFoundRemotely. Gdy inne urządzenie znajdzie kotwicę, to urządzenie poinformuje hosta, a host użyje go jako sygnału, że kotwica jest "dobrą kotwicą" i może być buforowana.

Importowanie:

Gdy urządzenie HoloLens dołącza do sesji, musi zaimportować kotwicę. W funkcji Update UNETAnchorManager element AnchorName jest sondowany. Po zmianie nazwy kotwicy rozpocznie się proces importowania. Najpierw próbujemy załadować kotwicę z określoną nazwą z lokalnego magazynu kotwic. Jeśli już go mamy, możemy go użyć bez ponownego pobierania danych. Jeśli go nie mamy, wywołamy funkcję WaitForAnchor, która zainicjuje pobieranie.

Po zakończeniu pobierania wywoływana jest NetworkTransmitter_dataReadyEvent. Zasygnalizuje to pętlę Update, aby wywołać metodę ImportAsync z pobranymi danymi. Funkcja ImportAsync wywoła funkcję ImportComplete po zakończeniu procesu importowania. Jeśli importowanie zakończy się pomyślnie, kotwica zostanie zapisana w lokalnym magazynie odtwarzacza. PlayerController.cs rzeczywiście wywołuje AnchorFoundRemotely, aby poinformować hosta, że została ustanowiona dobra kotwica.

Ciesz się postępem

Tym razem użytkownik z urządzeniem HoloLens będzie hostować sesję przy użyciu przycisku rozpocznij sesję w interfejsie użytkownika. Inni użytkownicy, zarówno na urządzeniu HoloLens, jak i immersywnym zestawie słuchawkowym, wybierają sesję, a następnie wybierają przycisk sprzężenia w interfejsie użytkownika. Jeśli masz wiele osób z urządzeniami HoloLens, będą miały czerwone chmury nad głowami. Będzie również niebieska chmura dla każdego immersywnego zestawu słuchawkowego, ale niebieskie chmury nie będą powyżej zestawów słuchawkowych, ponieważ zestawy nagłowne nie próbują znaleźć tej samej przestrzeni współrzędnej świata co urządzenia HoloLens.

Ten punkt w projekcie jest zawartą aplikacją do udostępniania; nie robi to zbyt wiele i może działać jako punkt odniesienia. W następnych rozdziałach zaczniemy tworzyć doświadczenia dla ludzi, którzy będą się cieszyć. Aby uzyskać dalsze wskazówki dotyczące projektowania współużytkowanego środowiska, przejdź tutaj.

Rozdział 4 — Zanurzenie i teleportowanie

Cele

Zaspokoić środowisko każdego typu urządzenia rzeczywistości mieszanej.

Co utworzymy

Zaktualizujemy aplikację, aby umieścić immersywnych użytkowników zestawu nagłownego na wyspie z widokiem immersywnym. Użytkownicy urządzenia HoloLens nadal będą mieli widok z lotu ptaka na wyspę. Użytkownicy każdego typu urządzenia mogą widzieć innych użytkowników w miarę ich wyświetlania na świecie. Na przykład immersywny zestaw słuchawkowy użytkownicy mogą zobaczyć inne awatary na innych ścieżkach na wyspie i widzą użytkowników urządzenia HoloLens jako gigantyczne chmury nad wyspą. Immersywny zestaw słuchawkowy użytkownicy zobaczą również kursor wzroku użytkownika urządzenia HoloLens, jeśli użytkownik urządzenia HoloLens patrzy na wyspę. Użytkownicy urządzenia HoloLens zobaczą awatar na wyspie, aby reprezentować każdego immersywnego użytkownika zestawu słuchawkowego.

Zaktualizowano dane wejściowe dla urządzenia immersyjnego:

  • Lewy zderzak i prawe przyciski zderzaka na kontrolerze Xbox obracają odtwarzacz
  • Przytrzymanie przycisku Y na kontrolerze Xbox spowoduje włączenie teleportu kursora. Jeśli kursor ma obracający się wskaźnik strzałki po zwolnieniu przycisku Y, nastąpi teleportacja do lokalizacji kursora.

Kroki

  • Dodawanie elementu MixedRealityTeleport do elementu MixedRealityCameraParent
    • W obszarze Hierarchy (Hierarchia) wybierz pozycję Usland.
    • W obszarze Inspector (Inspektor) włącz kontrolkę poziomu.
    • W obszarze Hierarchia wybierz pozycję MixedRealityCameraParent.
    • W obszarze Inspector (Inspektor) kliknij pozycję Add Component (Dodaj składnik).
    • Wpisz Mixed Reality Teleport i wybierz go.

Kopanie w kodzie

Immersywny zestaw słuchawkowy będzie naciągnięty na swoich komputerach za pomocą kabla, ale nasza wyspa jest większa niż kabel jest długi. Aby zrekompensować, potrzebujemy możliwości przenoszenia aparatu niezależnie od ruchu użytkownika. Zobacz stronę komfortu , aby uzyskać więcej informacji na temat projektowania aplikacji rzeczywistości mieszanej (w szczególności samodzielnego ruchu i lokalizowania).

Aby opisać ten proces, warto zdefiniować dwa terminy. Po pierwsze, dolly będzie obiektem, który przenosi aparat niezależnie od użytkownika. Podrzędny obiekt gry dolly będzie głównym aparatem. Kamera główna jest podłączona do głowy użytkownika.

W panelu projektu przejdź do folderu Assets\AppPrefabs\Support\Scripts\GameLogic i kliknij dwukrotnie plik MixedRealityTeleport.cs.

MixedRealityTeleport ma dwa zadania. Po pierwsze, obsługuje rotację za pomocą zderzaków. W funkcji update sondujemy wartości "ButtonUp" w kolumnach LeftBumper i RightBumper. Funkcja GetButtonUp zwraca wartość true tylko w pierwszej klatce, po której przycisk jest wyłączony. Jeśli jeden z przycisków został podniesiony, wiemy, że użytkownik musi dokonać rotacji.

Gdy obracamy się, zanikamy i zanikamy przy użyciu prostego skryptu o nazwie "fade control". Robimy to, aby uniemożliwić użytkownikowi obserwowanie nienaturalnego ruchu, co może prowadzić do dyskomfortu. Zanikanie i wyjście efektu jest dość proste. Mamy czarny czworokąt wiszący przed głównym aparatem. W przypadku zanikania wartości alfa z zakresu od 0 do 1. Powoduje to stopniowe renderowanie czarnych pikseli czworokąta i ukrywanie niczego za nimi. Po powrocie do tyłu przenosimy wartość alfa z powrotem do zera.

Podczas obliczania obrotu należy pamiętać, że obracamy nasz dolly , ale obliczamy obrót wokół głównego aparatu. Jest to ważne, ponieważ dalej główny aparat jest z dala od 0,0,0, tym mniej dokładna rotacja wokół dolly stanie się z punktu widzenia użytkownika. W rzeczywistości, jeśli nie obracasz się wokół pozycji kamery, użytkownik będzie poruszać się po łuku wokół dolly , a nie obracać.

Drugim zadaniem dla aplikacji MixedRealityTeleport jest obsługa przenoszenia pliku dolly. Odbywa się to w elemecie SetWorldPosition. SetWorldPosition przyjmuje żądaną pozycję świata, czyli pozycję, w której użytkownik chce percieve, że mieszka. Musimy umieścić nasz dolly na tej pozycji minus lokalnej pozycji głównego aparatu, ponieważ to przesunięcie zostanie dodane każda ramka.

Drugi skrypt wywołuje metodę SetWorldPosition. Przyjrzyjmy się temu skryptowi. W panelu projektu przejdź do folderu Assets\AppPrefabs\Support\Scripts\GameLogic i kliknij dwukrotnie plik TeleportScript.cs.

Ten skrypt jest nieco bardziej zaangażowany niż MixedRealityTeleport. Skrypt sprawdza, czy przycisk Y na kontrolerze Xbox ma być wstrzymany. Gdy przycisk jest utrzymywany w dół, kursor teleport jest renderowany, a skrypt rzutuje promienie z pozycji spojrzenia użytkownika. Jeśli ten ray zderza się z powierzchnią, która jest mniej lub bardziej skierowana, powierzchnia zostanie uznana za dobrą powierzchnię do teleportowania, a animacja na kursorze teleportu zostanie włączona. Jeśli promienie nie zderzają się z powierzchnią bardziej lub mniej wskazującą, animacja na kursorze zostanie wyłączona. Gdy przycisk Y zostanie zwolniony i obliczony punkt promienia jest prawidłową pozycją, skrypt wywołuje SetWorldPosition z położeniem przeciętego promienia.

Ciesz się postępem

Tym razem musisz znaleźć znajomego.

Po raz kolejny użytkownik z urządzeniem HoloLens będzie hostować sesję. Inni użytkownicy dołączą do sesji. Aplikacja umieści pierwszych trzech użytkowników do dołączenia z immersyjnego zestawu nagłownego na jednej z trzech ścieżek na wyspie. Możesz swobodnie eksplorować wyspę w tej sekcji.

Szczegóły do powiadomienia:

  1. Możesz zobaczyć twarze w chmurach, co pomaga zanurzonej użytkownikowi zobaczyć, w jakim kierunku szuka użytkownik HoloLens.
  2. Awatary na wyspie mają szyje, które obracają się. Nie będą śledzić tego, co robi użytkownik, to prawdziwa rzeczywistość (nie mamy tych informacji), ale sprawia, że jest to miłe środowisko.
  3. Jeśli użytkownik urządzenia HoloLens patrzy na wyspę, zanurzeni użytkownicy mogą zobaczyć kursor.
  4. Chmury reprezentujące użytkowników urządzenia HoloLens rzucają cienie.

Rozdział 5 - Finał

Cele

Utwórz interaktywne środowisko współpracy między dwoma typami urządzeń.

Co utworzymy

Opierając się na rozdziale 4, kiedy użytkownik z immersywnym zestawem słuchawkowym zbliża się do układanki na wyspie, użytkownicy urządzenia HoloLens otrzymają wskazówkę narzędzia z wskazówką dla zagadki. Gdy wszyscy immersywni użytkownicy zestawu nagłownego przejdą przez swoje zagadki i na "gotowy pad" w pomieszczeniu rakiety, rakieta wystartuje.

Kroki

  • W obszarze Hierarchy (Hierarchia) wybierz pozycję Usland.
  • W obszarze Inspector (Inspektor) w obszarze Level Control (Kontrola poziomu) zaznacz pole wyboru Enable Collaboration (Włącz współpracę).

Kopanie w kodzie

Teraz przyjrzyjmy się plikowi LevelControl.cs. Ten skrypt jest podstawą logiki gry i utrzymuje stan gry. Ponieważ jest to gra dla wielu graczy przy użyciu sieci UNET, musimy zrozumieć, jak przepływy danych, co najmniej wystarczająco dobrze, aby zmodyfikować ten samouczek. Aby zapoznać się z bardziej kompletnym omówieniem sieci UNET, zapoznaj się z dokumentacją aparatu Unity.

W panelu projektu przejdź do pozycji Assets\AppPrefabs\Support\Scripts\GameLogic i kliknij dwukrotnie plik LevelControl.cs.

Dowiedzmy się, w jaki sposób immersyjny zestaw słuchawkowy wskazuje, że są one gotowe do startu rakiety. Gotowość startu rakiet jest przekazywana przez ustawienie jednego z trzech bools na liście bools, które odpowiadają trzem ścieżkom na wyspie. Wartość logiczna ścieżki zostanie ustawiona, gdy użytkownik przypisany do ścieżki znajduje się na brązowej podkładce wewnątrz pomieszczenia rakietowego. Dobrze, teraz do szczegółów.

Uruchomimy funkcję Update(). Zauważysz, że istnieje funkcja "cheat". Użyliśmy tego podczas opracowywania do testowania sekwencji startu i resetowania rakiety. Nie będzie działać w środowisku wielu użytkowników. Mam nadzieję, że w czasie wewnętrznych następującej infromacji możesz to zrobić. Po sprawdzeniu, czy powinniśmy oszukiwać, sprawdzamy, czy lokalny gracz jest zanurzony. Chcemy skupić się na tym, jak uważamy, że jesteśmy na cel. Wewnątrz sprawdzania if (Zanurzone) istnieje wywołanie checkgoal ukrywa się za bool EnableCollaboration . Odpowiada to zaznaczonemu polem wyboru podczas wykonywania kroków dla tego rozdziału. Wewnątrz elementu EnableCollaboration widzimy wywołanie funkcji CheckGoal().

CheckGoal robi trochę matematyki, aby sprawdzić, czy jesteśmy bardziej lub mniej stojąc na padu. Gdy jesteśmy, debugujemy plik Log "Przybył do celu", a następnie wywołujemy metodę "SendAtGoalMessage()". W funkcji SendAtGoalMessage wywołujemy element playerController.SendAtGoal. Aby zaoszczędzić trochę czasu, oto kod:

private void CmdSendAtGoal(int GoalIndex)
{
    levelState.SetGoalIndex(GoalIndex);
}
public void SendAtGoal(int GoalIndex)
{
    if (isLocalPlayer)
    {
        Debug.Log("sending at goal " + GoalIndex);
        CmdSendAtGoal(GoalIndex);
    }
}

Należy pamiętać, że funkcja SendAtGoalMessage wywołuje metodę CmdSendAtGoal, która wywołuje parametr levelState.SetGoalIndex, który jest z powrotem w pliku LevelControl.cs. Na pierwszy rzut oka wydaje się to dziwne. Dlaczego nie tylko wywołaj polecenie SetGoalIndex, a nie ten dziwny routing przez kontroler odtwarzacza? Przyczyną jest zgodność z siecią UNET modelu danych w celu zachowania synchronizacji danych. Aby zapobiec oszukiwaniu i ograniczaniu, sieć UNET wymaga, aby każdy obiekt miał uprawnienia do zmiany zsynchronizowanych zmiennych. Ponadto tylko host (użytkownik, który rozpoczął sesję) może bezpośrednio zmienić dane. Użytkownicy, którzy nie są hostem, ale mają uprawnienia, muszą wysłać "polecenie" do hosta, który zmieni zmienną. Domyślnie host ma uprawnienia do wszystkich obiektów, z wyjątkiem obiektu, który został zduplikowany do reprezentowania użytkownika. W naszym przypadku ten obiekt ma skrypt playercontroller. Istnieje sposób żądania urzędu dla obiektu, a następnie wprowadzenia zmian, ale decydujemy się na wykorzystanie faktu, że kontroler odtwarzacza ma własny autorytet i kierowanie poleceń za pośrednictwem kontrolera odtwarzacza.

Powiedział inny sposób, kiedy znaleźliśmy się w naszym celu, gracz musi powiedzieć gospodarzowi, a gospodarz powie wszystkim innym.

Wróć do pliku LevelControl.cs, aby zapoznać się z indeksem SetGoalIndex. Tutaj ustawiamy wartość wartości na liście synchronizacji (AtGoal). Pamiętaj, że jesteśmy w kontekście hosta, gdy to robimy. Podobnie jak w przypadku polecenia, RPC jest czymś, co host może wydać, co spowoduje uruchomienie kodu przez wszystkich klientów. W tym miejscu nazywamy "RpcCheckAllGoals". Każdy klient będzie indywidualnie sprawdzać, czy wszystkie trzy AtGoals są ustawione, a jeśli tak, wystrzelić rakietę.

Ciesz się swoim postępem

Opierając się na poprzednim rozdziale, rozpoczniemy sesję tak jak wcześniej. Tym razem, gdy użytkownicy w immersywnym zestawie słuchawkowym dostać się do "drzwi" na swojej ścieżce, etykietka narzędzia pojawi się, że tylko użytkownicy HoloLens mogą zobaczyć. Użytkownicy urządzenia HoloLens są odpowiedzialni za komunikację tej wskazówki dla użytkowników w immersywnym zestawie słuchawkowym. Rakieta wystrzeli w kosmos, gdy każdy awatar wszedł na odpowiednią brązową podkładkę wewnątrz wulkanu. Scena zostanie zresetowana po 60 sekundach, aby można było to zrobić ponownie.

Zobacz też