Tworzenie gry AR przy użyciu Fundacji AR Unity

1. Przegląd

ARCore to platforma Google do tworzenia na smartfonach projektów rzeczywistości rozszerzonej. Do tworzenia aplikacji AR na wiele platform możesz używać AR Foundation od Unity.

Co utworzysz

W tym ćwiczeniu utworzysz prostą grę za pomocą AR Foundation. Celem gry jest zbieranie paczek za pomocą samochodu sterowanego za pomocą urządzenia przenośnego.

Nie stanie się to jednak w całkowicie wirtualnym świecie. Połączysz fizyczne atomy i cyfrowe bity, aby stworzyć nowy rodzaj rozgrywki, tworząc grę, która rozumie otoczenie gracza.

Po ukończeniu tego ćwiczenia Twój kod będzie:

  • wykrywać prawdziwe samoloty i rysować nad nimi pole gry;
  • Rzutuj promienie z widoku kamery i wykrywaj przecięcia z płaszczyznami.
  • Reaguj na rzeczywiste warunki oświetleniowe, aby nadać grze dodatkowy realizm.

Czego się nauczysz

  • Jak skonfigurować projekt, który korzysta z AR Foundation od Unity.
  • Jak używać ARPlaneManager do subskrybowania nowych samolotów.
  • Jak używać funkcji Raycast do znajdowania przecięć z wirtualną geometrią
  • Jak używać ARLightEstimationData do oświetlania sceny.

Czego potrzebujesz

2. Konfigurowanie środowiska programistycznego

W tym kroku przygotujesz środowisko do programowania za pomocą AR Foundation w Unity.

Sprawdź, czy Twoje urządzenie jest zgodne z AR

Funkcje AR na urządzeniach z Androidem są obsługiwane przez ARCore, który jest dostępny na urządzeniach obsługujących ARCore. Sprawdź, czy urządzenie deweloperskie jest zgodne z AR. Możesz też użyć prawidłowo skonfigurowanej instancji Android Emulatora zgodnej z rzeczywistością rozszerzoną.

Konfigurowanie debugowania USB na urządzeniu

Aby uruchamiać aplikacje w trybie debugowania, musisz włączyć na urządzeniu Opcje programisty. Jeśli jeszcze tego nie zrobiono, zapoznaj się z dokumentacją Androida na temat włączania opcji programisty i debugowania USB.

Instalowanie Unity (2020.3 LTS)

Zainstaluj na stacji roboczej Unity 2020 LTS. W tym laboratorium kodów zrzuty ekranu interfejsu Unity pochodzą z wersji 2020.3 (LTS). Inne wersje Unity mogą działać, ale mogą wymagać dodatkowych czynności. Może on wyglądać inaczej niż na zrzutach ekranu.

Utwórz nowy projekt

Utwórz nowy projekt, korzystając z szablonu Universal Render Pipeline. Nadaj mu opisową nazwę i wybierz odpowiednią lokalizację, a następnie kliknij UTWÓRZ.

Zainstaluj wymagane platformy

AR Foundation w Unity znajdziesz w Menedżerze pakietów Unity.

  1. Otwórz go, klikając Window > Package Manager (Okno > Menedżer pakietów).

  1. W tym oknie zainstaluj pakiety, których będziesz używać w tym module. Aby wyświetlić najnowsze wersje tych platform, rozwiń odpowiedni wpis, klikając ikonę . Zainstaluj najnowsze wersje tych platform:
    • AR Foundation
    • Wtyczka ARCore XR

Gdy skończysz, Menedżer pakietów powinien wyglądać mniej więcej tak:

Instalowanie pakietu startowego

Na potrzeby tego ćwiczenia przygotowaliśmy pakiet startowy zawierający prefabrykaty i skrypty, które przyspieszą niektóre części ćwiczenia, dzięki czemu możesz skupić się na tym, jak korzystać z AR Foundation.

  1. Zainstaluj pakiet startowy, otwierając Assets > Import Package > Custom Package... (Zasoby > Importuj pakiet > Własny pakiet...) i otwierając starter-package.unitypackage.
  2. W wyświetlonym oknie upewnij się, że wszystko jest zaznaczone.
  3. Kliknij Importuj.

Zmiana ustawień kompilacji

Ponieważ aplikacja będzie działać na Androidzie, zmień platformę kompilacji na Androida:

  1. Otwórz File > Build Settings (Plik > Ustawienia kompilacji).
  2. W panelu Platforma wybierz Android.
  3. Opcjonalnie włącz Wersję deweloperskąDebugowanie skryptu, aby zachować informacje na potrzeby debugowania podczas działania aplikacji.
  4. Kliknij Przełącz platformę.

Zmiana ustawień projektu

AR Foundation musi być skonfigurowany tak, aby inicjować systemy XR podczas uruchamiania.

  1. Otwórz Edytuj > Ustawienia projektu… i kliknij sekcję Zarządzanie wtyczkami XR.
  2. Na karcie Android włącz ARCore.

  1. W panelu po lewej stronie kliknij sekcję Odtwarzacz.
  2. Na karcie Android w sekcji Inne ustawienia usuń VulkanInterfejsów API grafiki.

  1. Aplikacje wymagające AR korzystające z ARCore wymagają minimalnego poziomu API 24. Przewiń w dół i znajdź Minimalny poziom interfejsu API. Ustaw minimalny poziom API na 24.

Dodawanie wymaganych elementów sceny

Szablon Universal Render Pipeline zawiera kilka obiektów gry, których nie będziesz używać w tym samouczku.

  1. Usuń wszystkie obiekty gry w SampleScene.

  1. Dodaj obiekty AR Foundation. Kliknij prawym przyciskiem myszy panel Hierarchia. Za pomocą tego menu możesz dodać:
  • XR > Sesja AR: ten obiekt kontroluje cykl życia funkcji AR.
  • XR > AR Session Origin: ten obiekt przekształca współrzędne AR na współrzędne świata Unity.
  • Światło > Światło kierunkowe: zapewnia źródło światła do oświetlania obiektów w grze.

Hierarchia powinna wyglądać tak:

  1. Rozwiń w hierarchii utworzony obiekt AR Session Origin i wybierz obiekt AR Camera. W inspektorze zmień tag na MainCamera.

Konfigurowanie renderowania

Aby potok renderowania uniwersalnego Unity był zgodny z AR Foundation, należy wprowadzić w nim jedną zmianę.

  1. W panelu Project (Projekt) przejdź do Assets > Settings (Zasoby > Ustawienia), aby znaleźć komponent ForwardRenderer.

  1. Wybierz ForwardRenderer.
  2. W panelu Inspektora użyj opcji Add Renderer Feature (Dodaj funkcję renderowania), aby dodać AR Background Renderer Feature (Funkcja renderowania tła AR). Ten komponent będzie renderować przekaz z kamery w scenie.

Sprawdzanie konfiguracji

  1. Upewnij się, że urządzenie jest podłączone do zasilania i że debugowanie ADB jest włączone.
  2. Kliknij File > Build And Run... (Plik > Kompiluj i uruchom...). Aplikacja zostanie przesłana na urządzenie i uruchomiona po zainstalowaniu.
  3. Na ekranie urządzenia powinien być widoczny przekaz z kamery.

W następnym kroku zaczniesz dodawać funkcje do aplikacji.

3. Wykrywanie samolotów w rzeczywistym świecie

Po skonfigurowaniu podstawowej sceny możesz rozpocząć tworzenie gry. W tym kroku wykryjesz płaszczyzny i narysujesz je na scenie.

Dodawanie komponentu ARPlaneManager

ARPlaneManager wykrywa ARPlane i tworzy, aktualizuje oraz usuwa obiekty gry, gdy zmienia się sposób, w jaki urządzenie rozumie otoczenie.

  1. W okienku Hierarchia utwórz pustą hierarchię GameObject.
  2. Zmień jego nazwę na Driving Surface Manager. Ten komponent będzie wyświetlać samoloty, dopóki gracz nie wybierze jednego z nich.
  3. Wybierz nowy obiekt gry. W panelu Inspektora kliknij Add Component (Dodaj komponent), aby dodać AR Plane Manager (Menedżer płaszczyzn AR).

  1. Skonfiguruj ARPlaneManager, ustawiając pole Plane Prefab:
    1. Kliknij przycisk obok ikony None, aby otworzyć okno Wybierz obiekt gry.
    2. Wybierz kartę Zasoby i wyszukaj Driving Surface Plane (Płaszczyzna powierzchni jezdnej).

Ten prefab z pakietu startowego zawiera szorstką teksturę podłogi, która będzie używana jako dekoracja płaszczyzny.

  1. Zmień Detection Mode na Horizontal. Ta konfiguracja sprawia, że ARPlaneManager udostępnia tylko płaszczyzny poziome, które są idealne do jazdy.

Dodawanie komponentu ARRaycastManager

ARRaycastManager udostępnia funkcję raycast. W następnym kroku użyjemy tego obiektu, aby udostępnić użytkownikowi elementy sterujące.

  1. Sprawdź, czy w panelu Hierarchia jest wybrany obiekt o nazwie Driving Surface Manager.
  2. W oknie Inspektora kliknij Add Component (Dodaj komponent), aby dodać do obiektu gry komponent ARRaycastManager.

Ten komponent nie wymaga dalszej konfiguracji.

Dodawanie komponentu DrivingSurfaceManager

DrivingSurfaceManager to skrypt pomocniczy z pakietu startowego, który umożliwia wybranie ARPlane. Po wybraniu ARPlane wszystkie inne płaszczyzny zostaną ukryte, a nowe płaszczyzny zostaną wyłączone.

  1. Sprawdź, czy w panelu Hierarchia jest wybrany obiekt o nazwie Driving Surface Manager.
  2. W Inspektorze kliknij Add Component (Dodaj komponent), aby dodać komponent DrivingSurfaceManager do obiektu gry.

Ten komponent nie wymaga dalszej konfiguracji.

Uruchamianie aplikacji

  1. Aby przetestować zmiany, kliknij Plik > Zbuduj i uruchom....
  2. Skieruj urządzenie na poziomą powierzchnię w rzeczywistym świecie i poruszaj nim, aby poprawić rozpoznawanie otoczenia przez ARCore.

  1. Gdy ARCore wykryje płaszczyznę, na powierzchniach w rzeczywistym świecie powinna pojawić się tekstura ziemi. ARPlaneManager tworzy instancję podanego elementu Plane Prefab dla każdego wykrytego samolotu. Prefabrykat Driving Surface Plane ma komponent ARPlaneMeshVisualizer, który tworzy siatkę dla danego obiektu ARPlane.

W kolejnym kroku użyjesz wykrytej płaszczyzny jako pola gry.

4. Przeprowadź test pozycji wskaźnika na wykrytych płaszczyznach

W poprzednim kroku zaprogramowaliśmy aplikację, która potrafi wykrywać samoloty. Te płaszczyzny są odzwierciedlone w scenie gry. Teraz dodasz interaktywność do tych płaszczyzn, tworząc celownik i samochód, który będzie jeździć po wykrytej płaszczyźnie.

Tworzenie siatki celowniczej

Sterowanie w tej aplikacji polega na kierowaniu telefonu na powierzchnię. Aby zapewnić wyraźną informację wizualną o wyznaczonej lokalizacji, użyj siatki celowniczej.

Aby „przykleić” ten celownik do płaszczyzny AR, użyj testu pozycji wskaźnika. Test pozycji wskaźnika to technika obliczania przecięć podczas rzutowania promienia w danym kierunku. Użyjesz testu pozycji wskaźnika, aby wykryć przecięcie w kierunku widoku kamery.

Dodawanie siatki celowniczej

  1. W panelu Project (Projekt) u dołu ekranu przejdź do Assets > Starter Package (Zasoby > Pakiet startowy).
  2. Umieść prefabrykat siatki celowniczej w scenie, przeciągając go do panelu Hierarchia projektu.
  3. Wybierz siatkę celowniczą w hierarchii.
  4. W inspektorze kliknij Add Component (Dodaj komponent). Dodaj skrypt ReticleBehaviour z pakietu startowego. Ten skrypt zawiera kod standardowy do sterowania siatką celowniczą.
  5. Skrypt ReticleBehaviour jest zależny od utworzonego wcześniej skryptu Driving Surface Manager, więc dodaj zależność, klikając selektor Driving Surface Manager. Wybierz kartę Scena i kliknij Driving Surface Manager.

Edytuj ReticleBehaviour

Skrypt ReticleBehavior umieści celownik na płaszczyźnie znajdującej się na środku obszaru widocznego na urządzeniu.

  1. Otwórz skrypt ReticleBehaviour.cs, klikając dwukrotnie pole Script.
  2. Określ środek ekranu za pomocą ViewToScreenPoint kamery. Edytuj metodę Update(), aby dodać te elementy:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
  1. Użyj tego punktu, aby przeprowadzić raycasting. Dodaj te informacje:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);

Zmienna hits będzie zawierać ARRaycastHit, które opisują punkty na śledzonych obiektach, przez które przechodzi ray.

  1. Określ punkt przecięcia, który Cię interesuje, wysyłając zapytanie do listy hits. Priorytetem jest zablokowana płaszczyzna zawarta w DrivingSurfaceManager. Jeśli nie istnieje, użyj pierwszej płaszczyzny, która została trafiona. Na końcu pliku Update() dodaj te informacje:
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);
}
  1. Jeśli hit zawiera wynik, przenieś transformację tego GameObject na pozycję 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

  1. Aby przetestować zmiany, kliknij Plik > Zbuduj i uruchom....
  2. Gdy skierujesz urządzenie na samolot, celownik powinien podążać za ruchami kamery.

Tworzenie samochodu

Gracz będzie sterować zabawką, która będzie jechać w kierunku celownika. Model i zachowanie tego samochodu są dostępne w pakiecie startowym.

Dodawanie CarManager do sceny

  1. hierarchii utwórz nowy pusty obiekt GameObject.
  2. Zmień jego nazwę na Car Spawner.
  3. Wybierz utworzony obiekt. W panelu Hierarchia kliknij Dodaj komponent, aby dodać komponent CarManager.
  4. Skonfiguruj zależności CarManager, klikając selektor w każdym polu:
    • Gotowy element samochodu: w sekcji Komponenty wybierz Gotowy element samochodu.
    • Celownik: w sekcji Scena wybierz Prefabryk celownika.
    • Menedżer powierzchni do jazdy: w sekcji Scena wybierz Menedżer powierzchni do jazdy.

To działanie CarManager powoduje pojawienie się zabawkowego samochodu na płaszczyźnie, na której znajduje się celownik. Jeśli chcesz, możesz sprawdzić CarBehaviourskrypt, aby dowiedzieć się, jak zaprogramowano samochód.

Jazdy próbne

  1. Aby przetestować zmiany, kliknij Plik > Zbuduj i uruchom.
  2. Gdy klikniesz samolot, w tym miejscu powinien pojawić się mały samochód. Samochód będzie podążać za siatką celowniczą.

Dodawanie elementu gry

Teraz, gdy gracz może sterować obiektem na scenie, wyznacz mu miejsce docelowe, do którego ma się udać.

  1. Utwórz nowy pusty obiekt GameObject w hierarchii.
  2. Zmień jego nazwę na Package Spawner.
  3. Wybierz utworzony obiekt. W panelu Hierarchia kliknij Dodaj komponent, aby dodać do niego komponent PackageSpawner.
  4. Skonfiguruj zależności PackageSpawner, klikając selektor w każdym polu:
    • Package Prefab: w sekcji Assets wybierz Package Prefab.
    • Menedżer powierzchni jezdnej: w sekcji Scena wybierz Menedżer powierzchni jezdnej.

To działanie PackageSpawner powoduje utworzenie nowego pakietu w losowej lokalizacji na zablokowanym ARPlane, jeśli nie ma jeszcze pakietu.

Testowanie gry

  1. Aby przetestować zmiany, kliknij Plik > Zbuduj i uruchom. 2. Po utworzeniu samochodu powinien pojawić się pakiet.
  2. Podjedź samochodem do paczki.
  3. Nowy pojawi się w losowym miejscu.

5. Konfigurowanie szacowania oświetlenia

Podstawowa gra jest już gotowa. Teraz dodaj do sceny AR odrobinę realizmu. W tym kroku użyjesz interfejsu ARCore Lighting Estimation API, aby wykryć oświetlenie w rzeczywistym świecie na podstawie przychodzących klatek z kamery. Te informacje będą używane do dostosowywania oświetlenia sceny do oświetlenia w świecie rzeczywistym.

Włącz szacowanie oświetlenia

  1. W sekcji Hierarchia rozwiń Początek sesji AR i wybierz obiekt Kamera AR.
  2. W Inspektorze rozwiń skrypt AR Camera Manager.
  3. Zmień pole Szacowanie oświetlenia na Wszystko.

Modyfikowanie światła kierunkowego

  1. W sekcji Hierarchia wybierz obiekt Światło kierunkowe.
  2. Dodaj do niego komponent LightEstimation. Ten komponent z pakietu startowego zawiera kod do subskrybowania zmian oświetlenia.
  3. 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

  1. Aby przetestować zmiany, kliknij Plik > Zbuduj i uruchom.
  2. Obiekty w scenie mogą mieć różne kolory w zależności od oświetlenia otoczenia.
  3. Jeśli to możliwe, spróbuj zmienić oświetlenie. Spróbuj na przykład wyłączyć światło w pomieszczeniu, w którym się znajdujesz. Oświetlenie obiektów powinno dostosować się do zmiany oświetlenia w rzeczywistości.

6. Podsumowanie

Gratulacje! Udało Ci się dotrzeć do końca tego ćwiczenia z zakresu Unity AR Foundation.

Omówione zagadnienia

  • Jak skonfigurować podstawowy projekt za pomocą AR Foundation i Universal Rendering Pipeline w Unity.
  • Jak używać ARPlaneManager do subskrybowania nowych samolotów.
  • Jak używać funkcji Raycast do znajdowania przecięć z wirtualną geometrią.
  • Jak używać ARLightEstimationData do oświetlania sceny.

Dalsze kroki

Dodatkowe zadania

Jeśli chcesz rozwinąć utworzoną grę, możesz skorzystać z tych pomysłów:

  • Dodaj licznik punktów do gry, modyfikując TextMeshPro, gdy PackageManager tworzy nowy pakiet.
  • Gdy gra jest uruchomiona, możesz sprawdzić informacje o wydajności, włączając nakładkę wydajności.
  • Użyj opcji Persistent Raycasts, aby najpierw umieścić nowe obiekty w scenie. Gdy w tym obszarze zostanie wykryta płaszczyzna, obiekt zostanie do niej przyciągnięty.