Tworzenie gry AR przy użyciu Fundacji AR Unity

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

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.

  1. Otwórz go, klikając Okno > Menedżer pakietów.

  1. 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.

  1. Zainstaluj pakiet startowy, otwierając Zasoby > Importuj pakiet > Pakiet niestandardowy... otwieram starter-package.unitypackage.
  2. Sprawdź w oknie, które się pojawi.
  3. Kliknij Importuj.

Zmień ustawienia kompilacji

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

  1. Kliknij Plik > Ustawienia kompilacji.
  2. W panelu Platforma kliknij Android.
  3. Opcjonalnie możesz włączyć kompilację deweloperskądebugowanie skryptu, aby zachować informacje debugowania podczas działania aplikacji.
  4. Kliknij Przełącz platformę.

Zmiana ustawień projektu

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

  1. Otwórz kolejno Edycja > Ustawienia projektu... i kliknij sekcję XR Plug-in Management.
  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ń Vulkan z sekcji Interfejsy API grafiki.

  1. 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.

  1. Usuń wszystkie obiekty gry w: SampleScene.

  1. 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:

  1. 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.

  1. W panelu Projekt przejdź do Zasoby > Ustawienia, aby znaleźć zasób ForwardRenderer.

  1. Wybierz ForwardRenderer.
  2. 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

  1. Sprawdź, czy urządzenie jest podłączone i czy debugowanie ADB jest włączone.
  2. Kliknij Plik > Utwórz i uruchom... Spowoduje to przesłanie aplikacji na urządzenie i jej uruchomienie po zainstalowaniu.
  3. 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.

  1. W panelu Hierarchia utwórz pustą GameObject.
  2. Zmień nazwę na Driving Surface Manager. Ten komponent wyświetla samoloty, dopóki gracz nie wybierze jednego z nich.
  3. Wybierz nowy obiekt gry. W panelu Inspektor kliknij Dodaj komponent, by dodać menedżera platformy AR.

  1. Skonfiguruj ARPlaneManager przez ustawienie pola Plane Prefab:
    1. Kliknij przycisk None, aby otworzyć okno Wybierz obiekt gry.
    2. Wybierz kartę Zasoby i wyszukaj Płaszczyznę jezdni.

Ta prefabryka z pakietu startowego zawiera surową teksturę podłogową, która będzie używana jako dekoracja samolotu.

  1. Zmień Detection Mode na Horizontal. Konfiguruje to ARPlaneManager 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.

  1. Sprawdź, czy w panelu Hierarchia jest wybrany obiekt o nazwie Driving Surface Manager.
  2. 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.

  1. Upewnij się, że w panelu Hierarchia wybrany jest obiekt o nazwie Driving Surface Manager.
  2. W panelu Inspekcja kliknij Dodaj komponent, aby dodać do obiektu w grze komponent DrivingSurfaceManager.

Ten komponent nie wymaga dalszej konfiguracji.

Uruchamianie aplikacji

  1. Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
  2. Skieruj urządzenie na poziomą powierzchnię w rzeczywistym świecie i poruszaj nim, aby ARCore lepiej poznało otoczenie.

  1. Gdy ARCore wykryje samolot, na powierzchniach w świecie rzeczywistym powinna pojawić się tekstura brukowa. ARPlaneManager tworzy instancję danego Plane Prefab dla każdego wykrytego samolotu. Prefab Driving Surface Plane zawiera komponent ARPlaneMeshVisualizer, który tworzy siatkę dla danego ARPlane.

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ę

  1. W panelu Projekt u dołu ekranu kliknij Zasoby > Pakiet startowy.
  2. Umieść w scenie predefiniowany celownik, przeciągając go do panelu Hierarchia projektu.
  3. W hierarchii wybierz siatkę.
  4. W inspektorze kliknij Dodaj komponent. Dodaj skrypt ReticleBehaviour z pakietu startowego. Ten skrypt zawiera schemat do sterowania siatką.
  5. Skrypt ReticleBehaviour zależy od utworzonej wcześniej Driving Surface Manager, więc dodaj zależność, klikając selektor Driving Surface Manager. Kliknij kartę Scena i wybierz Driving Surface Manager.

Edytuj ReticleBehaviour

Skrypt ReticleBehavior ustawia krzyżyk na płaszczyźnie, która znajduje się w środku widoku urządzenia.

  1. Otwórz skrypt ReticleBehaviour.cs, klikając dwukrotnie pole Script.
  2. 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));
  1. 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.

  1. Określ interesujący punkt przecięcia, wysyłając zapytanie do listy hits. Nadaj priorytet samolotowi zamkniętemu w elementach DrivingSurfaceManager. Jeśli go nie ma, użyj pierwszego znalezionego samolotu. Dodaj te informacje na końcu pliku Update():
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, 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

  1. Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
  2. 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

  1. W sekcji Hierarchia utwórz nową pustą GameObject.
  2. Zmień nazwę na Car Spawner.
  3. Wybierz utworzony obiekt. W panelu Hierarchia kliknij Dodaj komponent, by dodać komponent CarManager.
  4. 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

  1. Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany.
  2. 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.

  1. Utwórz nowy pusty element GameObject w hierarchii.
  2. Zmień 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:
    • 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

  1. Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany. 2. Po utworzeniu samochodu powinien pojawić się pakiet.
  2. Zabierz samochód do paczki.
  3. 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

  1. W sekcji Hierarchia rozwiń Pochodzenie sesji AR i wybierz obiekt Kamera AR.
  2. W narzędziu Inspektor rozwiń skrypt Menedżer aparatu AR.
  3. W polu Szacowanie oświetlenia zmień wartość na Wszystko.

Zmień światło kierunkowe

  1. W sekcji Hierarchia wybierz obiekt Światło kierunkowe.
  2. Dodaj do niego komponent LightEstimation. Ten komponent z pakietu startowego zawiera schemat, który umożliwia zasubskrybowanie zmian w oświetleniu.
  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. Kliknij Plik > Utwórz i uruchom, aby przetestować zmiany.
  2. Patrząc na obiekty w kadrze, możesz zauważyć, że są one kolorowe 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 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

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, gdy PackageManager 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.