Mengakses komponen fitur AR dalam session
Dalam session yang sedang berjalan, Anda dapat mengakses berbagai komponen fitur melalui properti Assembly. Artikel ini menjelaskan cara mengakses komponen tersebut dan hal yang perlu diperhatikan saat mengaksesnya.
Sebelum memulai
- Pahami konsep dasar, komposisi, dan alur kerja session melalui Pengantar ARSession
- Pahami cara membuat session
Mengonfigurasi komponen AR saat editing atau sebelum start
Terkadang, beberapa opsi komponen, seperti DesiredFocusMode, harus dikonfigurasi sebelum komponen dimulai. Jika tidak ingin mengonfigurasi dan memulai komponen secara manual setelah session dimulai, cara sederhana adalah mengonfigurasi semua komponen frame source yang mungkin digunakan sebelum perakitan session. Proses perakitan akan mempertahankan satu atau beberapa komponen tersebut dan menerapkan konfigurasinya.
Pada saat ini, Anda dapat menggunakan metode dasar Unity apa pun seperti FindAnyObjectByType<T>() atau GetComponent<T>() untuk menemukan komponen, lalu mengonfigurasinya.
Catatan
Komponen AR yang diperoleh dengan cara ini belum tentu akan dimasukkan ke session saat runtime. Karena itu, semua kemungkinan harus dikonfigurasi.
Misalnya, kode berikut menunjukkan proses mengubah mode fokus semua komponen frame source sebelum perakitan session:
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 di atas juga dapat dilakukan di editor, dan semua komponen juga perlu dikonfigurasi:

Konfigurasi untuk dua frame source ARCoreARFoundationFrameSource dan ARKitARFoundationFrameSource berada pada komponen Main Camera.
Peringatan
Komponen AR yang diperoleh dengan cara ini hanya dapat digunakan untuk konfigurasi sebelum berjalan.
Karena proses perakitan akan menyaring komponen AR, komponen AR yang diperoleh melalui tree scene mungkin tidak dimasukkan ke session sehingga tidak dapat bekerja dengan normal.
Menggunakan komponen AR yang telah dirakit saat berjalan
Komponen AR yang berjalan dalam session baru ditentukan setelah perakitan. Sebelum perakitan selesai, komponen AR apa pun tidak dapat digunakan. Komponen AR yang telah dirakit dapat diakses melalui properti Assembly.
Assembly dapat digunakan ketika status session >= Assembled. Secara lebih rinci, setelah metode Assemble() selesai dijalankan, properti Assembly baru akan diberi nilai, dan komponen session dapat diakses melaluinya. Setelah session berhenti atau rusak, properti Assembly akan dikosongkan dan komponen tidak lagi dapat diakses.
Anda dapat memeriksa State session dalam skrip untuk menentukan apakah komponen AR dapat diakses pada saat itu:
if (Session.State >= ARSession.SessionState.Ready)
{
// Assembly tersedia
}
else
{
// Assembly tidak tersedia
}
Anda juga dapat berlangganan event StateChanged untuk memperoleh perubahan status session, lalu mengakses komponen AR pada waktu yang tepat. Secara umum, agar dapat menangkap status Ready, Anda perlu berlangganan event StateChanged sebelum session start. Biasanya aman melakukan subscription di Awake():
void Awake()
{
Session.StateChanged += (state) =>
{
if (Session.State == ARSession.SessionState.Ready)
{
// Assembly tersedia; setelah ini Assembly tetap dapat diakses sampai session dihentikan atau rusak
}
else if (Session.State < ARSession.SessionState.Ready)
{
// Assembly tidak tersedia; setelah ini Assembly tetap tidak dapat diakses sampai session dimulai ulang
}
else
{
// Assembly tersedia; biasanya tidak perlu ditangani
}
};
}
Hati-Hati
Jika komponen AR yang diperoleh melalui metode seperti FindAnyObjectByType<T>() atau GetComponent<T>() pasti akan dimasukkan ke session, komponen tersebut juga dapat digunakan saat runtime.
Menyimpan referensi komponen ini aman, tetapi saat menggunakannya Anda harus memastikan session berada dalam status berjalan dan komponen tersebut dimasukkan dengan benar dalam session. Jika tidak, pengecualian atau perilaku yang tidak terduga dapat terjadi.
Sebelum session dimulai dan setelah session berhenti, komponen ini tidak dapat bekerja. Bahkan dalam penggunaan seperti ini, tetap disarankan memperhatikan State session dan event StateChanged.
Mengakses komponen frame source
Anda dapat menggunakan properti ARAssembly.FrameSource untuk mengakses komponen frame source. Dalam session yang berjalan normal, ARAssembly.FrameSource ada tepat satu.
Saat menggunakan session, biasanya Anda perlu mengakses ARAssembly.FrameSource untuk menentukan jenis komponen frame source yang benar-benar digunakan saat runtime, sehingga dapat mengakses properti dan metode khusus komponen tersebut.
Misalnya, kode berikut menunjukkan cara menggunakan metode deteksi bidang yang berbeda berdasarkan frame source yang berbeda:
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 menggunakan properti ARAssembly.FrameFilters untuk mengakses komponen frame filter. Dalam session yang berjalan normal, daftar ARAssembly.FrameFilters dapat memiliki beberapa komponen dari tipe apa pun.
Misalnya, kode berikut menunjukkan cara memperoleh sebuah MegaTrackerFrameFilter dalam session dan mendaftarkan event terkait:
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 dalam scene, ini adalah cara cepat untuk menemukan kamera yang digunakan AR.
Misalnya, kode berikut menunjukkan cara memperoleh camera dalam session dan melakukan raycast pada objek di scene:
var ray = Session.Assembly.Camera.ScreenPointToRay(screenPoint);
if (Physics.Raycast(ray, out var hitInfo))
{
TouchRoot.transform.position = hitInfo.point;
};
Mengakses komponen origin
Anda dapat menggunakan properti ARAssembly.Origin untuk mengakses komponen origin.
Misalnya, kode berikut menunjukkan cara memperoleh origin dalam session dan menampilkan sebuah frustum yang mewakili posisi serta arah kamera saat ini dalam 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 Anda harus lebih dulu menentukan apakah ARAssembly.Origin ada.
Catatan
ARAssembly.Origin hanya ada dalam session yang mengaktifkan fungsi pelacakan gerakan.
Mengakses komponen CameraImageRenderer
Anda dapat menggunakan properti ARAssembly.CameraImageRenderer untuk mengakses komponen CameraImageRenderer.
Misalnya, kode berikut dapat memperoleh 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 di sini Anda harus lebih dulu menentukan apakah ARAssembly.CameraImageRenderer ada.
Catatan
ARAssembly.CameraImageRenderer hanya berlaku dalam session yang gambarnya digambar oleh EasyAR. Secara umum, ini tidak berlaku saat menggunakan AR Foundation atau headset. Dalam kondisi tersebut, gambar kamera fisik digambar oleh AR Foundation atau SDK headset.
Mengakses komponen FrameRecorder
Anda dapat menggunakan properti ARAssembly.FrameRecorder untuk mengakses komponen FrameRecorder.
Misalnya, kode berikut dapat memulai perekaman. Lokasi penyimpanan file bergantung pada konfigurasi, dan secara default disimpan dalam direktori penyimpanan internal aplikasi:
if (session.Assembly.FrameRecorder.OnSome)
{
var frameRecorder = session.Assembly.FrameRecorder.Value;
frameRecorder.enabled = true;
}
Perlu diperhatikan bahwa di sini Anda harus lebih dulu menentukan apakah ARAssembly.FrameRecorder ada.
Catatan
ARAssembly.FrameRecorder tidak dapat digunakan dalam beberapa kondisi, misalnya saat menggunakan FramePlayer.
Langkah berikutnya
- Pahami cara memperoleh hasil berjalan session, yang mencakup output berjalan komponen AR
- Selain itu, Anda juga dapat memahami akses komponen melalui contoh berikut:
- Contoh Workflow_ARSession menunjukkan cara mengakses dan menggunakan berbagai komponen
Topik terkait
- Sumber data frame menjelaskan frame source dan cara pemilihan runtime
- XR Origin menjelaskan kegunaan komponen origin dalam scene AR
- Camera menjelaskan kegunaan komponen camera dalam scene AR
- Merekam file EIF menjelaskan penggunaan rinci FrameRecorder