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.
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:
- Laden Sie das Mixed Reality-Featuretool herunter , und führen Sie es aus.
- 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 :
- Öffnen Sie Ihr Unity-Projekt.
- Klicken Sie im App-Menü des Unity-Editors auf "Bearbeiten ".
- Wechseln Sie zu Project Settings > Player , und wählen Sie die UWP-Registerkarte wie gezeigt aus:
- Aktivieren Sie WebCam in der Liste "Funktionen" .
- 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.
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.
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
mitARMarkerManager
angefügtem Wert.ARMarkerManager
ist allein für das Erstellen, Aktualisieren und Entfernen allerGameObject
erkannten QR-Codes verantwortlich. - Ein Prefab mit
ARMarker
angefügtem Vorformat. ARMarkerManager
konfiguriert, um den Prefab beim Erstellen einesGameObject
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:
- Erstellen Sie einen neuen Vorabab für Ihr Projekt.
- Fügen Sie die
ARMarker
Komponente zum Prefab hinzu, die sich unter Script > Microsoft.MixedReality.OpenXR > ARMarker befindet.
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 ARMarker
die 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:
- Fügen Sie dem im vorherigen Abschnitt erstellten Prefab eine leere
GameObject
Datei hinzu. Er stellt alle visuellen Markierungsinhalte dar. - Fügen Sie dem Markierungsinhalt
GameObject
einen untergeordneten 3D-CodeGameObject
hinzu, z. B. einQuad
Element. - Legen Sie in der Komponente prefab
ARMarkerScale
die Markerskalatransformation auf den MarkierungsinhaltGameObject
fest. Wenn Sie dieses Feld festlegen, wird sichergestellt, dass die von Ihnen ausgewählte 3DGameObject
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
:
- Platzieren Sie einen
GameObject
Platz in Ihrer Szene. - Fügen Sie die
ARMarkerManager
Komponente zumGameObject
Skript > Microsoft.MixedReality.OpenXR > ARMarkerManager hinzu.
- Legen Sie das
ARMarkerManager
Feld "Marker Prefab " auf den prefab fest, den Sie im vorherigen Abschnitt erstellt haben. - Erweitern Sie aktivierte Markierungstypen, und wählen Sie dann ein Element aus, und legen Sie es auf QR-Code fest.
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:
GetDecodedString(UnityEngine.XR.ARSubsystems.TrackableId trackableId)
GetMarker(UnityEngine.XR.ARSubsystems.TrackableId trackableId)
GetQRCodeProperties(UnityEngine.XR.ARSubsystems.TrackableId)
GetRawData(UnityEngine.XR.ARSubsystems.TrackableId, Unity.Collections.Allocator)
SetTransformMode(UnityEngine.XR.ARSubsystems.TrackableId, Microsoft.MixedReality.OpenXR.TransformMode)
Hinweis
Für den GetRawData
Methodenparameter allocator
reicht 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.TrackingState
festgelegt:
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:
- Aufruf
ARMarker.GetQRCodeProperties()
, der eineQRCodeProperties
Instanz zurückgibt. - Greifen Sie auf das Feld
QRCodeProperties
im Rückgabewert zu, um den Typ des QR-Codes abzurufen. Der Wert lautet entwederQRCodeType.QRCode
oderQRCodeType.MicroQRCode
. - 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 lautetQRCodeType.QRCode
, und von 1 bis 4, wenn der Typ lautetQRCodeType.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:
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:
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