QR-koder i Unity
HoloLens 2-headset kan spåra och identifiera QR-koder som kan användas för att tillhandahålla hologram och andra AR-funktioner. Den här artikeln vägleder dig genom allt du behöver veta för att börja använda QR-koder i din Unity-app, inklusive:
- Lägga till QR-kodidentifiering i unity-appen.
- Förstå viktiga begrepp och Unity-komponenter som du behöver använda.
- Innehåller självstudier som täcker vanlig QR-kodanvändning.
- Introducerar exempelscenariot för AR-markör som visar en QR-kodaktiverad scen och exempelskript.
Innan du fortsätter med den här artikeln rekommenderar vi att du går igenom översikten över QR-koder.
Konfigurera ditt Unity-projekt och din app
Unity-projektet och appen måste konfigureras korrekt för att aktivera QR-kodfunktioner, vilket kräver:
- OpenXR för Windows Mixed Reality version 113.2403.5001 eller senare.
Kommentar
Detta levereras med operativsystemet och kan uppdateras via Windows Store. Tänk på att användare kan ha tidigare versioner installerade och att deras enheter inte kan arbeta med AR-markörer, till exempel QR-koder förrän de uppdateras till version 113.2403.5001 eller senare.
- Ett projekt som är kompatibelt med en version av Unity som stöds:
- Unity 2022.3 LTS (rekommenderas)
- Unity 2021.3 LTS
- Plugin-programmet Mixed Reality OpenXR.
- Webbkamerafunktioner aktiverade för ditt Unity-projekt.
- Kamerabehörigheter som beviljats till din app.
Följande avsnitt vägleder dig genom hur du konfigurerar ditt Unity-projekt och din app för att aktivera identifiering av QR-kod.
Hämta Plugin-programmet Mixed Reality OpenXR
Plugin-paketet Mixed Reality OpenXR innehåller C#-API:er som du kan använda för att komma åt QR-kodfunktioner.
Så här importerar du paketet:
- Ladda ned och kör funktionsverktyget för Mixed Reality.
- Installera OpenXR-plugin-programmet.
Funktionsverktyget för Mixed Reality förenklar även pakethanteringen och kan användas för att hitta, uppdatera och lägga till de Mixed Reality-funktioner som din app kräver. Mer information om hur du använder verktyget finns i Välkommen till funktionsverktyget för Mixad verklighet.
Aktivera WebCam-funktioner
För att identifiera och spåra QR-koder måste Funktionerna i Unity-projektet vara aktiverade för WebCam .
Så här aktiverar du WebCam-funktioner :
- Öppna ditt Unity-projekt.
- Klicka på Redigera i Unity-redigerarens appmeny.
- Gå till Projektinställningar > Spelare och välj fliken UWP enligt följande:
- Aktivera WebCam i listan Funktioner .
- Avsluta projektinställningar.
WebCam-funktioner är nu aktiverade för din Unity-app. Appen måste dock fortfarande ha behörighet att komma åt enhetskameran.
Bevilja åtkomstbehörigheter för din appkamera
Om webcam-funktioner är aktiverade i appen uppmanas användarna att ge appen åtkomst till enhetens kamera i dialogrutan Behörigheter.
Den här dialogrutan visas bara för användare en gång, vanligtvis när du anger en scen som innehåller en ARMarkerManager
med stöd för QR-kodmarkör aktiverad. Om kameraåtkomst nekas kan användarna gå till Inställningar > appar och aktivera den via appens avancerade alternativ.
Skapa QR-kodidentifiering i en scen
QR-kodidentifiering måste vara inbyggd i varje scen som du vill använda QR-koder i, vilket kräver:
- A
GameObject
medARMarkerManager
bifogat.ARMarkerManager
är ensamt ansvarig för att skapa, uppdatera och ta bort varjeGameObject
för identifierade QR-koder. - En prefab med
ARMarker
bifogad. ARMarkerManager
konfigurerad för att använda prefab när du skapar enGameObject
när en QR-kod identifieras.
Skapa en prefab för QR-koder
Om du vill använda QR-koder i din scen måste du skapa en prefab för QR-koder. ARMarkerManager
använder den här prefab för att skapa en GameObject
från när en QR-kod identifieras.
Så här gör du en prefab för QR-koder:
- Skapa en ny prefab för projektet.
- Lägg till komponenten
ARMarker
i prefab, som finns under Skript > Microsoft.MixedReality.OpenXR > ARMarker.
Nu har du en grundläggande prefab att arbeta med. Du vill förmodligen att din app visuellt ska representera QR-koder som identifieras i miljön. Nästa avsnitt beskriver hur du lägger till en visuell representation för QR-koder.
Lägga till visuella objekt
I föregående avsnitt lade du också till komponenten ARMarkerScale
automatiskt genom att lägga ARMarker
till i prefab. Den här komponenten används för att matcha skalan för en QR-kods visuella representation med dess fysiska motsvarighet.
Så här gör du:
- Lägg till en tom
GameObject
i den prefab som du skapade i föregående avsnitt. Den representerar allt visuellt markörinnehåll. - Lägg till en underordnad 3D
GameObject
, till exempel enQuad
, i markörinnehålletGameObject
. - I prefab-komponenten
ARMarkerScale
anger du Markörskalningstransformering till markörinnehålletGameObject
. Om du anger det här fältet ser du till att den 3DGameObject
du valde skalas korrekt för att matcha verkliga QR-koder.
Lägga ARMarkerManager
till i en scen
ARMarkerManager
är ensamt ansvarig för att skapa, uppdatera och ta bort varje GameObject
för identifierade QR-koder.
Så här lägger du till ARMarkerManager
i din scen:
- Placera en
GameObject
i din scen. - Lägg till komponenten
ARMarkerManager
GameObject
i , som finns under Skript > Microsoft.MixedReality.OpenXR > ARMarkerManager.
ARMarkerManager
Ange fältet Marker Prefab till den prefab som du skapade i föregående avsnitt.- Expandera Aktiverade markörtyper och välj sedan ett element och ange det till QR Code.
Hålla reda på QR-kodändringar
ARMarkerManager
innehåller händelsen markersChanged
, som ger ARMarkersChangedEventArgs
till prenumeranter. Använd dessa händelseargument för att spåra vilka QR-koder som läggs till eller tas bort från identifiering eller uppdaterade posedata.
Följande kod visar hur du prenumererar på ARMarkerManager.markersChanged
händelsen med hjälp av dess händelseargument för att iterera genom objekten ARMarker
ARMarkerManager
hanterar och skriver för att felsöka om de läggs till, tas bort eller uppdateras.
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}");
}
}
Hämta den tid då en QR-kod senast identifierades
Använd egenskapen ARMarker.lastSeenTime
för att avgöra när enheten senast spårade en identifierad QR-kod och hur lång tid, om någon, spårning går förlorad. Tiden mäts i antalet sekunder sedan Unity startade ditt program och motsvarar UnityEngine.Time.realtimeSinceStartup
.
Använda en QR-kods spårbara ID
QR-koder är spårbara, vilket är allt som en AR-enhet kan identifiera och spåra i en fysisk miljö. Trackables härleds från den typ ARTrackable<TSessionRelativeData, TTrackable>
som tillhandahåller ett ID, spårningstillstånd, pose och andra data.
Det spårbara ID:t för en QR-kod kan skickas till ARMarkerManager
metoder för att hämta QR-kodens egenskaper, rådata och strängrepresentation och för att ange transformeringsläget för QR-koden. Med de här metoderna kan du hämta data för en QR-kod utan att behöva hålla fast vid en ARMarker
objektreferens.
Du kan skicka QR-kodens ID till följande ARMarkerManager
metoder:
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)
Kommentar
GetRawData
För metodparametern allocator
räcker det med att skicka Unity.Collections.Allocator.Temp
för de flesta scenarier.
Följa spårningstillståndet för en QR-kod
Eftersom en ARMarker
är spårbar ärver den trackingState
egenskapen och är inställd på något av tre UnityEngine.XR.ARSubsystems.TrackingState
:
Limited
: Anger att QR-koden spåras men att begränsad information är tillgänglig eller är av dålig kvalitet.Tracking
: Anger att QR-koden spåras fullständigt.None
: Anger att QR-koden inte spåras.
Om du vill övervaka spårningstillståndet för en QR-kod prenumererar du på ARMarkerManager.markersChanged
och itererar genom de ARMarker
markörsamlingar som anges i de händelseargument som skickas till händelsehanteraren.
Följande kod visar hur du använder ARMarkerManager.markersChanged
händelsen för att iterera genom ARMarker
objekt för nyligen identifierade QR-koder och skriva deras spårbara ID till felsökningsfönstret.
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.");
}
}
Hämta en QR-kods version och QR-kodtyp
Så här hämtar du versionen och typen av en identifierad QR-kod:
- Anropa
ARMarker.GetQRCodeProperties()
, som returnerar enQRCodeProperties
instans. - Få åtkomst till fältet
QRCodeProperties
i returvärdet för att hämta QR-kodens typ. Värdet är antingenQRCodeType.QRCode
ellerQRCodeType.MicroQRCode
. - Få åtkomst till returvärdets
QRCodeProperties.version
fält för att hämta QR-kodens version. Värdet varierar från 1 till 40 om typen ärQRCodeType.QRCode
, och från 1 till 4 om typen ärQRCodeType.MicroQRCode
.
Alternativt kan du skicka ett ARMarker
objekts spårbara ID till för ARMarkerManager.GetQRCodeProperties(TrackableId)
att hämta QR-kodens typ och version.
Varning
QR-koder är den enda markörtyp som för närvarande stöds, men stöd för andra markörtyper kan läggas till i framtida versioner. Om markerType
inte ARMarkerType.QRCode
, anrop GetQRCodeProperties(TrackableId)
genererar System.InvalidOperationException
. Överväg att omsluta anrop till GetQRCodeProperties(TrackableId)
i try-catch-block om detta kan orsaka problem i appen senare.
Läsa QR-data
Komponenten ARMarker
är kopplad till varje GameObject
som ARMarkerManager
skapar. ARMarker
innehåller två metoder som returnerar QR-koddata:
GetDecodedString()
: Den här metoden hämtar QR-kodens strängrepresentation, till exempel en URL.GetRawData(Unity.Collections.Allocator allocator)
: Den här metoden returnerar QR-kodinnehåll som en bytematris, vilket möjliggör finjustering av hur matrisen allokeras. Använd den här metoden i heta sökvägar och andra situationer där prestanda är kritisk.
Följande kod visar grundläggande användning av GetDecodedString()
och 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();
}
}
Hämta QR-kodstorlek, position, rotation och centrum
Ett ARMarker
objekt innehåller storleken, positionen, rotationen och mitten av QR-koden som det representerar.
Om du vill hämta QR-kodens storlek i mätare använder du egenskapen ARMarker.size
.
ARMarker.transform
Använd egenskapen för att hämta rotations- och världsrymdspositionen för QR-kodens transformering och ARMarker.center
till QR-kodens 2D-koordinater i förhållande till QR-kodens transformering. Själva transformen centreras beroende på om ARMarker.transformMode
( transformeringsläget) är inställt på TransformMode.MostStable
(mest stabilt, QR-kodens övre vänstra) eller TransformMode.Center
(mitten, QR-kodens geometriska centrum).
Använd fältet ARMarkerManager.defaultTransformMode
för att ange transformeringsläget ARMarkerManager
skapar nya ARMarker
objekt med. Fältet initieras med fältet Default Transform Mode
är inställt på i Unity Inspector enligt följande:
Som ett alternativ till att använda ARMarker.transformMode
skickar du ett ARMarker
objekts spårbara ID till ARMarkerManager.SetTransformMode(TrackableId, TransformMode)
för att ange dess transformeringsläge.
Följande kod visar hur du hämtar en ny QR-kods storlek och mittpunkt, position och rotation av dess transformering och uppdaterade transformeringsposition efter ändring av transformeringsläget.
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}");
}
}
Exempelscenario för AR-markör
Exemplet som medföljer OpenXR-plugin-paketet innehåller en QR-kodaktiverad scen som ger ett exempel på hur ARMarkerManager
och ARMarker
kan användas.
Scenen finns i Assets > ARMarker enligt följande:
Du hittar C#-skripten som används i scenen i OpenXR Unity Mixed Reality Samples-lagringsplatsen på GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts