Menentukan apakah session tersedia dan dukungan perangkat
Sebelum memulai AR, biasanya perlu terlebih dahulu memeriksa apakah session tersedia dan apakah perangkat saat ini mendukung fungsi AR yang dibutuhkan. Artikel ini menjelaskan cara melakukan pemeriksaan tersebut.
Sebelum mulai
- Pelajari Pengantar ARSession untuk memahami konsep dasar, komponen, dan alur kerja session.
- Pelajari Dukungan perangkat dan laporan untuk memahami dasar dukungan perangkat dan laporan session di Unity.
- Pelajari cara membuat session.
Mendapatkan laporan saat proses startup
Jika session langsung dijalankan setelah assemble, Anda dapat memperoleh laporan session melalui event StateChanged.
Perlu berlangganan event StateChanged sebelum session start, dan biasanya aman jika dilakukan di Awake():
void Awake()
{
Session.StateChanged += HandleSessionStateChange;
}
State session yang perlu diperhatikan pada handler event adalah Ready dan Broken. State Ready berarti session berhasil dimulai, artinya session tersedia pada perangkat saat ini. State Broken berarti startup gagal, artinya session tidak tersedia pada perangkat saat ini.
State Broken tidak selalu muncul saat perangkat tidak didukung. Karena itu, perlu juga menggunakan SessionReport.BrokenReason untuk mendapatkan alasan kegagalan yang spesifik.
void HandleSessionStateChange(ARSession.SessionState status)
{
if (status == ARSession.SessionState.Ready)
{
// session tersedia pada perangkat saat ini
}
else if (status == ARSession.SessionState.Broken)
{
// session tidak tersedia pada perangkat saat ini
if (Session.Report.BrokenReason == SessionReport.SessionBrokenReason.NoAvailabileFrameSource ||
Session.Report.BrokenReason == SessionReport.SessionBrokenReason.FrameFilterNotAvailabile)
{
// komponen yang dipilih tidak didukung oleh perangkat saat ini
}
else
{
// alasan yang tidak terkait perangkat
}
}
}
Jika alasan SessionReport.SessionBrokenReason.NoAvailabileFrameSource dan SessionReport.SessionBrokenReason.FrameFilterNotAvailabile muncul, itu berarti komponen session tidak tersedia pada perangkat saat ini; alasan lainnya biasanya tidak terkait perangkat. Secara tegas, dua alasan ini berarti konfigurasi saat ini, dan hanya konfigurasi itu, tidak dapat menjalankan fungsi AR pada perangkat tersebut. Konfigurasi merujuk pada fungsi dan pengaturan yang dipilih di objek session. Anda bisa mendapatkan laporan ketersediaan yang detail dari Report.
Untuk kasus SessionReport.SessionBrokenReason.NoAvailabileFrameSource, jika saat startup session ditemukan melalui pembaruan daftar perangkat online bahwa perangkat sudah didukung, session mungkin dapat pulih otomatis.
Mendapatkan laporan sebelum startup
Jika Anda ingin menentukan sebelum session dimulai, lalu memutuskan apakah session akan dijalankan, Anda bisa memanggil Assemble() secara manual dan menggunakan event AssembleUpdate untuk mendapatkan laporan ketersediaan komponen.
Perlu berlangganan event AssembleUpdate sebelum assemble session.
Session.AssembleUpdate += OnAssembleUpdate;
Pada fase pertama assemble, Anda masih bisa memakai ARSession.SessionState dan Report untuk menilai apakah session didukung. Namun laporan pada fase kedua tidak diperbarui ke session.
Jadi, saat memanggil Assemble() secara manual, biasanya perlu memproses laporan ketersediaan pada event AssembleUpdate untuk menentukan apakah session tersedia pada perangkat saat ini.
Yang perlu diperhatikan terutama adalah ketersediaan komponen pada daftar SessionReport.AvailabilityReport.FrameSources. Jika ada minimal satu frame source yang tersedia, maka bagian SessionReport.AvailabilityReport.FrameSources dianggap tersedia pada perangkat saat ini.
Anda juga perlu memperhatikan ketersediaan komponen pada daftar SessionReport.AvailabilityReport.FrameFilters. Namun kriterianya bergantung pada opsi assemble: bisa semua frame filter harus tersedia, atau hanya sejumlah tertentu. Pada opsi default, semua frame filter harus tersedia.
Dengan konfigurasi default, Anda bisa memakai kode berikut untuk menentukan apakah komponen session tersedia pada perangkat saat ini:
void OnAssembleUpdate(SessionReport.AvailabilityReport report)
{
if (report.FrameSources.Any(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available) &&
report.FrameFilters.All(f => f.Availability == SessionReport.AvailabilityReport.AvailabilityStatus.Available))
{
Session.AssembleUpdate -= OnAssembleUpdate;
// komponen session tersedia pada perangkat saat ini, session bisa dijalankan
Session.StartSession();
}
else
{
// komponen session tidak tersedia pada perangkat saat ini
}
if (report.PendingDeviceList.Count <= 0)
{
Session.AssembleUpdate -= OnAssembleUpdate;
}
}
Perhatikan bahwa event AssembleUpdate bisa terpanggil dua kali. Pada contoh di atas, event dilepaskan setelah komponen dipastikan tersedia.
Metode ini tidak bisa mendeteksi error lain yang mungkin terjadi saat startup session, tetapi error tersebut biasanya tidak terkait perangkat. Jika perlu, Anda dapat menambahkan pemeriksaan setelah startup melalui event StateChanged.
Pilihan saat komponen session tidak tersedia
Dalam pengembangan aplikasi, biasanya diinginkan dukungan untuk sebanyak mungkin perangkat. Jika komponen session tidak tersedia pada perangkat saat ini, Anda bisa mempertimbangkan opsi berikut:
Menurunkan ke fungsi AR lain
Dengan mengubah konfigurasi komponen session, pilih fungsi AR yang didukung oleh perangkat saat ini. Lihat membuat session untuk cara mengubah konfigurasi.Menyediakan pengalaman non-AR
Saat komponen session tidak tersedia, sediakan pengalaman non-AR. Misalnya pada skenario navigasi, jika navigasi AR tidak bisa digunakan, navigasi 2D tradisional sangat berguna.Menyarankan pengguna mengganti perangkat
Dalam beberapa skenario, pengguna mungkin memakai perangkat yang tidak mendukung fungsi AR. Dalam kasus itu, Anda bisa menyarankan pengguna mengganti perangkat agar mendapatkan pengalaman yang lebih baik.
Saat memilih opsi ini, Anda bisa mempertimbangkannya berdasarkan kebutuhan aplikasi dan pengguna yang dituju. Dalam aplikasi AR, jika beberapa perangkat memang tidak bisa memberikan AR atau skema turun kelas, tetap penting untuk memberi pesan yang baik kepada pengguna agar mereka memahami keterbatasan perangkat saat ini.
Langkah berikutnya
- Pelajari cara mengontrol eksekusi session
- Pelajari sumber frame dan pemilihan runtime
- Anda juga bisa melihat contoh berikut untuk mempelajari skenario setelah mendapatkan laporan:
- contoh Workflow_ARSession menggunakan event StateChanged dan memberi UI untuk state Broken, serta menggunakan AssembleUpdate untuk menampilkan ketersediaan setiap komponen di UI
- Contoh SpatialMap_Sparse_AllInOne menggunakan event AssembleUpdate untuk memeriksa dukungan perangkat lebih awal dan menampilkan peringatan jika tidak tersedia
- Contoh MotionTracking_DeviceMotionAndPlaneDetection menggunakan event StateChanged dan memberi UI untuk state Broken
- Contoh MegaBlock_Basic menggunakan event StateChanged dan memberi UI untuk state Broken