Membawa game ke perangkat nyata: ekspor ke Android, iOS, Windows, Linux, dan macOS dengan export presets, konfigurasi dan input spesifik platform, pola touch dan orientation untuk mobile, hingga pengaturan ukuran paket dan kepatuhan platform.

Semua sistem game sudah lengkap: animasi, multiplayer, performa, plugin, dan shader. Episode 17 membawa kalian keluar dari editor: mengekspor game ke perangkat nyata. Godot unggul di sini — satu codebase bisa menembus Android, iOS, Windows, Linux, dan macOS. Tapi setiap platform punya kekhasan sendiri: dari konfigurasi, input, sampai aturan toko aplikasi.
Roadmap episode ini: menyiapkan export templates dan preset, mengonfigurasi preset per platform, ekspor desktop (Windows, Linux, macOS), ekspor mobile (Android, iOS), pola input dan orientation untuk layar sentuh, lalu menutup dengan ukuran paket dan kepatuhan platform.
Sebelum ekspor, pastikan export templates terpasang — runtime Godot khusus untuk platform tujuan. Di menu Editor → Manage Export Templates, pilih versi yang sama dengan editor kalian, lalu klik Download and Install. Tanpa template, tombol ekspor hanya menampilkan pesan error.
Selanjutnya buat export preset lewat Project → Export. Preset menyimpan semua pengaturan satu platform: target, permission, icon, dan kompresi. Simpan preset sebagai file .preset di dalam project agar bisa di-version-control — seluruh tim dan CI memakai pengaturan yang sama. Satu project bisa punya banyak preset, misalnya android-release dan android-debug.
Ekspor juga bisa diotomasikan dari terminal — ini berguna untuk CI:
godot --headless --export-release "android-release" build/game.apkTiap preset punya tiga bagian yang harus kalian pahami:
Pilihan rendering juga memengaruhi kompatibilitas: renderer mobile dan compatibility jauh lebih ringan untuk perangkat rendah dibanding forward_plus. Bagi game 2D sederhana di ponsel, renderer compatibility sering menjadi pilihan paling aman.
Ekspor desktop adalah yang paling sederhana: buat preset per OS, lalu export. Windows memakai template .exe, Linux menghasilkan biner yang bisa dibungkus AppImage atau tar, dan macOS menghasilkan aplikasi .app yang harus ditandatangani untuk distribusi luas.
Beberapa catatan penting:
.ico untuk Windows, .png multi-size untuk Linux, .icns untuk macOS. Perbedaan ini kecil tapi sering meloloskan diri dan membuat game terlihat tidak profesional.user:// untuk menyimpan data pengguna dan OS.get_environment untuk variabel lingkungan.Info
Jangan tunggu akhir project untuk uji ekspor. Buat build desktop sederhana di episode awal dan ekspor seminggu sekali — masalah seperti icon, font, atau path yang hilang jauh lebih murah ditemukan lebih awal. Debug "hanya ada di build" adalah yang paling mahal.
Mobile membutuhkan persiapan tambahan karena proses ekosistemnya ketat:
Install to device dan pastikan USB debugging aktif. Untuk rilis, kalian butuh keystore (kunci penandatangan) dan mengisi Keystore Config di preset. Kalian juga harus menetapkan min_sdk dan target_sdk sesuai versi Google Play terbaru.Android dan iOS sama-sama menuntut kalian menangani permission dengan hati-hati — hanya minta izin yang benar-benar dipakai, karena toko aplikasi memeriksa permission yang berlebihan.
Desktop memakai keyboard dan mouse; mobile memakai layar sentuh. Untungnya sistem Input Map dari episode 11 sudah menyatukan keduanya: satu action bisa diisi input keyboard dan touch. Untuk kontrol sentuh virtual, pakai node TouchScreenButton atau buat tombol UI sendiri di atas layar.
Untuk game yang butuh kontrol analog seperti platformer atau top-down shooter, virtual joystick jauh lebih nyaman daripada tombol arah. Buatlah joystick sederhana dari dua node: sebuah lingkaran luar sebagai area sentuh dan lingkaran dalam sebagai knob yang mengikuti jari.
@export var radius_maks: float = 50.0
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventScreenTouch and event.pressed:
knob.global_position = event.position
elif event is InputEventScreenDrag:
var dari_pusat: Vector2 = event.position - pusat.global_position
knob.global_position = pusat.global_position + dari_pusat.limit_length(radius_maks)Pola ini penting dikuasai karena aplikasi nyata hampir selalu butuh lebih dari satu titik sentuh sekaligus — pemain menggerakkan joystick dengan jempol kiri sambil menekan tombol aksi dengan jempol kanan. Input Map Godot menangani multi-touch dengan baik asalkan setiap kontrol virtual memakai action yang berbeda.
Pola umum untuk menggeser layar:
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventScreenDrag:
$Player.position += event.relative
elif event is InputEventScreenTouch and event.pressed:
$Player.position = event.positionOrientation juga perlu diputuskan lebih awal: landscape untuk game aksi, portrait untuk game kasual. Atur di preset platform (Screen Orientation) dan pertimbangkan bahwa menahan orientasi lebih murah daripada mendukung rotasi dinamis. Di sisi performa, targetkan 60 FPS stabil, matikan fitur yang tidak dipakai (shader berat, efek layar), dan uji dengan battery saver — karena termal dan baterai adalah musuh game mobile.
Dua kekhawatiran terakhir sebelum rilis: ukuran paket dan kepatuhan. Game mobile yang terlalu besar membuat user enggan mengunduh, dan toko aplikasi mematok batas (Google Play maksimal 200 MB untuk APK, dengan asset packs). Cara menekan ukuran:
Compliance menyangkut aturan toko: umur rating, kebijakan privasi, consent untuk iklan, dan deskripsi permission. Untuk game yang mengumpulkan data pengguna — termasuk analytics sederhana — pastikan ada kebijakan privasi dan mekanisme consent yang jelas.
Warning
Ukuran binari hanyalah separuh cerita; waktu load juga bagian dari pengalaman. Paket kecil yang memuat texture tak terkompresi akan tetap terasa lambat. Prioritaskan kompresi texture sejak awal, karena mengubah skema kompresi belakangan bisa mengubah warna visual game kalian.
Kalian kini bisa membawa game ke perangkat nyata: menyiapkan export templates dan preset yang di-version-control, mengekspor ke Windows, Linux, macOS dengan pengaturan icon dan signing masing-masing, mengekspor ke Android dan iOS dengan keystore serta Xcode, menangani input sentuh dan orientation untuk mobile, hingga menekan ukuran paket dengan kompresi texture dan memastikan kepatuhan platform.
Inti yang harus dibawa pulang:
.preset agar bisa di-version-control.compatibility atau mobile lebih aman untuk perangkat rendah dibanding forward_plus.InputEventScreenDrag dan TouchScreenButton untuk mobile.Di episode 18, game kalian siap dibawa ke mana-mana — dan itu memunculkan pertanyaan arsitektur: advanced architecture & patterns, dari pola ECS-inspired dan entity management, sistem yang decoupled dengan signals dan messaging, hingga arsitektur modular dan plugin-based scenes. Karena game yang besar tidak menang karena fitur, melainkan karena fondasi.