Bagikan melalui


Kode QR di Unity

Headset HoloLens 2 dapat melacak dan mendeteksi kode QR yang dapat digunakan untuk menyediakan hologram dan fitur AR lainnya. Artikel ini memandu Anda melalui semua yang perlu Anda ketahui untuk mulai menggunakan kode QR di aplikasi Unity Anda, termasuk:

  • Menambahkan deteksi kode QR ke aplikasi Unity Anda.
  • Memahami konsep penting dan komponen Unity yang perlu Anda gunakan.
  • Menyediakan tutorial yang mencakup penggunaan kode QR umum.
  • Memperkenalkan skenario sampel PENANDA AR yang menunjukkan adegan yang mendukung kode QR dan contoh skrip.

Sebelum melanjutkan dengan artikel ini, kami sarankan untuk melalui gambaran umum kode QR.

Kode QR terlacak

Mengonfigurasi proyek dan aplikasi Unity Anda

Proyek dan aplikasi Unity Anda harus disiapkan dan dikonfigurasi dengan benar untuk mengaktifkan fungsionalitas kode QR, yang memerlukan:

  • OpenXR untuk Windows Mixed Reality versi 113.2403.5001 atau yang lebih baru.

    Catatan

    Ini dilengkapi dengan OS dan dapat diperbarui melalui Windows Store. Perlu diketahui bahwa pengguna mungkin telah menginstal versi sebelumnya, dan perangkat mereka tidak akan dapat bekerja dengan penanda AR seperti kode QR hingga memperbarui ke versi 113.2403.5001 atau yang lebih baru.

  • Proyek yang kompatibel dengan versi Unity yang didukung:
    • Unity 2022.3 LTS (Disarankan)
    • Unity 2021.3 LTS
  • Plugin Mixed Reality OpenXR.
  • Kemampuan webcam diaktifkan untuk proyek Unity Anda.
  • Izin kamera yang diberikan ke aplikasi Anda.

Bagian berikut memandu Anda melalui cara mengonfigurasi proyek dan aplikasi Unity Anda untuk mengaktifkan deteksi kode QR.

Mendapatkan Plugin OpenXR Mixed Reality

Paket Plugin Mixed Reality OpenXR berisi API C# yang dapat Anda gunakan untuk mengakses fungsionalitas kode QR.

Untuk mengimpor paket:

  1. Unduh dan jalankan Alat Fitur Mixed Reality.
  2. Instal plugin OpenXR.

Mixed Reality Feature Tool juga menyederhanakan manajemen paket dan dapat digunakan untuk menemukan, memperbarui, dan menambahkan fitur Mixed Reality yang diperlukan aplikasi Anda. Lihat Selamat Datang di Alat Fitur Mixed Reality untuk instruksi terperinci tentang cara menggunakan alat ini.

Mengaktifkan kemampuan WebCam

Untuk mendeteksi dan melacak kode QR, proyek Unity Anda harus mengaktifkan kemampuan WebCam .

Untuk mengaktifkan kemampuan WebCam :

  1. Buka proyek Unity Anda.
  2. Klik Edit di menu aplikasi editor Unity.
  3. Buka Pemutar Pengaturan > Proyek dan pilih tab UWP seperti yang diperlihatkan:Pengaturan Tab UWP
  4. Aktifkan WebCam di daftar Kemampuan . Kemampuan WebCam Diaktifkan
  5. Keluar dari Pengaturan Proyek.

Kemampuan WebCam sekarang diaktifkan untuk aplikasi Unity Anda. Namun, aplikasi Anda masih harus diberikan izin untuk mengakses kamera perangkat.

Memberikan izin akses kamera aplikasi Anda

Jika aplikasi Anda mengaktifkan kemampuan WebCam , dialog izin akan meminta pengguna untuk memberikan akses aplikasi Anda ke kamera perangkat.

Dialog Izin Kamera

Dialog ini hanya ditampilkan kepada pengguna sekali, biasanya saat memasukkan adegan yang ARMarkerManager berisi dukungan penanda kode QR diaktifkan. Jika akses kamera ditolak, pengguna dapat membuka Aplikasi Pengaturan > dan mengaktifkannya melalui Opsi Tingkat Lanjut aplikasi.

Opsi Tingkat Lanjut Aplikasi dengan Izin Diaktifkan

Membangun deteksi kode QR ke dalam adegan

Deteksi kode QR harus dibangun ke dalam setiap adegan tempat Anda ingin menggunakan kode QR, yang memerlukan:

Membuat prefab untuk kode QR

Untuk menggunakan kode QR di adegan Anda, Anda perlu membuat prefab untuk kode QR. ARMarkerManager menggunakan prefab ini untuk membuat GameObject dari setiap kali kode QR terdeteksi.

Untuk membuat prefab untuk kode QR:

  1. Buat prefab baru untuk proyek Anda.
  2. ARMarkerTambahkan komponen ke prefab, yang terletak di bawah Skrip > Microsoft.MixedReality.OpenXR > ARMarker.
    Menambahkan Komponen ARMarker

Anda sekarang memiliki prefab dasar untuk dikerjakan. Anda mungkin ingin aplikasi Anda secara visual mewakili kode QR yang terdeteksi di lingkungan. Bagian berikutnya memandu Anda melalui cara menambahkan representasi visual untuk kode QR.

Menambahkan Visual

Di bagian sebelumnya, menambahkan ARMarkerke prefab juga secara otomatis menambahkan ARMarkerScale komponen. Komponen ini digunakan untuk mencocokkan skala representasi visual kode QR dengan rekan fisiknya.

Untuk melakukannya:

  1. Tambahkan kosong GameObject ke prefab yang Anda buat di bagian sebelumnya. Ini akan mewakili semua konten penanda visual.
  2. Tambahkan anak 3D GameObject, seperti Quad, ke konten GameObjectpenanda . Menambahkan 3D GameObject ke prefab ARMarker
  3. Di komponen prefabARMarkerScale, atur Transformasi Skala Penanda ke konten GameObjectpenanda . Mengatur bidang ini memastikan 3D GameObject yang Anda pilih diskalakan dengan benar agar sesuai dengan kode QR dunia nyata.

ARMarkerManager Menambahkan ke adegan

ARMarkerManager bertanggung jawab untuk membuat, memperbarui, dan menghapus setiap GameObject kode QR yang terdeteksi.

Untuk menambahkan ARMarkerManager ke adegan Anda:

  1. Tempatkan GameObject ke dalam adegan Anda.
  2. ARMarkerManager Tambahkan komponen ke GameObject, yang terletak di bawah Skrip > Microsoft.MixedReality.OpenXR > ARMarkerManager.
    Menambahkan Komponen ARMarkerManager
  3. Atur ARMarkerManager bidang Prefab Penanda ke prefab yang Anda buat di bagian sebelumnya. Set Bidang Prefab Penanda
  4. Perluas Jenis Penanda yang Diaktifkan, lalu pilih elemen dan atur ke Kode QR. Jenis Penanda Kode QR Diaktifkan

Melacak perubahan kode QR

ARMarkerManagermarkersChanged berisi peristiwa, yang disediakan ARMarkersChangedEventArgs untuk pelanggan. Gunakan argumen peristiwa ini untuk melacak kode QR mana yang ditambahkan atau dihapus dari deteksi atau data pose yang diperbarui.

Kode berikut menunjukkan berlangganan ARMarkerManager.markersChanged peristiwa, menggunakan argumen peristiwanya untuk melakukan iterasi melalui ARMarker objek ARMarkerManager yang menangani dan menulis ke Debug apakah mereka ditambahkan, dihapus, atau diperbarui.

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}");
    }
}

Mendapatkan waktu kode QR terakhir terdeteksi

ARMarker.lastSeenTime Gunakan properti untuk menentukan kapan perangkat terakhir melacak kode QR yang terdeteksi dan jumlah waktu, jika ada, pelacakan hilang. Waktu diukur dalam jumlah detik karena Unity memulai aplikasi Anda dan dianalogikan dengan UnityEngine.Time.realtimeSinceStartup.

Menggunakan ID kode QR yang dapat dilacak

Kode QR adalah dapat dilacak, yang merupakan apa pun yang dapat dideteksi dan dilacak perangkat AR di lingkungan fisik. Dapat dilacak berasal dari jenis ARTrackable<TSessionRelativeData, TTrackable> yang menyediakan ID, status pelacakan, pose, dan data lainnya.

ID yang dapat dilacak untuk kode QR dapat diteruskan ke metode ARMarkerManager untuk mendapatkan properti kode QR, data byte mentah, dan representasi string, dan untuk mengatur mode transformasi untuk kode QR. Metode ini memungkinkan Anda mengambil data untuk kode QR tanpa harus berpegang pada ARMarker referensi objek.

Anda dapat meneruskan ID kode QR ke dalam metode berikut ARMarkerManager :

Catatan

GetRawData Untuk parameter allocatormetode , passing Unity.Collections.Allocator.Temp cukup untuk sebagian besar skenario.

Mengikuti status pelacakan kode QR

ARMarker Karena dapat dilacak, ia mewarisi trackingState properti dan diatur ke salah satu dari tiga UnityEngine.XR.ARSubsystems.TrackingState:

  • Limited: Menunjukkan bahwa kode QR sedang dilacak tetapi informasi terbatas tersedia atau berkualitas buruk.
  • Tracking: Menentukan bahwa kode QR sedang dilacak sepenuhnya.
  • None: Menunjukkan bahwa kode QR tidak dilacak.

Untuk memantau status pelacakan untuk kode QR, berlangganan ARMarkerManager.markersChanged dan melakukan iterasi melalui ARMarker koleksi penanda yang disediakan dalam argumen peristiwa yang diteruskan ke penanganan aktivitas Anda.

Kode berikut menunjukkan penggunaan ARMarkerManager.markersChanged peristiwa untuk melakukan iterasi melalui ARMarker objek untuk kode QR yang baru terdeteksi dan menulis ID yang dapat dilacak ke jendela Debug.

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.");
    }
}

Mendapatkan versi kode QR dan jenis kode QR

Untuk mendapatkan versi dan jenis kode QR yang terdeteksi:

  1. Panggil ARMarker.GetQRCodeProperties(), yang mengembalikan instans QRCodeProperties .
  2. Akses bidang QRCodeProperties dalam nilai pengembalian untuk mendapatkan jenis kode QR. Nilainya adalah QRCodeType.QRCode atau QRCodeType.MicroQRCode.
  3. Akses bidang nilai QRCodeProperties.version yang dikembalikan untuk mendapatkan versi kode QR. Nilai berkisar dari 1 hingga 40 jika jenisnya adalah QRCodeType.QRCode, dan dari 1 hingga 4 jika jenisnya adalah QRCodeType.MicroQRCode.

Sebagai alternatif, berikan ID objek yang ARMarker dapat dilacak untuk ARMarkerManager.GetQRCodeProperties(TrackableId) mendapatkan jenis dan versi kode QR.

Peringatan

Kode QR adalah satu-satunya jenis penanda yang saat ini didukung meskipun dukungan untuk jenis penanda lain dapat ditambahkan dalam rilis mendatang. Jika markerType tidak ARMarkerType.QRCode, panggilan akan GetQRCodeProperties(TrackableId) melemparkan System.InvalidOperationException. Pertimbangkan untuk membungkus panggilan ke GetQRCodeProperties(TrackableId) dalam blok try-catch jika ini dapat menyebabkan masalah di aplikasi Anda nanti.

Membaca data QR

Komponen ARMarker dilampirkan ke setiap GameObject yang ARMarkerManager membuat. ARMarker menyediakan dua metode yang mengembalikan data kode QR:

  • GetDecodedString(): Metode ini mendapatkan representasi string kode QR, seperti URL.

  • GetRawData(Unity.Collections.Allocator allocator): Metode ini mengembalikan konten kode QR sebagai array byte, memungkinkan penyetelan butir halus tentang bagaimana array dialokasikan. Gunakan metode ini di jalur panas dan situasi lain di mana performa sangat penting.

Kode berikut menunjukkan penggunaan GetDecodedString() dasar dan 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();
    }
}

Mendapatkan ukuran kode QR, posisi, rotasi, dan tengah

Objek ARMarker menyediakan ukuran, posisi, rotasi, dan pusat kode QR yang diwakilinya.

Untuk mendapatkan ukuran kode QR dalam meter, gunakan properti ARMarker.size.

ARMarker.transform Gunakan properti untuk mendapatkan rotasi dan posisi ruang dunia transformasi kode QR, dan ARMarker.center ke koordinat 2D kode QR relatif terhadap transformasi kode QR. Transformasi itu sendiri berpusat sesuai dengan apakah (mode transformasi) diatur ke TransformMode.MostStable (paling stabil, kiri atas kode QR) atau TransformMode.Center (tengah, pusat geometris kode QR).ARMarker.transformMode

ARMarkerManager.defaultTransformMode Gunakan bidang untuk mengatur mode ARMarkerManager transformasi yang membuat objek baruARMarker. Bidang diinisialisasi dengan Default Transform Mode bidang diatur ke di Pemeriksa Unity seperti yang ditunjukkan:

Bidang Pemeriksa Mode Transformasi Default Komponen ARMarkerManager

Sebagai alternatif untuk menggunakan ARMarker.transformMode, teruskan ID objek yang ARMarker dapat dilacak untuk ARMarkerManager.SetTransformMode(TrackableId, TransformMode) mengatur mode transformasinya.

Kode berikut menunjukkan mendapatkan ukuran dan pusat kode QR baru, posisi dan rotasi transformasinya, dan posisi transformasi yang diperbarui setelah mengubah mode transformasi.

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}");
    }
}

Skenario sampel penanda AR

Sampel yang disediakan dengan paket Plugin OpenXR berisi adegan yang mendukung kode QR yang memberikan contoh cara ARMarkerManager dan ARMarker dapat digunakan.

Adegan ini terletak di Aset > ARMarker seperti yang ditunjukkan:Lokasi Aset Adegan ARMarker

Anda dapat menemukan skrip C# yang digunakan dalam adegan dalam repositori Sampel Mixed Reality Unity OpenXR di GitHub: /OpenXR-Unity-MixedReality-Samples/tree/main/SampleScenarios/Scenarios/MarkerSample/Scripts

Lihat juga