1. Omówienie
ARCore to platforma Google do tworzenia treści w rzeczywistości rozszerzonej na smartfonach. Za pomocą platformy AR Foundation firmy Unity możesz tworzyć aplikacje AR na różne platformy.
Co utworzysz
W tym ćwiczeniu z programowania utworzysz prostą grę za pomocą AR Foundation. Celem gry jest zbieranie przesyłek za pomocą samochodu, którym sterujesz za pomocą urządzenia mobilnego.
Nie będzie to jednak możliwe w całkowicie wirtualnym świecie. Połączając fizyczne atomy z cyfrowymi bitami, stworzysz nowy typ gry, która będzie uwzględniać otoczenie gracza.
Po ukończeniu tego ćwiczenia z programowania Twoja gra będzie w stanie:
- Wykrywanie samolotów w rzeczywistości i rysowanie pola gry nad nimi.
- Rzucaj promienie z pola widzenia kamery i wykrywaj skrzyżowania z samolotami.
- Reaguj na rzeczywiste warunki oświetleniowe, aby nadać grze bardziej realizm.
Czego się nauczysz
- Jak skonfigurować projekt wykorzystujący Unity AR Foundation.
- Jak korzystać z
ARPlaneManager
do subskrybowania nowych samolotów. - Jak używać funkcji
Raycast
do znajdowania skrzyżowań z geometrią wirtualną - Jak za pomocą aplikacji
ARLightEstimationData
oświetlić scenę.
Czego potrzebujesz
- Obsługiwane urządzenie ARCore, które jest podłączone do komputera deweloperskiego za pomocą kabla USB.
- Usługi Google Play dla AR w wersji 1.23 lub nowszej.
- Zainstaluj Unity Hub lub Unity 2020 LTS.
2. Konfigurowanie środowiska programistycznego
W tym kroku przygotujesz środowisko do tworzenia aplikacji za pomocą platformy AR Foundation firmy Unity.
Upewnij się, że Twoje urządzenie jest zgodne z AR
Rzeczywistość AR na urządzeniach z Androidem jest obsługiwana przez technologię ARCore, która jest dostępna na urządzeniach obsługujących ARCore. Upewnij się, że Twoje urządzenie, którego używasz, jest zgodne z AR. Możesz też użyć prawidłowo skonfigurowanego egzekutytora Androida z obsługą AR.
Skonfiguruj debugowanie USB na urządzeniu
Aby uruchamiać aplikacje debugujące, musisz włączyć na urządzeniu Opcje programisty. Zapoznaj się z dokumentacją Androida w sekcji Włączanie opcji programisty i debugowania USB.
Zainstaluj Unity (2020.3 LTS)
Na stacji roboczej zainstaluj Unity 2020 LTS. W tym ćwiczeniu z programowania przedstawiono zrzuty ekranu interfejsu Unity w wersji 2020.3 (LTS). Inne wersje Unity mogą działać, ale mogą wymagać wykonania dodatkowych czynności. Może on wyglądać inaczej niż na zrzutach ekranu widocznych tutaj.
Utwórz nowy projekt
Utwórz nowy projekt za pomocą szablonu Universal Render Pipeline. Nadaj mu nazwę i odpowiednią lokalizację, a potem kliknij UTWÓRZ.
Zainstaluj wymagane platformy
Narzędzie AR Foundation firmy Unity znajdziesz w menedżerze pakietów Unity.
- Otwórz go, klikając Okno > Menedżer pakietów.
- W tym oknie zainstaluj pakiety, których będziesz używać w tym ćwiczeniu. Aby wyświetlić najnowsze wersje tych platform, rozwiń wpis za pomocą ikony
►
. Zainstaluj najnowsze wersje tych frameworków:- Podstawy AR
- Wtyczka ARCore XR
Gdy skończysz, menedżer pakietów powinien wyglądać mniej więcej tak:
Instalowanie pakietu startowego
Na potrzeby tego ćwiczenia w Codelabs udostępniamy pakiet startowy, który zawiera wstępne wersje i skrypty, które przyspieszą wykonywanie niektórych części ćwiczenia w Codelabs, dzięki czemu możesz się skupić na korzystaniu z Fundamentów AR.
- Zainstaluj pakiet startowy, otwierając Zasoby > Importuj pakiet > Pakiet niestandardowy... otwieram
starter-package.unitypackage
. - Sprawdź w oknie, które się pojawi.
- Kliknij Importuj.
Zmień ustawienia kompilacji
Ponieważ aplikacja będzie działać na Androidzie, zmień platformę kompilacji na Androida:
- Kliknij Plik > Ustawienia kompilacji.
- W panelu Platforma kliknij Android.
- Opcjonalnie możesz włączyć kompilację deweloperską i debugowanie skryptu, aby zachować informacje debugowania podczas działania aplikacji.
- Kliknij Przełącz platformę.
Zmiana ustawień projektu
AR Foundation musi być skonfigurowany, aby zainicjować systemy XR podczas uruchamiania.
- Otwórz kolejno Edycja > Ustawienia projektu... i kliknij sekcję XR Plug-in Management.
- Na karcie Android włącz ARCore.
- W panelu po lewej stronie kliknij sekcję Odtwarzacz.
- Na karcie Android w sekcji Inne ustawienia usuń Vulkan z sekcji Interfejsy API grafiki.
- Aplikacje, które wymagają AR i korzystają z ARCore, wymagają interfejsu API na poziomie 24. Przewiń w dół i znajdź Minimalny poziom interfejsu API. Ustaw minimalny poziom interfejsu API na 24.
Dodaj wymagane elementy sceny
Szablon Universal Render Pipeline zawiera obiekty gry, których nie będziesz używać w tym samouczku.
- Usuń wszystkie obiekty gry w:
SampleScene
.
- Dodawanie obiektów AR Foundation. Kliknij prawym przyciskiem myszy w panelu Hierarchia. Za pomocą tego menu możesz dodać:
- XR > AR Session (Sesja AR): ten obiekt kontroluje cykl życia funkcji AR.
- XR > AR Session Origin (XR > AR Session Origin): ten obiekt przekształca współrzędne AR w współrzędne świata Unity.
- Jasny > Światło kierunkowe: to źródło światła służące do oświetlania obiektów w grze.
Twoja hierarchia powinna wyglądać tak:
- Rozwiń AR Session Origin utworzony w hierarchii i wybierz obiekt AR Camera. W inspektorze zmień tag na MainCamera.
Skonfiguruj renderowanie
Potok Universal Render Potok Unity wymaga jednej zmiany, aby był zgodny z podstawą AR.
- W panelu Projekt przejdź do Zasoby > Ustawienia, aby znaleźć zasób ForwardRenderer.
- Wybierz ForwardRenderer.
- W panelu Inspektor użyj opcji Dodaj funkcję mechanizmu renderowania, aby dodać funkcję mechanizmu renderowania w tle AR. Ten komponent wyrenderuje obraz z kamery w Twojej scenie.
Sprawdzanie konfiguracji
- Sprawdź, czy urządzenie jest podłączone i czy debugowanie ADB jest włączone.
- Kliknij Plik > Utwórz i uruchom... Spowoduje to przesłanie aplikacji na urządzenie i jej uruchomienie po zainstalowaniu.
- Na ekranie Twojego urządzenia powinien pojawić się obraz z kamery.
W następnym kroku zaczniesz dodawać funkcje do aplikacji.
3. Wykrywanie samolotów w świecie rzeczywistym
Po skonfigurowaniu podstawowej sceny możesz rozpocząć tworzenie gry. W tym kroku wykryjesz samoloty i narysujesz je na scenę.
Dodawanie komponentu ARPlaneManager
ARPlaneManager
wykrywa bloki ARPlane
i tworzy, aktualizuje i usuwa obiekty gry, gdy zmienia się poziom zrozumienia środowiska przez urządzenie.
- W panelu Hierarchia utwórz pustą
GameObject
. - Zmień nazwę na
Driving Surface Manager
. Ten komponent wyświetla samoloty, dopóki gracz nie wybierze jednego z nich. - Wybierz nowy obiekt gry. W panelu Inspektor kliknij Dodaj komponent, by dodać menedżera platformy AR.
- Skonfiguruj
ARPlaneManager
przez ustawienie polaPlane Prefab
:- Kliknij przycisk
None
, aby otworzyć okno Wybierz obiekt gry. - Wybierz kartę Zasoby i wyszukaj Płaszczyznę jezdni.
- Kliknij przycisk
Ta prefabryka z pakietu startowego zawiera surową teksturę podłogową, która będzie używana jako dekoracja samolotu.
- Zmień
Detection Mode
naHorizontal
. Konfiguruje toARPlaneManager
tak, aby wyświetlać tylko płaszczyzny poziome, idealne do jazdy.
Dodawanie komponentu ARRaycastManager
ARRaycastManager
udostępnia funkcję raycast. W następnym kroku użyjemy tego obiektu do udostępnienia użytkownikowi elementów sterujących.
- Sprawdź, czy w panelu Hierarchia jest wybrany obiekt o nazwie
Driving Surface Manager
. - W panelu Inspekcja kliknij Dodaj komponent, aby dodać do obiektu w grze komponent
ARRaycastManager
.
Nie musisz nic więcej konfigurować w przypadku tego komponentu.
Dodaj komponent DrivingSurfaceManager
DrivingSurfaceManager
to skrypt pomocniczy z pakietu startowego, który pozwala wybrać ARPlane
. Po wybraniu samolotu ARPlane
wszystkie inne samoloty zostaną ukryte, a nowe samoloty – wyłączone.
- Upewnij się, że w panelu Hierarchia wybrany jest obiekt o nazwie
Driving Surface Manager
. - W panelu Inspekcja kliknij Dodaj komponent, aby dodać do obiektu w grze komponent
DrivingSurfaceManager
.
Ten komponent nie wymaga dalszej konfiguracji.
Uruchamianie aplikacji
- Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
- Skieruj urządzenie na poziomą powierzchnię w rzeczywistym świecie i poruszaj nim, aby ARCore lepiej poznało otoczenie.
- Gdy ARCore wykryje samolot, na powierzchniach w świecie rzeczywistym powinna pojawić się tekstura brukowa.
ARPlaneManager
tworzy instancję danegoPlane Prefab
dla każdego wykrytego samolotu. PrefabDriving Surface Plane
zawiera komponentARPlaneMeshVisualizer
, który tworzy siatkę dla danegoARPlane
.
W następnym kroku jako pole gry wykorzystasz wykryty samolot.
4. Wykonaj test trafień na wykrytych samolotach
W poprzednim kroku zaprogramowaliśmy aplikację, która wykrywa samoloty. Te samoloty pojawiają się w scenie gry. Teraz dodasz interaktywność z tymi płaszczyznami, tworząc siatkę celowania i samochód, który będzie poruszał się po powierzchni wykrytej płaszczyzny.
Tworzenie siatki celowniczej
W tej aplikacji gracz musi skierować telefon na powierzchnię. Aby uzyskać wyraźną informację wizualną dla wybranego miejsca, użyj celownika.
Aby „przykleić” siatkę do płaszczyzny AR, użyj testu kolizji. Test trafień to technika, która polega na obliczaniu przecięć podczas rzutu promienia w danym kierunku. Użyjesz testu trafienia, aby wykryć skrzyżowanie w kierunku widzenia kamery.
Dodaj siatkę
- W panelu Projekt u dołu ekranu kliknij Zasoby > Pakiet startowy.
- Umieść w scenie predefiniowany celownik, przeciągając go do panelu Hierarchia projektu.
- W hierarchii wybierz siatkę.
- W inspektorze kliknij Dodaj komponent. Dodaj skrypt
ReticleBehaviour
z pakietu startowego. Ten skrypt zawiera schemat do sterowania siatką. - Skrypt
ReticleBehaviour
zależy od utworzonej wcześniejDriving Surface Manager
, więc dodaj zależność, klikając selektorDriving Surface Manager
. Kliknij kartę Scena i wybierzDriving Surface Manager
.
Edytuj ReticleBehaviour
Skrypt ReticleBehavior
ustawia krzyżyk na płaszczyźnie, która znajduje się w środku widoku urządzenia.
- Otwórz skrypt
ReticleBehaviour.cs
, klikając dwukrotnie poleScript
. - Określ środek ekranu za pomocą przycisku
ViewToScreenPoint
aparatu. Edytuj metodęUpdate()
, aby dodać następujące dane:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- Użyj tego punktu do przeprowadzenia rzutowania promieniowego. Dodaj następujące elementy:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
Zmienna hits
będzie zawierać wartości ARRaycastHit
, które opisują punkty na elementach śledzonych, które są przecinane przez ray
.
- Określ interesujący punkt przecięcia, wysyłając zapytanie do listy
hits
. Nadaj priorytet samolotowi zamkniętemu w elementachDrivingSurfaceManager
. Jeśli go nie ma, użyj pierwszego znalezionego samolotu. Dodaj te informacje na końcu plikuUpdate()
:
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
// If you don't have a locked plane already...
var lockedPlane = DrivingSurfaceManager.LockedPlane;
hit = lockedPlane == null
// ... use the first hit in `hits`.
? hits[0]
// Otherwise use the locked plane, if it's there.
: hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
- Jeśli
hit
zawiera wynik, przemieść transformacjęGameObject
do pozycji trafienia.
if (hit.HasValue)
{
CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
// Move this reticle to the location of the hit.
transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);
Testowanie siatki celowniczej
- Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
- Gdy skierujesz urządzenie w stronę samolotu, reflektor powinien podążać za ruchami kamery.
Tworzenie samochodu
Gracz kontroluje samochód-zabawkę, który jedzie w stronę celownika. Model i działanie tego samochodu znajdziesz w pakiecie startowym.
Dodawanie CarManager
do sceny
- W sekcji Hierarchia utwórz nową pustą
GameObject
. - Zmień nazwę na
Car Spawner
. - Wybierz utworzony obiekt. W panelu Hierarchia kliknij Dodaj komponent, by dodać komponent
CarManager
. - Skonfiguruj zależności
CarManager
, klikając selektor w każdym polu:- Prefabryka w samochodzie: w sekcji Komponenty wybierz Prefab samochodowy.
- Celownik: w sekcji Scena wybierz Wstępny obiekt celownika.
- Menedżer powierzchni do jazdy: w sekcji Scena wybierz Menedżer powierzchni do jazdy.
Ta CarManager
powoduje pojawienie się samochodu zabawkowego na płaszczyźnie, na której znajduje się celownik. Jeśli chcesz, możesz zapoznać się ze skryptem CarBehaviour
, aby dowiedzieć się, jak programować samochód.
Jazdy próbne
- Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany.
- Gdy klikniesz samolot, w tym miejscu powinien pojawić się mały samochód. Samochód będzie podążał za celownikiem.
Dodawanie elementu gry
Teraz gdy gracz może kontrolować element w scenie, daj mu cel podróży.
- Utwórz nowy pusty element
GameObject
w hierarchii. - Zmień nazwę na
Package Spawner
. - Wybierz utworzony obiekt. W panelu Hierarchia kliknij Dodaj komponent, aby dodać do niego komponent
PackageSpawner
. - Skonfiguruj zależności
PackageSpawner
, klikając selektor w każdym polu:- Pakiet prefab: w sekcji Komponenty kliknij Pakiet prefab.
- Drive Surface Manager (Menedżer powierzchni jazdy) w sekcji Scene (Scena) wybierz drive Surface Manager (Menedżer powierzchni jazdy).
To działanie PackageSpawner
powoduje utworzenie nowego pakietu w losowej lokalizacji w zablokowanym ARPlane
, jeśli jeszcze go tam nie ma.
Testowanie gry
- Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany. 2. Po utworzeniu samochodu powinien pojawić się pakiet.
- Zabierz samochód do paczki.
- Nowy pojawi się w losowym miejscu.
5. Konfigurowanie szacowania oświetlenia
Teraz, gdy podstawowa gra jest gotowa, dodaj odrobinę realizmu do sceny AR. W tym kroku użyjesz interfejsu Lighting Estimation API firmy ARCore, aby wykrywać oświetlenie obecne w świecie rzeczywistym na podstawie przychodzących klatek kamery. Te informacje posłużą do dostosowania oświetlenia sceny do oświetlenia w świecie rzeczywistym.
Włączanie szacowania oświetlenia
- W sekcji Hierarchia rozwiń Pochodzenie sesji AR i wybierz obiekt Kamera AR.
- W narzędziu Inspektor rozwiń skrypt Menedżer aparatu AR.
- W polu Szacowanie oświetlenia zmień wartość na Wszystko.
Zmień światło kierunkowe
- W sekcji Hierarchia wybierz obiekt Światło kierunkowe.
- Dodaj do niego komponent
LightEstimation
. Ten komponent z pakietu startowego zawiera schemat, który umożliwia zasubskrybowanie zmian w oświetleniu. - W funkcji
FrameReceived()
dodaj:
ARLightEstimationData lightEstimation = args.lightEstimation;
if (lightEstimation.averageBrightness.HasValue)
Light.intensity = lightEstimation.averageBrightness.Value;
if (lightEstimation.averageColorTemperature.HasValue)
Light.colorTemperature = lightEstimation.averageColorTemperature.Value;
if (lightEstimation.colorCorrection.HasValue)
Light.color = lightEstimation.colorCorrection.Value;
if (lightEstimation.mainLightDirection.HasValue)
Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);
if (lightEstimation.mainLightColor.HasValue)
Light.color = lightEstimation.mainLightColor.Value;
if (lightEstimation.mainLightIntensityLumens.HasValue)
Light.intensity = lightEstimation.averageMainLightBrightness.Value;
if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
RenderSettings.ambientMode = AmbientMode.Skybox;
RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}
Testowanie zmian
- Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany.
- Patrząc na obiekty w kadrze, możesz zauważyć, że są one kolorowe w zależności od oświetlenia otoczenia.
- Jeśli to możliwe, spróbuj zmienić oświetlenie. Spróbuj na przykład wyłączyć światło w pomieszczeniu, w którym jesteś. Oświetlenie obiektów powinno się dostosować do zmian oświetlenia w rzeczywistości.
6. Podsumowanie
Gratulacje! Udało Ci się dotrzeć do końca tego ćwiczenia dotyczącego podstaw rzeczywistości rozszerzonej w Unity.
Omówione kwestie
- Jak skonfigurować podstawowy projekt za pomocą Unity AR Foundation i uniwersalnego potoku renderowania.
- Jak korzystać z
ARPlaneManager
do subskrybowania nowych samolotów. - Jak używać narzędzia
Raycast
do znajdowania skrzyżowań z geometrią wirtualną. - Jak używać
ARLightEstimationData
do oświetlenia sceny.
Dalsze kroki
- Zobacz przykłady programu Unity AR Foundation (w języku angielskim).
- Przejrzyj dokumentację AR Foundation.
- Zapoznaj się z dokumentacją Google dotyczącą rozszerzeń ARCore dla Fundacji AR Unity.
Dodatkowe przypisania
Jeśli chcesz rozwinąć stworzoną przez siebie grę, możesz skorzystać z tych pomysłów:
- Dodaj do gry licznik wyników, modyfikując
TextMeshPro
, gdyPackageManager
powoduje utworzenie nowego pakietu. - Aby sprawdzić informacje o wydajności podczas gry, włącz nakładkę wydajności.
- Użyj trwałych Raycasts, aby najpierw umieścić nowe obiekty w scenie. Po wykryciu samolotu w tym obszarze obiekt ten zostanie przyciągnięty do tego płaszczyzny.