Google jest zaangażowany w promowanie równości rasowej dla społeczności czarnych. Zobacz jak.
Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Zapoznaj się z przykładowym kodem aplikacji HelloAR

Zanurz się w przykładowym kodzie aplikacji ARCore SDK dla Unity, aby dowiedzieć się, jak składniki SDK działają w scenie AR.

Wymagania wstępne

W tym przewodniku założono, że pobrałeś i zainstalowałeś ARCore SDK dla Unity. Jeśli dopiero zaczynasz korzystać z zestawu SDK, najpierw zapoznaj się z przewodnikiem Szybki start dla zestawu SDK ARCore dla aparatu Unity .

Zapoznaj się z przykładową aplikacją

Przyjrzyj się składnikom SDK w przykładowej scenie HelloAR .

  1. W oknie projektu Unity przejdź do opcji Zasoby > GoogleARCore > Przykłady > HelloAR > Sceny > HelloAR .

  2. Kliknij dwukrotnie scenę HelloAR , aby ją otworzyć.

  3. Użyj okna Hierarchia, aby rozpocząć nawigację po przykładowej scenie. Znajdziesz następujące obiekty w grze ARCore:

    Obiekt gry Opis
    Urządzenie ARCore Szkieletowe który zarządza sesję ARCORE.

    Trzyma obiekt gry First Person Camera , który wykorzystuje kamerę z tyłu urządzenia do przechwytywania obrazów ze świata rzeczywistego i udostępniania ich jako tła sceny AR.
    Światło środowiskowe Prefabrykat, który dostosowuje oświetlenie w scenie AR na podstawie szacunkowej średniej jasności pikseli w obrazie przechwytywanym przez aparat. Aby to zrobić, w każdej klatce:
    Chmura punktów Prefabrykaty dla punktów charakterystycznych wykrytych w bieżącej ramce.
    Kontroler HelloAR Obiekt gry, którego skrypt kontrolera zarządza sceną AR.
    Skrypt kontrolera zawiera odniesienia do kamery z perspektywy pierwszej osoby i kilku gotowych elementów.
    PlaneDiscovery Prefabrykat, który zapewnia wizualizacje odkrywania samolotów, które pomagają użytkownikom skanować otoczenie i odkrywać samoloty. Składa się z animacji ręki trzymającej urządzenie oraz batonika z krótkimi instrukcjami, które wskazują, jak nim poruszać, aby wykryć punkty charakterystyczne. Te punkty funkcji mają efekt wyskakującego okienka, aby zapewnić informację zwrotną, gdy zostaną wykryte. Jeśli po pewnym czasie nie zostanie znaleziony żaden samolot, na pasku przekąskowym zostanie wyświetlony przycisk umożliwiający otwarcie okna pomocy z bardziej szczegółowymi instrukcjami, jak poprawić wrażenia z rzeczywistości rozszerzonej po naciśnięciu.

Poznaj kod

Teraz, gdy masz już pojęcie o głównych obiektach gry ARCore w przykładowej scenie, przejdź przez kod, który sprawia, że ​​współpracują ze sobą.

Skrypt HelloARController implementuje krytyczne aspekty środowiska przykładowej aplikacji ARCore.

Uzyskaj dostęp do kodu

  1. W scenie HelloAR kliknij obiekt gry HelloAR Controller .

  2. W oknie Inspector kliknij HelloARController skrypt HelloARController aby otworzyć go w edytorze.

Przejdź przez kod

Spójrz na kod. W skrypcie HelloARController metoda Update() obsługuje krytyczne zadania w każdej klatce:

Sprawdź śledzenie ruchu

  • Śledzenie ruchu zapewnia wykrywanie płaszczyzny. Metoda Update() wywołuje metodę _UpdateApplicationLifecycle() celu sprawdzenia śledzenia ruchu. Poniższy kod znajduje się w _UpdateApplicationLifecycle() :
  // Check that motion tracking is tracking.
  if (Session.Status != SessionStatus.Tracking)
  {
      Screen.sleepTimeout = SleepTimeout.SystemSetting;
  }
  else
  {
      Screen.sleepTimeout = SleepTimeout.NeverSleep;
  }

Wykrywaj nowe i istniejące samoloty w prawdziwym świecie

  • ARCore szuka nowych samolotów do śledzenia na prawdziwej scenie światowej.

  • Prefabrykat PlaneDiscovery wyświetli przewodnik wizualny, o ile nowe i istniejące samoloty nie zostaną jeszcze wykryte. Gdy śledzony jest co najmniej jeden samolot, interfejs przewodnika jest ukrywany.

Przetwarzaj dane wejściowe użytkownika w celu umieszczania obiektów wirtualnych

Po śledzeniu samolotów metoda Update() obsługuje dane wejściowe użytkownika dotyczące umieszczania obiektów pionków ARCore na wykrytych płaszczyznach.

  • Gdy użytkownik dotyka ekranu, Frame.Raycast() wykorzystuje raycast z pozycji dotknięcia, aby wykryć, czy użytkownik dotknął płaszczyzny, czy zorientowanych punktów .

  • Jeśli użytkownik dotknie płaszczyzny lub powierzchni zorientowanych punktów, wówczas obiekt pionka ARCore jest tworzony w pozie TrackableHit której użytkownik uderzył.

  • Pozycja trafienia służy do tworzenia Kotwicy .

    • Kotwica utrzymuje obiekt gry AR w tej samej pozycji w stosunku do świata rzeczywistego.
    • Kiedy już nie potrzebujesz kotwicy, wywołaj na niej metodę GameObject Destroy() Unity. To sygnalizuje ARCore, aby przestał śledzić kotwicę.
  • Stanowisko aparat jest używany do regulacji ARCORE pionek na przekształcenia tak, że jest pionkiem w spójny orientacji względem caemra

  • Transformacja pionka dziedziczy kotwicę trafienia, tak że pionek pozostaje w miejscu, w którym umieścił go użytkownik, gdy użytkownik porusza telefonem.

// Raycast against the location the player touched to search for planes.
TrackableHit hit;
TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinPolygon |
    TrackableHitFlags.FeaturePointWithSurfaceNormal;

if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
    // Use hit pose and camera pose to check if hittest is from the
    // back of the plane, if it is, no need to create the anchor.
    if ((hit.Trackable is DetectedPlane) &&
        Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
            hit.Pose.rotation * Vector3.up) < 0)
    {
        Debug.Log("Hit at back of the current DetectedPlane");
    }
    else
    {
        // Instantiate prefab at the hit pose.
        var gameObject = Instantiate(prefab, hit.Pose.position, hit.Pose.rotation);

        // Compensate for the hitPose rotation facing away from the raycast (i.e.
        // camera).
        gameObject.transform.Rotate(0, _prefabRotation, 0, Space.Self);

        // Create an anchor to allow ARCore to track the hitpoint as understanding of
        // the physical world evolves.
        var anchor = hit.Trackable.CreateAnchor(hit.Pose);

        // Make game object a child of the anchor.
        gameObject.transform.parent = anchor.transform;
    }
}