Dela via


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.

Spårad QR-kod

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:

  1. Ladda ned och kör funktionsverktyget för Mixed Reality.
  2. 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 :

  1. Öppna ditt Unity-projekt.
  2. Klicka på Redigera i Unity-redigerarens appmeny.
  3. Gå till Projektinställningar > Spelare och välj fliken UWP enligt följande: Inställningar för UWP-fliken
  4. Aktivera WebCam i listan Funktioner . WebCam-funktioner aktiverade
  5. 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.

Dialogrutan Kamerabehö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.

Avancerade appalternativ med behörigheter aktiverade

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:

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:

  1. Skapa en ny prefab för projektet.
  2. Lägg till komponenten ARMarkeri prefab, som finns under Skript > Microsoft.MixedReality.OpenXR > ARMarker.
    Lägga till ARMarker-komponenten

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 ARMarkertill 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:

  1. Lägg till en tom GameObject i den prefab som du skapade i föregående avsnitt. Den representerar allt visuellt markörinnehåll.
  2. Lägg till en underordnad 3D GameObject, till exempel en Quad, i markörinnehållet GameObject. Lägg till 3D GameObject till ARMarker prefab
  3. I prefab-komponenten ARMarkerScale anger du Markörskalningstransformering till markörinnehållet GameObject. Om du anger det här fältet ser du till att den 3D GameObject 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:

  1. Placera en GameObject i din scen.
  2. Lägg till komponenten ARMarkerManager GameObjecti , som finns under Skript > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Lägga till komponenten ARMarkerManager
  3. ARMarkerManager Ange fältet Marker Prefab till den prefab som du skapade i föregående avsnitt. Markörens prefab-fältuppsättning
  4. Expandera Aktiverade markörtyper och välj sedan ett element och ange det till QR Code. QR-kodmarkörtyp aktiverad

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:

Kommentar

GetRawData För metodparametern allocatorrä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:

  1. Anropa ARMarker.GetQRCodeProperties(), som returnerar en QRCodeProperties instans.
  2. Få åtkomst till fältet QRCodeProperties i returvärdet för att hämta QR-kodens typ. Värdet är antingen QRCodeType.QRCode eller QRCodeType.MicroQRCode.
  3. 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 är QRCodeType.QRCode, och från 1 till 4 om typen är QRCodeType.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:

ARMarkerManager-komponentens standardfält för kontroll av transformeringsläge

Som ett alternativ till att använda ARMarker.transformModeskickar 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: Plats för ARMarker-scentillgång

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

Se även