Freigeben über


QR-Codes in Unity

HoloLens 2-Headsets können QR-Codes nachverfolgen und erkennen, mit denen Hologramme und andere AR-Features bereitgestellt werden können. Dieser Artikel führt Sie durch alles, was Sie wissen müssen, um mit der Verwendung von QR-Codes in Ihrer Unity-App zu beginnen, einschließlich:

  • Hinzufügen der QR-Codeerkennung zu Ihrer Unity-App.
  • Grundlegendes zu wichtigen Konzepten und Unity-Komponenten, die Sie verwenden müssen.
  • Enthält Lernprogramme, die allgemeine VERWENDUNG von QR-Code abdecken.
  • Führt das AR Marker-Beispielszenario ein, das eine QR-codefähige Szene und Beispielskripts veranschaulicht.

Bevor Sie mit diesem Artikel fortfahren, empfehlen wir, die Übersicht über QR-Codes zu durchlaufen.

Nachverfolgter QR-Code

Konfigurieren Ihres Unity-Projekts und Ihrer App

Ihr Unity-Projekt und Ihre App müssen eingerichtet und ordnungsgemäß konfiguriert werden, um die QR-Codefunktionalität zu aktivieren, was Folgendes erfordert:

  • OpenXR für Windows Mixed Reality, Version 113.2403.5001 oder höher.

    Hinweis

    Dies ist im Lieferumfang des Betriebssystems und kann über den Windows Store aktualisiert werden. Bitte beachten Sie, dass Benutzer möglicherweise frühere Versionen installiert haben, und ihre Geräte können nicht mit AR-Markern wie QR-Codes arbeiten, bis sie auf Version 113.2403.5001 oder höher aktualisiert werden.

  • Ein Projekt, das mit einer unterstützten Version von Unity kompatibel ist:
    • Unity 2022.3 LTS (Empfohlen)
    • Unity 2021.3 LTS
  • Das Mixed Reality OpenXR-Plug-In.
  • Webcam-Funktionen, die für Ihr Unity-Projekt aktiviert sind.
  • Kameraberechtigungen, die Ihrer App erteilt wurden.

In den folgenden Abschnitten erfahren Sie, wie Sie Ihr Unity-Projekt und Ihre App konfigurieren, um die QR-Codeerkennung zu ermöglichen.

Abrufen des Mixed Reality OpenXR-Plug-Ins

Das OpenXR-Plug-In-Paket für Mixed Reality enthält C#-APIs , die Sie für den Zugriff auf QR-Codefunktionen verwenden können.

So importieren Sie das Paket:

  1. Laden Sie das Mixed Reality-Featuretool herunter , und führen Sie es aus.
  2. Installieren Sie das OpenXR-Plug-In.

Das Mixed Reality-Featuretool vereinfacht auch die Paketverwaltung und kann verwendet werden, um die Mixed Reality-Features zu finden, zu aktualisieren und hinzuzufügen, die Ihre App benötigt. Ausführliche Anweisungen zur Verwendung des Tools finden Sie unter "Willkommen beim Mixed Reality Feature Tool ".

Aktivieren von WebCam-Funktionen

Um QR-Codes zu erkennen und nachzuverfolgen, muss Ihr Unity-Projekt WebCam-Funktionen aktiviert haben.

So aktivieren Sie WebCam-Funktionen :

  1. Öffnen Sie Ihr Unity-Projekt.
  2. Klicken Sie im App-Menü des Unity-Editors auf "Bearbeiten ".
  3. Wechseln Sie zu Project Settings > Player , und wählen Sie die UWP-Registerkarte wie gezeigt aus: UWP-Registerkarteneinstellungen
  4. Aktivieren Sie WebCam in der Liste "Funktionen" . WebCam-Funktionen aktiviert
  5. Beenden Sie die Projekteinstellungen.

WebCam-Funktionen sind jetzt für Ihre Unity-App aktiviert. Ihre App muss jedoch weiterhin Berechtigungen für den Zugriff auf die Gerätekamera erhalten.

Gewähren von Zugriffsberechtigungen für Die App-Kamera

Wenn Ihre App WebCam-Funktionen aktiviert hat, fordert das Berechtigungsdialogfeld Benutzer auf, Ihrer App Zugriff auf die Gerätekamera zu gewähren.

Dialogfeld

Dieses Dialogfeld wird Benutzern nur einmal angezeigt, in der Regel beim Eingeben einer Szene mit aktivierter ARMarkerManager QR-Codemarkierung. Wenn der Kamerazugriff verweigert wird, können Benutzer zu "Einstellungen>"-Apps wechseln und ihn über die erweiterten Optionen der App aktivieren.

Erweiterte App-Optionen mit aktivierten Berechtigungen

Erstellen der QR-Codeerkennung in einer Szene

Die QR-Codeerkennung muss in jede Szene integriert werden, in der Sie QR-Codes verwenden möchten, in denen Folgendes erforderlich ist:

  • A GameObject mit ARMarkerManager angefügtem Wert. ARMarkerManager ist allein für das Erstellen, Aktualisieren und Entfernen aller GameObject erkannten QR-Codes verantwortlich.
  • Ein Prefab mit ARMarker angefügtem Vorformat.
  • ARMarkerManager konfiguriert, um den Prefab beim Erstellen eines GameObject QR-Codes zu verwenden.

Erstellen eines Prefabs für QR-Codes

Um QR-Codes in Ihrer Szene zu verwenden, müssen Sie ein Prefab für QR-Codes erstellen. ARMarkerManager verwendet diesen Prefab, um ein GameObject Element zu erstellen, aus dem immer ein QR-Code erkannt wird.

So erstellen Sie einen Prefab für QR-Codes:

  1. Erstellen Sie einen neuen Vorabab für Ihr Projekt.
  2. Fügen Sie die ARMarkerKomponente zum Prefab hinzu, die sich unter Script > Microsoft.MixedReality.OpenXR > ARMarker befindet.
    Hinzufügen der ARMarker-Komponente

Sie verfügen jetzt über einen grundlegenden Prefab, mit dem Sie arbeiten können. Sie möchten wahrscheinlich, dass Ihre App QR-Codes visuell darstellt, die in der Umgebung erkannt werden. Im nächsten Abschnitt erfahren Sie, wie Sie eine visuelle Darstellung für QR-Codes hinzufügen.

Hinzufügen von visuellen Elementen

Im vorherigen Abschnitt wurde ARMarkerdie ARMarkerScale Komponente automatisch zum Prefab hinzugefügt. Diese Komponente wird verwendet, um die visuelle Darstellung eines QR-Codes mit seinem physischen Gegenstück abzugleichen.

Dazu gehen Sie wie folgt vor:

  1. Fügen Sie dem im vorherigen Abschnitt erstellten Prefab eine leere GameObject Datei hinzu. Er stellt alle visuellen Markierungsinhalte dar.
  2. Fügen Sie dem Markierungsinhalt GameObjecteinen untergeordneten 3D-Code GameObjecthinzu, z. B. ein QuadElement. Hinzufügen von 3D GameObject zu ARMarker Prefab
  3. Legen Sie in der Komponente prefab ARMarkerScale die Markerskalatransformation auf den Markierungsinhalt GameObjectfest. Wenn Sie dieses Feld festlegen, wird sichergestellt, dass die von Ihnen ausgewählte 3D GameObject korrekt skaliert wird, um den qr-Codes der realen Welt zu entsprechen.

Hinzufügen ARMarkerManager zu einer Szene

ARMarkerManager ist allein für das Erstellen, Aktualisieren und Entfernen aller GameObject erkannten QR-Codes verantwortlich.

So fügen Sie Ihrer Szene folgendes hinzu ARMarkerManager :

  1. Platzieren Sie einen GameObject Platz in Ihrer Szene.
  2. Fügen Sie die ARMarkerManager Komponente zum GameObjectSkript > Microsoft.MixedReality.OpenXR > ARMarkerManager hinzu.
    Hinzufügen der ARMarkerManager-Komponente
  3. Legen Sie das ARMarkerManager Feld "Marker Prefab " auf den prefab fest, den Sie im vorherigen Abschnitt erstellt haben. Marker Prefab-Feldsatz
  4. Erweitern Sie aktivierte Markierungstypen, und wählen Sie dann ein Element aus, und legen Sie es auf QR-Code fest. QR-Code-Markierungstyp aktiviert

Nachverfolgen von QR-Codeänderungen

ARMarkerManager enthält das markersChanged Ereignis, das Abonnenten bereitstellt ARMarkersChangedEventArgs . Verwenden Sie diese Ereignisargumente, um nachzuverfolgen, welche QR-Codes aus erkennungs- oder aktualisierten Posendaten hinzugefügt oder entfernt werden.

Der folgende Code veranschaulicht das Abonnieren des ARMarkerManager.markersChanged Ereignisses mithilfe der zugehörigen Ereignisargumente, um die ARMarker Objekte ARMarkerManager zu durchlaufen und zu Debuggen zu schreiben, unabhängig davon, ob sie hinzugefügt, entfernt oder aktualisiert werden.

using System;
using Microsoft.MixedReality.OpenXR;

// ...

private void Awake()
{
    m_arMarkerManager = GetComponent<ARMarkerManager>();
    m_arMarkerManager.markersChanged += OnQRCodesChanged;
}

void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
    foreach (ARMarker qrCode in args.added)
        Debug.Log($"QR code with the ID {qrCode.trackableId} added.");

    foreach (ARMarker qrCode in args.removed)
        Debug.Log($"QR code with the ID {qrCode.trackableId} removed.");

    foreach (ARMarker qrCode in args.updated)
    {
        Debug.Log($"QR code with the ID {qrCode.trackableId} updated.");
        Debug.Log($"Pos:{qrCode.transform.position} Rot:{qrCode.transform.rotation} Size:{qrCode.size}");
    }
}

Abrufen der Zeit, zu der ein QR-Code zuletzt erkannt wurde

Verwenden Sie die ARMarker.lastSeenTime Eigenschaft, um zu bestimmen, wann das Gerät zuletzt einen erkannten QR-Code nachverfolgt hat und wie lange die Nachverfolgung verloren geht. Die Zeit wird in der Anzahl der Sekunden gemessen, seit Unity Ihre Anwendung gestartet hat und analog zu UnityEngine.Time.realtimeSinceStartup.

Verwenden der nachverfolgbaren ID eines QR-Codes

QR-Codes sind Trackables, bei denen es sich um alles handelt, was ein AR-Gerät in einer physischen Umgebung erkennen und nachverfolgen kann. Trackables werden vom Typ ARTrackable<TSessionRelativeData, TTrackable> abgeleitet, der eine ID, einen Nachverfolgungsstatus, eine Pose und andere Daten bereitstellt.

Die nachverfolgbare ID für einen QR-Code kann in ARMarkerManager Methoden übergeben werden, um die Eigenschaften des QR-Codes, unformatierte Bytedaten und Zeichenfolgendarstellung abzurufen und den Transformationsmodus für den QR-Code festzulegen. Mit diesen Methoden können Sie Daten für einen QR-Code abrufen, ohne sich an einen ARMarker Objektverweis halten zu müssen.

Sie können die ID eines QR-Codes an die folgenden ARMarkerManager Methoden übergeben:

Hinweis

Für den GetRawData Methodenparameter allocatorreicht die Übergabe Unity.Collections.Allocator.Temp für die meisten Szenarien aus.

Folgen des Nachverfolgungszustands eines QR-Codes

Da ein ARMarker Nachverfolgbarer Wert ist, erbt er die trackingState Eigenschaft und wird auf einen von drei UnityEngine.XR.ARSubsystems.TrackingStatefestgelegt:

  • Limited: Gibt an, dass der QR-Code nachverfolgt wird, aber begrenzte Informationen verfügbar sind oder von schlechter Qualität sind.
  • Tracking: Gibt an, dass der QR-Code vollständig nachverfolgt wird.
  • None: Gibt an, dass der QR-Code nicht nachverfolgt wird.

Um den Nachverfolgungsstatus für einen QR-Code zu überwachen, abonnieren Sie die ARMarkerManager.markersChanged Markierungssammlungen, die ARMarker in den Ereignisargumenten angegeben sind, die an den Ereignishandler übergeben werden.

Der folgende Code veranschaulicht die Verwendung des Ereignisses zum Durchlaufen von ARMarkerManager.markersChanged ARMarker Objekten für neu erkannte QR-Codes und das Schreiben ihrer nachverfolgbaren ID in das Debugfenster.

using System;
using Microsoft.MixedReality.OpenXR;

// ...

private void Awake()
{
    m_arMarkerManager = GetComponent<ARMarkerManager>();
    m_arMarkerManager.markersChanged += OnQRCodesChanged;
}

void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
    foreach (ARMarker qrCode in args.added)
    {
       if (qrCode.trackingState == UnityEngine.XR.ARSubsystems.TrackingState.Tracking)
           Debug.Log($"Fully tracked QR code with the ID {qrCode.trackableId} was added.");
    }
}

Abrufen der Version und des QR-Codetyps eines QR-Codes

So rufen Sie die Version und den Typ eines erkannten QR-Codes ab:

  1. Aufruf ARMarker.GetQRCodeProperties(), der eine QRCodeProperties Instanz zurückgibt.
  2. Greifen Sie auf das Feld QRCodeProperties im Rückgabewert zu, um den Typ des QR-Codes abzurufen. Der Wert lautet entweder QRCodeType.QRCode oder QRCodeType.MicroQRCode.
  3. Greifen Sie auf das Feld des Rückgabewerts QRCodeProperties.version zu, um die Version des QR-Codes abzurufen. Der Wert reicht von 1 bis 40, wenn der Typ lautet QRCodeType.QRCode, und von 1 bis 4, wenn der Typ lautet QRCodeType.MicroQRCode.

Übergeben Sie alternativ die nachverfolgbare ID eines ARMarker Objekts, um ARMarkerManager.GetQRCodeProperties(TrackableId) den Typ und die Version eines QR-Codes abzurufen.

Warnung

QR-Codes sind der einzige Markertyp, der derzeit unterstützt wird, obwohl die Unterstützung für andere Markertypen in zukünftigen Versionen hinzugefügt werden kann. Wenn markerType nicht ARMarkerType.QRCode, wird der Aufruf GetQRCodeProperties(TrackableId) ausgelöst System.InvalidOperationException. Erwägen Sie das Umschließen von Aufrufen GetQRCodeProperties(TrackableId) in Try-Catch-Blöcke, wenn dies zu Problemen in Ihrer App später führen könnte.

Lesen von QR-Daten

Die ARMarker Komponente ist an jedes GameObject Element angefügt, das ARMarkerManager erstellt wird. ARMarker stellt zwei Methoden bereit, die QR-Codedaten zurückgeben:

  • GetDecodedString(): Diese Methode ruft die Zeichenfolgendarstellung des QR-Codes ab, z. B. eine URL.

  • GetRawData(Unity.Collections.Allocator allocator): Diese Methode gibt QR-Codeinhalte als Bytearray zurück, wodurch feinkörnige Optimierungen hinsichtlich der Zuordnung des Arrays ermöglicht werden. Verwenden Sie diese Methode in heißen Pfaden und anderen Situationen, in denen die Leistung kritisch ist.

Der folgende Code veranschaulicht die grundlegende Verwendung von GetDecodedString() und GetRawData(Unity.Collections.Allocator allocator):

using System;
using Microsoft.MixedReality.OpenXR;

// ...

void OnQRCodesChanged(ARMarkersChangedEventArgs args)
{
    foreach (ARMarker qrCode in args.added)
    {
        var text = qrCode.GetDecodedString();
        Debug.Log($"QR code text: {text}");

        var bytes = qrCode.GetRawData(Unity.Collections.Allocator.Temp);
        Debug.Log($"QR code bytes: {bytes.Length}");
        bytes.Dispose();
    }
}

Abrufen der QR-Codegröße, -Position, -Drehung und -Mitte

Ein ARMarker Objekt stellt die Größe, Position, Drehung und Mitte des QR-Codes bereit, den es darstellt.

Verwenden Sie die Eigenschaft ARMarker.size, um die Größe des QR-Codes in Metern abzurufen.

Verwenden Sie die ARMarker.transform Eigenschaft, um die Drehungs- und Weltraumposition der Transformation des QR-Codes und ARMarker.center die 2D-Koordinaten des QR-Codes relativ zur Transformation des QR-Codes abzurufen. Die Transformation selbst wird zentriert, je nachdem, ob ARMarker.transformMode (der Transformationsmodus) auf TransformMode.MostStable (stabil, oben links) oder TransformMode.Center (zentriert, die geometrische Mitte des QR-Codes) festgelegt ist.

Verwenden Sie das ARMarkerManager.defaultTransformMode Feld, um den Transformationsmodus ARMarkerManager festzulegen, mit dem neue ARMarker Objekte erstellt werden. Das Feld wird mit dem Default Transform Mode Feld initialisiert, wie gezeigt im Unity Inspector festgelegt ist:

The ARMarkerManager Component's Default Transform Mode Inspector Field

Als Alternative zur Verwendung ARMarker.transformModeübergeben Sie die nachverfolgbare ID eines ARMarker Objekts, um ARMarkerManager.SetTransformMode(TrackableId, TransformMode) den Transformationsmodus festzulegen.

Der folgende Code veranschaulicht das Abrufen der Größe und Mitte eines neuen QR-Codes, die Position und Drehung der Transformation und die aktualisierte Transformationsposition nach dem Ändern des Transformationsmodus.

using System;
using Microsoft.MixedReality.OpenXR;

// ...

void OnMarkersChanged(ARMarkersChangedEventArgs args)
{
    Debug.Log($"Default transform mode is {ARMarkerManager.Instance.defaultTransformMode}./n");

    if (e.added.Count > 0)
    {
        ARMarker qrCode = args.added[0];

        Debug.Log($"Position: {qrCode.transform.position}");
        Debug.Log($"Rotation: {qrCode.transform.rotation}");
        Debug.Log($"Center: {qrCode.center}");

        if (qrCode.transformMode == TransformMode.Center)
            qrCode.transformMode = TransformMode.MostStable;
        else
            qrCode.transformMode = TransformMode.Center;

        Debug.Log($"QR code's transform mode is now set to {qrCode.transformMode}. /n");
        Debug.Log($"New position: {qrCode.transform.position}");
    }
}

Beispielszenario für AR-Markierungen

Das Beispiel, das mit dem OpenXR-Plug-In-Paket bereitgestellt wird, enthält eine QR-Code-fähige Szene, die ein Beispiel für ARMarkerManager die Verwendung und ARMarker Verwendung bietet.

Die Szene befindet sich in "Assets > ARMarker ", wie gezeigt: ARMarker-Szenenobjektspeicherort

Die in der Szene verwendeten C#-Skripts finden Sie im OpenXR Unity Mixed Reality Samples-Repository auf GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts

Siehe auch