Mengakses komponen fungsional AR dalam session
Dalam session yang berjalan, Anda dapat mengakses berbagai komponen fungsional melalui properti Assembly. Artikel ini menjelaskan cara mengakses komponen-komponen ini serta hal-hal yang perlu diperhatikan saat mengaksesnya.
Sebelum memulai
- Pahami konsep dasar, komponen, dan alur kerja session melalui Pengantar ARSession
- Pelajari cara membuat session
Mengkonfigurasi komponen ar saat pengeditan atau sebelum memulai
Terkadang, beberapa opsi komponen (seperti DesiredFocusMode) harus dikonfigurasi sebelum komponen dijalankan. Jika Anda tidak ingin mengonfigurasi dan menjalankan komponen secara manual setelah sesi dimulai, cara sederhana adalah mengonfigurasi semua komponen frame source yang mungkin digunakan sebelum perakitan sesi. Proses perakitan akan mempertahankan satu atau lebih komponen ini dan menerapkan konfigurasinya.
Anda bisa menggunakan metode dasar Unity seperti FindAnyObjectByType<T>() atau GetComponent<T>() untuk menemukan komponen, lalu mengonfigurasinya.
[!CATATAN] Tidak pasti apakah komponen AR yang diperoleh dengan cara ini akan disertakan dalam sesi saat runtime. Oleh karena itu, Anda harus mengonfigurasi semua kemungkinan kasus.
Misalnya, kode berikut menunjukkan cara mengubah mode fokus semua komponen frame source sebelum perakitan sesi:
void Awake()
{
var allFrameSources = Session.GetComponentsInChildren<FrameSource>();
foreach (var source in allFrameSources)
{
if (source is CameraDeviceFrameSource)
{
((CameraDeviceFrameSource)source).DesiredFocusMode = autoFocus ? CameraDeviceFocusMode.Continousauto : CameraDeviceFocusMode.Medium;
}
else if (source is MotionTrackerFrameSource)
{
((MotionTrackerFrameSource)source).DesiredFocusMode = autoFocus ? MotionTrackerCameraDeviceFocusMode.Continousauto : MotionTrackerCameraDeviceFocusMode.Medium;
}
else if (source is ARCoreFrameSource)
{
((ARCoreFrameSource)source).DesiredFocusMode = autoFocus ? ARCoreCameraDeviceFocusMode.Auto : ARCoreCameraDeviceFocusMode.Fixed;
}
else if (source is ARKitFrameSource)
{
((ARKitFrameSource)source).DesiredFocusMode = autoFocus ? ARKitCameraDeviceFocusMode.Auto : ARKitCameraDeviceFocusMode.Fixed;
}
else if (source is AREngineFrameSource)
{
((AREngineFrameSource)source).DesiredFocusMode = autoFocus ? AREngineCameraDeviceFocusMode.Auto : AREngineCameraDeviceFocusMode.Fixed;
}
else if (source is ThreeDofCameraDeviceFrameSource)
{
((ThreeDofCameraDeviceFrameSource)source).DesiredFocusMode = autoFocus ? ThreeDofCameraDeviceFocusMode.Auto : ThreeDofCameraDeviceFocusMode.Fixed;
}
else if (source is InertialCameraDeviceFrameSource)
{
((InertialCameraDeviceFrameSource)source).DesiredFocusMode = autoFocus ? InertialCameraDeviceFocusMode.Auto : InertialCameraDeviceFocusMode.Fixed;
}
else if (source is ARFoundationFrameSource)
{
cameraManager.autoFocusRequested = autoFocus;
}
}
}
Proses ini juga dapat diselesaikan di editor, dengan mengonfigurasi semua komponen:

Konfigurasi untuk dua frame source ARCoreARFoundationFrameSource dan ARKitARFoundationFrameSource berada di komponen Main Camera.
[!PERINGATAN] Komponen AR yang diperoleh dengan cara ini hanya dapat digunakan untuk konfigurasi pra-runtime.
Karena proses perakitan menyaring komponen AR, komponen AR yang diperoleh melalui hierarki adegan mungkin tidak disertakan dalam sesi dan tidak akan berfungsi.
Menggunakan komponen AR yang dirakit saat runtime
Komponen AR yang berjalan dalam sesi ditentukan setelah perakitan. Sebelum perakitan selesai, tidak ada komponen AR yang dapat digunakan. Komponen AR yang sudah dirakit dapat diakses melalui properti Assembly.
Assembly dapat digunakan ketika status sesi ≥ Assembled. Secara detail, properti Assembly baru akan ditetapkan setelah metode Assemble() selesai dieksekusi, memungkinkan akses ke komponen sesi. Setelah sesi berhenti atau rusak, properti Assembly akan dikosongkan dan komponen tidak dapat diakses lagi.
Anda dapat memeriksa State sesi dalam skrip untuk menentukan kapan komponen AR dapat diakses:
if (Session.State >= ARSession.SessionState.Ready)
{
// Assembly dapat digunakan
}
else
{
// Assembly tidak dapat digunakan
}
Anda juga dapat berlangganan event StateChanged untuk mendapatkan perubahan status sesi, sehingga dapat mengakses komponen AR pada waktu yang tepat. Umumnya, untuk menangkap status Ready, perlu berlangganan event StateChanged sebelum sesi dimulai. Biasanya aman untuk melakukan langganan di Awake():
void Awake()
{
Session.StateChanged += (state) =>
{
if (Session.State == ARSession.SessionState.Ready)
{
// Assembly dapat digunakan, setelah ini Assembly tetap dapat diakses hingga sesi berhenti atau rusak
}
else if (Session.State < ARSession.SessionState.Ready)
{
// Assembly tidak dapat digunakan, setelah ini Assembly tetap tidak dapat diakses hingga sesi dimulai ulang
}
else
{
// Assembly dapat digunakan, biasanya tidak perlu penanganan khusus
}
};
}
Hati-Hati
Jika Anda mendapatkan komponen AR melalui metode seperti FindAnyObjectByType<T>() atau GetComponent<T>(), komponen tersebut pasti akan disertakan dalam sesi dan dapat digunakan saat runtime.
Menyimpan referensi ke komponen ini aman, tetapi saat menggunakannya, pastikan sesi sedang berjalan dan komponen tersebut benar-benar disertakan dalam sesi. Jika tidak, dapat menyebabkan exception atau perilaku tak terduga.
Komponen tidak dapat bekerja sebelum sesi dimulai dan setelah sesi berhenti. Disarankan meskipun dalam penggunaan seperti ini, tetap perhatikan State dan event StateChanged sesi.
Akses komponen sumber frame
Anda dapat menggunakan properti ARAssembly.FrameSource untuk mengakses komponen sumber frame. Dalam sesi yang berjalan normal, ARAssembly.FrameSource memiliki tepat satu komponen.
Saat menggunakan sesi, biasanya Anda perlu mengakses ARAssembly.FrameSource untuk menentukan jenis komponen sumber frame yang sebenarnya digunakan saat runtime, sehingga dapat mengakses properti dan metode khusus komponen tersebut.
Misalnya, kode berikut menunjukkan cara menggunakan metode deteksi bidang yang berbeda berdasarkan sumber frame:
void PlaceObject(Vector2 touchPosition)
{
if (Session.Assembly.FrameSource is MotionTrackerFrameSource)
{
Ray ray = Session.Assembly.Camera.ScreenPointToRay(touchPosition);
if (Physics.Raycast(ray, out var hitInfo))
{
TouchRoot.transform.position = hitInfo.point;
}
}
else if (Session.Assembly.FrameSource is ARFoundationFrameSource)
{
var raycastManager = Session.Assembly.Origin.Value.GetComponent<UnityEngine.XR.ARFoundation.ARRaycastManager>();
var hits = new List<UnityEngine.XR.ARFoundation.ARRaycastHit>();
if (raycastManager.Raycast(touchPosition, hits, UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon))
{
var hitPose = hits[0].pose;
TouchRoot.transform.position = hitPose.position;
}
}
}
Mengakses komponen frame filter
Anda dapat mengakses komponen frame filter menggunakan properti ARAssembly.FrameFilters. Dalam session yang berjalan normal, komponen tipe apa pun dalam daftar ARAssembly.FrameFilters berpotensi memiliki beberapa instance.
Sebagai contoh, kode berikut menunjukkan cara mendapatkan satu MegaTrackerFrameFilter dalam session dan mendaftarkan event yang sesuai:
var megaTracker = session.Assembly.FrameFilters.Where(f => f is MegaTrackerFrameFilter).FirstOrDefault() as MegaTrackerFrameFilter;
if (megaTracker)
{
megaTracker.LocalizationRespond += (response) =>
{
};
}
Mengakses komponen camera
Anda dapat menggunakan properti ARAssembly.Camera untuk mengakses komponen camera. Jika ada beberapa camera di scene, ini adalah cara cepat untuk menemukan camera yang digunakan AR.
Sebagai contoh, kode berikut menunjukkan cara mendapatkan camera dalam sesi dan melakukan deteksi sinar pada objek di scene:
var ray = Session.Assembly.Camera.ScreenPointToRay(screenPoint);
if (Physics.Raycast(ray, out var hitInfo))
{
TouchRoot.transform.position = hitInfo.point;
};
Mengakses origin komponen
Anda dapat menggunakan properti ARAssembly.Origin untuk mengakses origin komponen.
Sebagai contoh, kode berikut menunjukkan cara mendapatkan origin dalam sesi dan menampilkan kerucut yang mewakili posisi dan orientasi kamera saat ini di scene:
if (session.Assembly.Origin.OnSome)
{
GameObject frustum = Instantiate(CameraFrustumPrefab, session.Assembly.Camera.transform.position, session.Assembly.Camera.transform.rotation);
frustum.transform.SetParent(session.Assembly.Origin.Value.transform);
}
Perlu diperhatikan bahwa di sini perlu memeriksa terlebih dahulu apakah ARAssembly.Origin ada.
Catatan
ARAssembly.Origin hanya ada dalam sesi yang mengaktifkan fitur pelacakan gerak.
Akses komponen CameraImageRenderer
Anda dapat menggunakan properti ARAssembly.CameraImageRenderer untuk mengakses komponen CameraImageRenderer.
Sebagai contoh, kode berikut mendapatkan RenderTexture dari gambar kamera fisik:
RenderTexture renderTexture;
void Awake()
{
Session.StateChanged += (state) =>
{
if (state == ARSession.SessionState.Ready && Session.Assembly.CameraImageRenderer.OnSome)
{
Session.Assembly.CameraImageRenderer.Value.RequestTargetTexture((_, texture) => renderTexture = texture);
}
};
}
Perlu diperhatikan bahwa perlu memeriksa keberadaan ARAssembly.CameraImageRenderer terlebih dahulu.
Catatan
ARAssembly.CameraImageRenderer hanya valid dalam sesi yang menggambar gambar oleh EasyAR. Secara umum, ini tidak valid saat menggunakan AR Foundation atau headset, di mana penggambaran gambar kamera fisik dilakukan oleh AR Foundation atau SDK headset.
Mengakses komponen FrameRecorder
Anda dapat mengakses komponen FrameRecorder menggunakan properti ARAssembly.FrameRecorder.
Sebagai contoh, kode berikut dapat memulai perekaman. Lokasi penyimpanan file tergantung pada konfigurasi, secara default akan disimpan di direktori penyimpanan internal aplikasi:
if (session.Assembly.FrameRecorder.OnSome)
{
var frameRecorder = session.Assembly.FrameRecorder.Value;
frameRecorder.enabled = true;
}
Perlu diperhatikan bahwa di sini perlu memeriksa terlebih dahulu apakah ARAssembly.FrameRecorder ada.
Catatan
ARAssembly.FrameRecorder dalam beberapa kasus tertentu, seperti saat menggunakan FramePlayer, tidak dapat digunakan.
Langkah selanjutnya
- Pelajari cara mendapatkan hasil eksekusi sesi yang mencakup output eksekusi komponen AR
- Selain itu, Anda dapat menjelajahi contoh-contoh berikut untuk memahami akses komponen:
- Contoh Workflow_ARSession menunjukkan berbagai metode akses dan penggunaan komponen
Topik terkait
- Sumber frame menjelaskan sumber frame dan cara pemilihannya saat runtime
- XR Origin menjelaskan kegunaan komponen origin dalam adegan AR
- Camera menjelaskan kegunaan komponen kamera dalam adegan AR
- Merekam file EIF menjelaskan detail penggunaan FrameRecorder