1. Omówienie
ARCore to platforma Google do tworzenia treści w rzeczywistości rozszerzonej na smartfonach. Za pomocą pakietu Unity AR Foundation możesz tworzyć aplikacje AR działające na wielu platformach.
Co utworzysz
W ramach tego ćwiczenia w programie utworzysz prostą grę z wykorzystaniem AR Foundation. Celem gry jest zbieranie przesyłek za pomocą samochodu, którym sterujesz za pomocą urządzenia mobilnego.
Jednak nie odbędzie się to w całkowicie wirtualnym świecie. Możesz mieszać atomy fizyczne z cyfrowymi elementami, aby stworzyć grę, która rozumie środowisko wokół gracza.
Po ukończeniu tego ćwiczenia z programowania Twoja gra będzie w stanie:
- Wykrywaj prawdziwe samoloty i rysuj nad nimi boisko.
- 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 połączone z maszyną programistyczną kablem USB.
- Usługi Google Play dla AR w wersji 1.23 lub nowszej.
- instalacja Unity Hub lub Unity 2020 LTS;
2. Konfigurowanie środowiska programistycznego
W tym kroku przygotujesz środowisko do programowania za pomocą Unity AR Foundation.
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ć poprawnie skonfigurowanej instancji emulatora Androida zgodnej z AR.
Skonfiguruj debugowanie USB na urządzeniu
Aby uruchamiać aplikacje do debugowania, 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 ramach tego ćwiczenia w programie zrzuty ekranu prezentują interfejs 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, korzystając z szablonu Potoku uniwersalnego renderowania. Nadaj mu opisową nazwę i odpowiednią lokalizację, a następnie kliknij UTWÓRZ.
Zainstaluj wymagane platformy
Fundację AR Foundation 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 z programowania. Aby wyświetlić najnowsze wersje tych platform, rozwiń wpis za pomocą ikony
►
. Zainstaluj najnowsze wersje każdej z tych platform:- Podstawy AR
- Wtyczka ARCore XR
Gdy skończysz, Twój menedżer pakietów powinien wyglądać mniej więcej tak:
Zainstaluj pakiet startowy
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:
- Otwórz Plik > Ustawienia kompilacji.
- W panelu Platforma kliknij Android.
- Opcjonalnie włącz Kompilację dla programistów i Debugowanie skryptów, aby zachować informacje debugowania podczas działania aplikacji.
- Kliknij Przełącz platformę.
Zmień ustawienia projektu
Aby inicjować systemy XR podczas uruchamiania, musisz skonfigurować AR Foundation.
- 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ń interfejs Vulkan z interfejsu Graphics API.
- 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 uniwersalnego potoku renderowania zawiera obiekty gry, których nie będziesz używać w tym samouczku.
- Usuń wszystkie obiekty gry w:
SampleScene
.
- Dodaj obiekty AR Foundation. Kliknij prawym przyciskiem myszy w panelu Hierarchia. Za pomocą tego menu możesz dodać:
- XR > Sesja AR: ten obiekt kontroluje cykl życia doświadczenia AR.
- XR > Początek sesji AR: 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ń utworzony w hierarchii Źródło sesji AR i wybierz obiekt Kamera AR. W inspektorze zmień jego tag na MainCamera.
Skonfiguruj renderowanie
Potok Universal Render Potok Unity wymaga jednej zmiany, aby był zgodny z podstawą AR.
- W panelu Projekt wybierz kolejno Zasoby > Settings, 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 uruchomienie jej 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 przygotowaniu podstawowej sceny możesz zacząć tworzyć grę. 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 pusty element
GameObject
. - Zmień nazwę na
Driving Surface Manager
. Ten komponent wyświetla płaszczyzny, dopóki odtwarzacz nie wybierze ich. - Wybierz nowy obiekt gry. W panelu Inspektor kliknij Dodaj komponent, by dodać menedżera platformy AR.
- Skonfiguruj
ARPlaneManager
przez ustawienie polaPlane Prefab
:- Kliknij przycisk obok
None
, aby otworzyć okno Select GameObject (Wybierz obiekt GameObject). - Wybierz kartę Zasoby i wyszukaj Powierzchnia miejska.
- Kliknij przycisk obok
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
Element ARRaycastManager
udostępnia funkcję przesyłania promieni. W następnym kroku użyjemy tego obiektu, aby udostępnić elementy sterujące użytkownikowi.
- Upewnij się, że w panelu Hierarchia wybrany jest obiekt o nazwie
Driving Surface Manager
. - W inspektorze kliknij Dodaj komponent, by dodać komponent
ARRaycastManager
do obiektu gry.
Ten komponent nie wymaga dalszej konfiguracji.
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 inspektorze kliknij Dodaj komponent, by dodać komponent
DrivingSurfaceManager
do obiektu gry.
Ten komponent nie wymaga dalszej konfiguracji.
Uruchom aplikację
- Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
- Skieruj urządzenie na poziomą powierzchnię świata i poruszaj nim, aby lepiej zrozumieć świat za pomocą ARCore.
- Gdy ARCore wykryje samolot, na powierzchniach w świecie rzeczywistym powinna pojawić się tekstura brukowa.
ARPlaneManager
tworzy wystąpienie podanegoPlane Prefab
dla każdej wykrytej platformy. PrefabrykaDriving Surface Plane
zawiera komponentARPlaneMeshVisualizer
, który tworzy siatkę dla danego elementu typuARPlane
.
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ść tych samolotów, tworząc siatkę celującą i samochód, który będzie jeździć po powierzchni wykrytego samolotu.
Zbuduj siatkę celującą
Schemat sterowania aplikacji polega na tym, że gracz kieruje telefon na powierzchnię. Aby uzyskać wyraźną informację wizualną dla wybranego miejsca, użyj celownika.
Aby „przytrzymać” do samolotu AR, użyj testu trafienia. 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ść Prefab siatki na scenie, przeciągając ją do panelu Hierarchia projektu.
- Wybierz siatkę w hierarchii.
- 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
umieści siatkę na płaszczyźnie, która znajduje się na środku widocznego obszaru urządzenia.
- Otwórz skrypt
ReticleBehaviour.cs
, klikając dwukrotnie poleScript
. - Określ środek ekranu, korzystając z
ViewToScreenPoint
aparatu. Edytuj metodęUpdate()
, aby dodać następujące dane:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
- Wykorzystaj ten punkt, aby przeprowadzić raycast. Dodaj następujące elementy:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);
Zmienna hits
będzie zawierać obiekty ARRaycastHit
opisujące punkty na elementach możliwych do śledzenia, których przecięcie ma wartość ray
.
- Określ ciekawe miejsce, wysyłając zapytanie o listę
hits
. Nadaj priorytet zablokowanej płaszczyźnie zawartej wDrivingSurfaceManager
, a jeśli ona nie istnieje, użyj pierwszego trafienia na płaszczyznę. Na końcuUpdate()
dodaj:
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, przenieś przekształcenie tego elementuGameObject
w pozycję działania.
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 celownika
- Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
- Gdy skierujesz urządzenie w stronę samolotu, reflektor powinien podążać za ruchami kamery.
Utwórz samochód
Gracz kontroluje samochód-zabawkę, który jedzie w stronę celownika. Model i działanie tego samochodu znajdziesz w pakiecie startowym.
Dodaj element CarManager
do sceny
- W Hierarchii utwórz nowy pusty element
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 Prefabryka w samochodzie.
- siatka: w sekcji Scena wybierz Prefab siatki.
- Drive Surface Manager: w sekcji Scene (Scene) wybierz drive Surface Manager (Menedżer powierzchni jazdy).
To zachowanie typu CarManager
powoduje utworzenie samochodzika w samolocie, w którym znajduje się celownik. Jeśli chcesz, możesz sprawdzić skrypt CarBehaviour
, aby dowiedzieć się, jak zaprogramowano 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. Ten samochód podąża za siatką.
Dodaj element 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, by dodać do niego komponent
PackageSpawner
. - Skonfiguruj zależności
PackageSpawner
, klikając selektor w każdym polu:- Prefab pakietu: w sekcji Zasoby wybierz Przygotowanie pakietu.
- 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.
Przetestuj grę
- Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany. 2. Po utworzeniu samochodu powinna pojawić się paczka.
- Zabierz samochód do paczki.
- Nowe pojawi się w losowo wybranym miejscu.
5. Skonfiguruj oszacowanie oświetlenia
Po ukończeniu podstawowej gry dodaj odrobinę realizmu do swojej 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 zostaną wykorzystane do dostosowania oświetlenia sceny do rzeczywistego oświetlenia.
Włącz oszacowanie oświetlenia
- W sekcji Hierarchia rozwiń Początek 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 mają one kolor zależny 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ś. Zobaczysz, że oświetlenie obiektów dostosowuje się do zmian w oświetleniu w świecie rzeczywistym.
6. Podsumowanie
Gratulacje! Udało Ci się dotrzeć do końca tego ćwiczenia z programowania w Unity AR Foundation.
Co zostało omówione
- 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 za pomocą aplikacji
ARLightEstimationData
oświetlić scenę.
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ąć utworzoną tutaj grę, możesz wykorzystać te pomysły:
- Dodaj do gry licznik wyników, modyfikując
TextMeshPro
, gdyPackageManager
powoduje utworzenie nowego pakietu. - Sprawdzaj informacje o wydajności gry, gdy gra jest uruchomiona. W tym celu 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.