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ą 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

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.

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

  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. Otwórz Plik > Ustawienia kompilacji.
  2. W panelu Platforma kliknij Android.
  3. Opcjonalnie włącz Kompilację dla programistów i Debugowanie skryptów, aby zachować informacje debugowania podczas działania aplikacji.
  4. Kliknij Przełącz platformę.

Zmień ustawienia projektu

Aby inicjować systemy XR podczas uruchamiania, musisz skonfigurować AR Foundation.

  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ń interfejs Vulkan z interfejsu Graphics API.

  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 uniwersalnego potoku renderowania zawiera obiekty 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 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:

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

  1. W panelu Projekt wybierz kolejno Zasoby > Settings, 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 uruchomienie jej 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 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.

  1. W panelu Hierarchia utwórz pusty element GameObject.
  2. Zmień nazwę na Driving Surface Manager. Ten komponent wyświetla płaszczyzny, dopóki odtwarzacz nie wybierze ich.
  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 obok None, aby otworzyć okno Select GameObject (Wybierz obiekt GameObject).
    2. Wybierz kartę Zasoby i wyszukaj Powierzchnia miejska.

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

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

  1. Upewnij się, że w panelu Hierarchia wybrany jest obiekt o nazwie Driving Surface Manager.
  2. 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.

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

Ten komponent nie wymaga dalszej konfiguracji.

Uruchom aplikację

  1. Kliknij Plik > Utwórz i uruchom..., by przetestować zmiany.
  2. Skieruj urządzenie na poziomą powierzchnię świata i poruszaj nim, aby lepiej zrozumieć świat za pomocą ARCore.

  1. Gdy ARCore wykryje samolot, na powierzchniach w świecie rzeczywistym powinna pojawić się tekstura brukowa. ARPlaneManager tworzy wystąpienie podanego Plane Prefab dla każdej wykrytej platformy. Prefabryka Driving Surface Plane zawiera komponent ARPlaneMeshVisualizer, który tworzy siatkę dla danego elementu typu 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ść 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ę

  1. W panelu Projekt u dołu ekranu kliknij Zasoby > Pakiet startowy.
  2. Umieść Prefab siatki na scenie, przeciągając ją do panelu Hierarchia projektu.
  3. Wybierz siatkę w hierarchii.
  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 umieści siatkę na płaszczyźnie, która znajduje się na środku widocznego obszaru urządzenia.

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

  1. Określ ciekawe miejsce, wysyłając zapytanie o listę hits. Nadaj priorytet zablokowanej płaszczyźnie zawartej w DrivingSurfaceManager, a jeśli ona nie istnieje, użyj pierwszego trafienia na płaszczyznę. Na końcu Update() 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);
}
  1. Jeśli hit zawiera wynik, przenieś przekształcenie tego elementu GameObject 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

  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.

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

  1. W Hierarchii utwórz nowy pusty element 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 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

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

  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, by dodać do niego komponent PackageSpawner.
  4. 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ę

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

  1. W sekcji Hierarchia rozwiń Początek 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 mają one kolor zależny 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ś. 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

Dodatkowe przypisania

Jeśli chcesz rozwinąć utworzoną tutaj grę, możesz wykorzystać te pomysły:

  • Dodaj do gry licznik wyników, modyfikując TextMeshPro, gdy PackageManager 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.