Godot di XREAL AURA: Panduan Praktis untuk Pengembangan Spatial Native
Ringkasnya
Pelajari pengembangan spatial native di XREAL AURA dengan Godot: setup editor, OpenXR Spatial Containers, anchor drift, dan praktik terbaik.
Pipeline build XR Anda saat ini berarti harus terhubung ke desktop, mengekspor APK, melakukan sideload melalui ADB, memakai headset, menemukan typo, dan memulai dari awal. XREAL AURA menghilangkan siklus itu sepenuhnya, dan Godot ada di daftar peluncuran dengan editor lengkap yang berjalan langsung di kacamata tersebut. Itu mengubah arti "iterasi" untuk pengembangan spatial.
Panduan ini membahas alur kerja sebenarnya: menjalankan editor di AURA, menyusun scene spatial dengan OpenXR Spatial Containers, menangani model passthrough/see-through yang membuat kacamata optik berbeda dari headset VR, serta jebakan yang akan menghantam Anda pada ekspor pertama.
Mengapa Optical See-Through Mengubah Asumsi Desain Anda
XREAL AURA adalah perangkat optical see-through pertama di Android XR. Satu kalimat itu mematahkan asumsi yang tertanam di sebagian besar tutorial XR Godot.
Di headset VR, kamera headset merender semuanya. Pengguna melihat lingkungan Anda dan tidak ada yang lain. Di kacamata optical see-through, pengguna melihat menembus lensa ke dunia nyata, dan konten yang dirender dikomposit di atasnya. Ini tidak sama dengan video passthrough di Quest — video passthrough menangkap realitas dengan kamera dan menampilkannya ulang, yang menyebabkan latensi dan kehilangan cahaya. Optical see-through memiliki nol latensi kompositor untuk dunia nyata.
Konsekuensi praktis untuk anggaran rendering Anda:
- Anda tidak bisa menggelapkan dunia nyata. Warna hitam di layar transparan bersifat transparan. Anda tidak punya latar buram, jadi UI yang mengandalkan kontras terhadap panel gelap akan gagal di ruangan terang.
- Konten bergaya aditif menang. Konten emisif terang terbaca dengan baik; konten gelap dan desaturasi akan hilang. Desain palet Anda pada 2-3x luminansi yang biasa Anda gunakan di VR.
- Field of view lebih sempit daripada VR. Konten yang ditempatkan di sudut ekstrem berada di luar area tampilan. Jaga target interaksi utama dalam kisaran ±30 derajat dari pusat depan.
Jika Anda pernah merilis VR sebelumnya, perkirakan untuk menyetel ulang setiap material dan setiap panel UI. Alokasikan satu hari penuh untuk setiap scene.
Menyiapkan Editor Godot di Kacamata
Editor didistribusikan melalui Google Play, bukan sebagai APK sideload. Itu penting karena berarti Anda bisa memperbaruinya seperti aplikasi lain.
Urutan penyiapan:
- Instal editor Godot di XREAL AURA dari Play Store.
- Instal aplikasi pendamping lingkungan build Gradle. Aplikasi ini menyertakan toolchain ekspor Android, jadi Anda tidak perlu membangun JDK dan Android SDK dari nol di perangkat.
- Masuk dengan identitas developer Android jika Anda berencana menandatangani dan memublikasikan build dari perangkat.
- Luncurkan editor — editor terbuka di ruang kerja spatial multi-window, bukan jendela datar tunggal.
Poin keempat itulah yang menarik. Editor memberi Anda fitur set ala desktop, tetapi disusun sebagai jendela melayang di ruang. Anda bisa menyimpan Scene tree di satu volume dan viewport 2D di volume lain.
Apa yang Sebenarnya Anda Dapatkan dari Alur Kerja On-Device
Jawaban jujurnya: iterasi cepat pada feel, iterasi lebih lambat pada assetry.
Mengedit shader, menyesuaikan transform node, dan menguji pemetaan input di perangkat target menghilangkan seluruh siklus ekspor-uji. Siklus itu biasanya memakan 3-8 menit jika Anda memperhitungkan waktu build, transfer, dan peluncuran ulang. Sepuluh iterasi berarti satu jam hilang.
Yang tidak dibantu: mengimpor texture atlas besar, menjalankan lightmap bake yang lama, atau hal-hal berat CPU. Lakukan itu di workstation. Pembagian yang realistis adalah pembuatan aset di desktop, perakitan scene dan penyetelan di kacamata.
Membangun Konten Spatial dengan OpenXR Spatial Containers
Dukungan Android XR Godot mencakup OpenXR Spatial Containers — volume yang dikelola sistem tempat aplikasi Anda menempatkan konten spatial. Analogi dari platform itu sendiri cukup akurat: aplikasi tradisional menggambar konten 2D di dalam jendela di desktop; aplikasi spatial menggambar konten 3D di dalam container di sebuah ruangan.
Ada dua tipe container yang perlu dipahami sebelum Anda menulis kode:
| Tipe container | Terbaik untuk | Trade-off |
|---|---|---|
| Volume | Objek 3D dengan kedalaman nyata, penempatan world-locked | Sistem dapat membatasi batas volume |
| Panel | Permukaan UI, teks, game 2D | Dirender di bidang tetap; isyarat kedalaman datar |
Kesalahan yang paling sering dilakukan developer adalah memilih volume untuk UI. Teks di container volume akan di-skala dan dipindahkan oleh sistem dengan cara yang tidak bisa Anda prediksi sepenuhnya, dan widget radar yang Anda posisikan dengan hati-hati akan melayang. Letakkan UI di container panel dan biarkan sistem menangani penempatan.
Bekerja dengan Spatial Container API
Godot mengekspos spatial container melalui kelas ekstensi OpenXR. Nama kelas yang tepat bergantung pada versi Godot Anda, jadi periksa daftar fitur engine untuk binding spatial container saat ini sebelum menulis kode produksi. Pola di bawah mencerminkan bagaimana konten XR berbasis container biasanya disusun.
extends Node3D
signal container_created(handle: int)
# Spatial container setup for Android XR.
# Class names are version-dependent; verify against the
# OpenXR extension bindings shipped with your Godot build.
var volume_container: SpatialContainer
var panel_container: SpatialContainer
func _ready() -> void:
var xr_interface: XRInterface = XRServer.find_interface("OpenXR")
if xr_interface == null or not xr_interface.is_initialized():
push_error("OpenXR interface unavailable on this device.")
return
# Volume container for the 3D board.
volume_container = SpatialContainer.new()
volume_container.container_type = SpatialContainer.TYPE_VOLUME
volume_container.extent = Vector3(0.6, 0.4, 0.6) # 60cm x 40cm x 60cm
if volume_container.request_container() != OK:
push_error("Volume container request failed.")
return
# Panel container for the HUD.
panel_container = SpatialContainer.new()
panel_container.container_type = SpatialContainer.TYPE_PANEL
panel_container.extent = Vector3(0.4, 0.4, 0.02)
panel_container.request_container()
add_child(volume_container)
add_child(panel_container)
container_created.emit(volume_container.get_container_handle())
func _process(_delta: float) -> void:
# Containers can be rejected or resized by the system.
if volume_container and not volume_container.is_active():
_handle_container_loss()
func _handle_container_loss() -> void:
push_warning("Volume container lost - repositioning.")
# Never assume the container survives; re-request on loss.
volume_container.request_container()
Baris kritisnya adalah _handle_container_loss(). Container yang dikelola sistem, secara definisi, dikelola oleh sistem. Pengguna pergi, asisten memposisikan ulang konten, atau perangkat mengambil kembali ruang. Jika penanganan input Anda tidak bertahan saat container hilang, aplikasi Anda akan diam dengan papan tak terlihat dan pemain yang menekan-nekan tombol.
Jebakan yang Hampir Semua Orang Alami: Anchor Drift
Ini masalah spesifiknya, dan ini yang akan menghabiskan waktu debugging Anda paling banyak.
Anda menempatkan papan 3D di container volume. Anda menekan Play. Semuanya terlihat benar. Anda melepas kacamata, memakainya lagi dua menit kemudian, dan papan sekarang bergeser setengah meter ke kiri dan berotasi 20 derajat.
Mengapa? Karena Anda meng-anchor konten ke world origin, bukan ke container. World origin di perangkat spatial bukan tempat yang stabil — ia didefinisikan relatif terhadap pose awal sesi. Saat sesi melakukan re-anchor, world origin bergeser.
Perbaikannya adalah menjaga setiap bagian scene Anda sebagai child dari transform container, dan jangan pernah membaca atau menulis posisi global untuk konten spatial:
# WRONG: assumes world origin is stable
func place_piece(piece: Node3D, board_pos: Vector3) -> void:
piece.global_position = board_pos
# RIGHT: position relative to the container transform
func place_piece(piece: Node3D, board_pos: Vector3) -> void:
piece.position = board_pos # local to container
piece.rotation = Vector3.ZERO
Lakukan grep di seluruh proyek Anda untuk .global_position dan .global_transform sebelum rilis. Setiap kemunculan di konten spatial adalah potensi bug drift. Kelas bug ini juga muncul di pekerjaan 3D konvensional dan multiplayer — kesalahan anchor dan kepemilikan pada transform yang direplikasi menghasilkan gejala "objek teleport untuk sebagian klien" yang persis sama, itulah mengapa memperlakukan transform sebagai container-local daripada absolut adalah kebiasaan yang layak dibawa ke proyek Godot jaringan apa pun.
Memverifikasi Perbaikan
Untuk memastikan anchoring sudah benar:
- Luncurkan scene Anda dan catat posisi papan.
- Lepas perangkat, tunggu 60 detik, masuk kembali ke aplikasi.
- Papan akan muncul di lokasi fisik yang sama relatif terhadap ruangan, bukan offset yang sama dari posisi Anda berdiri.
- Ulangi dengan orientasi perangkat yang berbeda — duduk, lalu berdiri.
Jika melayang, pohon konten Anda masih memiliki referensi absolut. Jika melompat tetapi tetap konsisten setelah lompatan, container sedang diposisikan ulang dan konten Anda mengikuti dengan benar — itu perilaku yang diharapkan, bukan bug.
Menangani Identitas Pemain dan State Persisten
Aplikasi spatial di Android XR adalah aplikasi Android. Mereka suspend, mereka resume, pengguna mungkin memiliki beberapa identitas yang masuk di perangkat, dan data simpanan Anda berada di ekosistem akun yang sama dengan yang lainnya.
Mode kegagalannya halus: pemain bermain secara spatial di kacamata, lalu membuka game yang sama di ponsel mereka. Jika state simpanan Anda lokal-perangkat, mereka sekarang memiliki dua dunia yang berbeda dan tidak ada cara untuk menyatukannya. Memperbaiki ini bukan masalah rendering, melainkan masalah identitas akun.
Melakukannya dengan benar berarti mengimplementasikan alur sign-in, penyimpanan save di sisi server, dan — bagian yang paling diremehkan semua orang — penanganan konflik saat dua perangkat menulis ke slot save yang sama. Model baca/tulis yang sadar-revisi di mana klien membandingkan versi dan menyelesaikan konflik secara eksplisit adalah satu-satunya versi yang bertahan saat digunakan pengguna nyata. Membangun itu dari nol adalah pekerjaan multi-minggu; horizOn menyediakan cloud save terikat-akun dengan baca/tulis sadar-revisi persis untuk kasus ini, beserta autentikasi email, anonim, Google, dan Apple sehingga identitas pemain yang sama terbawa antara kacamata dan ponsel.
Backend apa pun yang Anda gunakan, tentukan kebijakan konflik sebelum rilis. Last-write-wins secara diam-diam menghancurkan progres. Meminta konfirmasi pemain lebih baik daripada kehilangan data.
Praktik Terbaik untuk Rilis di XREAL AURA
- Desain untuk cahaya sekitar. Uji setiap panel UI di luar ruangan saat siang dan di ruangan redup. Jika teks Anda menjadi tidak terbaca di salah satunya, naikkan kontras dan tambahkan outline terang yang halus daripada bayangan gelap — bayangan tidak berfungsi di layar transparan.
- Jaga container tetap kecil dan dapat diminta ulang. Volume 60cm lebih mudah ditempatkan sistem secara andal daripada yang 2m. Asumsikan setiap container bisa hilang kapan saja dan tulis jalur pemulihan lebih dulu, bukan terakhir.
- Batasi anggaran render secara agresif. Ini kacamata, bukan GPU desktop. Targetkan frame time di bawah 11ms (kelas 90Hz) dengan temporal anti-aliasing dimatikan demi MSAA, yang lebih murah pada resolusi spatial.
- Letakkan UI di panel, konten di volume. Jangan melawan logika penempatan sistem untuk teks. Cadangkan volume untuk hal-hal dengan kedalaman asli yang diperiksa pemain dari berbagai sudut.
- Verifikasi di perangkat sebelum setiap milestone. Editor di kacamata membuat ini murah. Hasil simulator tidak akan mengungkap anchor drift, kegagalan luminansi, atau perilaku kehilangan container.
Melangkah ke Tahap Berikutnya
Editor on-device adalah sorotan utama di sini. Ia memampatkan siklus iterasi spatial dari menit menjadi detik, dan itulah perbedaan antara menyetel desain dan menebak-nebak desain.
Mulailah dengan menginstal editor dan aplikasi Gradle pendamping di AURA, lalu bangun ulang proyek kecil yang sudah ada sebagai scene spatial daripada memulai dari nol — Anda akan langsung menemukan masalah anchoring dan luminansi pada konten yang sudah Anda pahami. Dari sana, tambahkan container volume 3D dan panel UI, lalu buat keduanya stabil melalui siklus suspend/resume. Setelah itu bertahan, Anda siap mendesain untuk platform, bukan melawannya.
Jika state pemain persisten lintas-perangkat ada di daftar Anda, horizOn menangani cloud save terikat-akun dengan resolusi konflik sisi-klien sehingga sesi spatial dan sesi layar datar Anda tetap selaras.
Sumber: Siap untuk XREAL AURA