Saat mengembangkan game untuk Android, Anda harus mengantisipasi beragam kemungkinan pengalaman pemain dan tetap adaptif dengan kebutuhan interaksi real-time pemain. Dengan mendukung pengalaman yang beragam bagi pemain, Anda akan meningkatkan fleksibilitas game sehingga jangkauan game pun semakin luas.
Perbedaan spesifik pada pengalaman pemain meliputi beberapa hal berikut:
- Faktor bentuk perangkat: Meskipun orang pada umumnya menggunakan Android dari ponsel, game mungkin dimainkan pada perangkat dengan faktor bentuk lain. Perangkat ChromeOS dapat menjalankan container Android yang menampilkan game Anda. Tablet yang dapat menjalankan Android mendukung berbagai tingkat fidelitas. Perangkat Android TV mendukung pengalaman yang lebih mendetail dan lebih imersif. Pemain dapat menyimulasikan lingkungan multi-aplikasi menggunakan fitur ekstensi tampilan. Dan jika menggunakan perangkat foldable, pemain dapat mengubah ukuran layar selama sesi bermain game.
- Metode interaksi: Pemain dapat memberikan input dengan menyentuh layar perangkat, pemain juga dapat menggunakan mouse, touchpad, keyboard, atau pengontrol. Selain itu, dengan adanya alat ekstensi layar dan perangkat foldable, pemain dapat merasakan pengalaman bermain game pada layar yang lebih besar. Ini memperpanjang sesi bermain dan memungkinkan antarmuka yang lebih kompleks.
- Dukungan hardware: Beberapa perangkat Android tidak memiliki hardware yang umumnya ada pada perangkat genggam, seperti kamera belakang, GPS, dan konektivitas jaringan. Game Anda harus menyesuaikan dengan hardware yang tersedia dan menangani situasi dengan baik jika fitur tertentu tidak tersedia.
Panduan ini menyajikan praktik terbaik terkait dengan mengembangkan game untuk berbagai jenis layar dan interaksi pengguna. Panduan ini juga memberikan saran untuk mendesain game dan mengembangkan strategi pengujian yang efektif.
Praktik terbaik desain game
Saat merencanakan desain dan arsitektur game, ikuti praktik terbaik yang dijelaskan pada bagian berikut.
Menanggapi perubahan konfigurasi secara manual
Jika sistem Android mendeteksi perubahan konfigurasi, seperti perubahan
pada ukuran layar, orientasi layar, atau metode input, sistem ini secara default akan memulai ulang
aktivitas saat ini. Untuk mempertahankan status dalam aplikasi atau game, aktivitas
secara default memanggil
onSaveInstanceState()
sebelum dimulai ulang dan
onRestoreInstanceState()
setelah dimulai ulang. Namun, proses ini membutuhkan aktivitas untuk memuat ulang semua
layanan dan resource terkait. Untuk mempelajari perilaku default ini lebih lanjut,
lihat panduan dalam menangani perubahan
konfigurasi.
Setiap sesi bermain game biasanya mengalami beberapa perubahan konfigurasi. Jika yang menangani setiap perubahan konfigurasi adalah sistem dan bukan game Anda, scene dalam game akan ditutup dan dimulai ulang berulang kali sehingga menurunkan performa game. Karena itu, kami sangat menyarankan Anda untuk menangani sendiri perubahan konfigurasi dalam game.
Untuk mempelajari cara menambahkan logika perubahan konfigurasi ini ke dalam game, lihat bagian tentang cara membuat pengendali perubahan konfigurasi kustom.
Membuat arsitektur fleksibel
Guna menambahkan dukungan untuk game di sebanyak mungkin perangkat, ikuti beberapa praktik terbaik ini:
- Men-deploy Android App Bundle, bukan APK individual. Android App Bundle memungkinkan Anda mengemas artefak dari berbagai resolusi dan model arsitektur yang berbeda, seperti x86, ARM, menjadi satu artefak. Selain itu, Android App Bundle mendukung batas ukuran yang lebih besar untuk game; setiap APK dasar dapat berukuran hingga 150 MB, dan bundle itu sendiri dapat berukuran banyak gigabyte.
- Menambahkan dukungan untuk arsitektur x86. Langkah ini meningkatkan performa game pada perangkat yang tidak mendukung ARM, karena perangkat ini kini dapat menjalankan instruksi tanpa harus menerjemahkannya terlebih dahulu.
Menambahkan dukungan untuk Vulkan
Dengan mendukung Vulkan, game Anda dapat mencapai performa grafis yang lebih tinggi. Kebanyakan perangkat mendukung API grafis ini.
Membuat pengendali perubahan konfigurasi kustom
Untuk mendeklarasikan jenis perubahan konfigurasi yang ditangani game Anda sendiri, tambahkan
atribut android:configChanges
ke setiap elemen <activity>
dalam manifes yang mewakili layar
atau antarmuka yang kompleks.
Cuplikan kode berikut menunjukkan cara mendeklarasikan bahwa game Anda menangani perubahan ukuran layar, orientasi layar, dan metode input:
<activity ... android:configChanges="screenSize|orientation|keyboard|keyboardHidden"> </activity>
Saat perubahan konfigurasi yang dideklarasikan terjadi, sistem kini memanggil
metode lain,
onConfigurationChanged()
.
Dalam metode ini, tambahkan logika untuk memperbarui UI game Anda:
- Perbarui faktor penskalaan dan orientasi layar. Ingat, untuk tujuan performa, terkadang lebih baik untuk menskalakan UI game Anda hanya dengan satu dimensi.
- Identifikasi metode input optimal untuk digunakan pemain.
Menangani perubahan konfigurasi layar
Game Anda menangani perubahan ukuran layar dan orientasi layar secara manual setiap kali
Anda menyertakan nilai screenSize
dan orientation
,
dalam atribut
android:configChanges
. Nilai-nilai baru tersebut dapat digunakan untuk memperbarui area input pemain dan
konten scene. Untuk panduan tentang cara mendesain tata letak game agar
lebih mudah diperbarui, lihat panduan cara mendukung berbagai ukuran
layar.
Dalam penerapan onConfigurationChanged()
pada game Anda, gunakan objek
Configuration
dan
objek Display
pengelola jendela
yang dimasukkan untuk menentukan nilai baru ukuran dan
orientasi layar.
Cuplikan kode berikut menunjukkan cara mendapatkan orientasi dan ukuran layar yang telah diperbarui pada game Anda:
Kotlin
override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val density: Float = resources.displayMetrics.density val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt() val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt() // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or // Configuration.ORIENTATION_LANDSCAPE. val newScreenOrientation: Int = newConfig.orientation // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180, // or ROTATION_270. val newScreenRotation: Int = windowManager.defaultDisplay.rotation }
Java
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); float density = getResources().getDisplayMetrics().density; int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density); int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density); // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or // Configuration.ORIENTATION_LANDSCAPE. int newScreenOrientation = newConfig.orientation; // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180, // or ROTATION_270. int newScreenRotation = getWindowManager().getDefaultDisplay() .getRotation(); }
Perlu diketahui bahwa perubahan pose perangkat foldable akan mengubah konfigurasi, meskipun aplikasi berjalan dalam mode layar penuh. Akibatnya, aplikasi Anda mungkin harus menangani perubahan ukuran layar atau kepadatan piksel jika pengguna melipat atau membuka lipatan perangkat saat game sedang berjalan.
Kualitas layar khusus game
Bagian berikut menjelaskan cara menyesuaikan reaksi game terhadap perubahan ukuran atau orientasi layar, yang bergantung pada kualitas game:
Mode layar penuh
Pada beberapa platform, seperti ChromeOS, aplikasi dan game Android dapat di-jendela dan
dapat diubah ukurannya
secara {i>default<i}. Jika game Anda harus selalu berjalan dalam mode layar penuh, Anda
dapat menyetel atribut
android:resizeableActivity
ke false
di salah satu elemen <activity>
, seperti yang ditunjukkan dalam
cuplikan kode berikut:
<activity ... android:resizeableActivity="false"> </activity>
Anda juga dapat menetapkan atribut android:resizeableActivity
ke false
untuk mencegah
terjadinya perubahan konfigurasi berdasarkan ukuran. Akan tetapi, kecuali game Anda selalu berjalan dalam mode layar penuh, Anda harus menambahkan atribut ini sebagai solusi sementara
untuk tujuan pengujian.
Orientasi layar
Jika game Anda menggunakan sensor perangkat untuk mengharuskan orientasi tertentu,
tentukan nilai untuk
android:screenOrientation
dalam
aktivitas game, seperti yang ditunjukkan dalam cuplikan kode berikut. Setelan ini membantu
mencegah scene dalam game Anda terbalik secara tiba-tiba.
<activity ... android:screenOrientation="landscape"> </activity>
Kualitas layar khusus perangkat
Bagian berikut menjelaskan cara menangani perubahan konfigurasi berbasis layar berdasarkan kualitas tertentu yang dimiliki beberapa perangkat.
Rasio lebar tinggi
Beberapa perangkat mendukung berbagai rasio lebar tinggi. Misalnya, perangkat foldable dirancang untuk mendukung rasio lebar tinggi 21:9 saat dalam kondisi terlipat. Untuk menangani berbagai kemungkinan rasio lebar tinggi, lakukan setidaknya satu tindakan berikut:
- Targetkan Android 8.0 (API level 26) atau yang lebih baru.
- Pastikan antarmuka dan scene game Anda dapat diubah ukurannya. Tetapkan
android:resizeableActivity
ketrue
di perangkat yang menjalankan Android 7.0 (API level 24) dan yang lebih baru. Deklarasikan rasio lebar tinggi maksimum yang didukung. Pada atribut
<meta-data>
yang terkait dengan game Anda, setelandroid.max_aspect
ke2.4
, seperti yang ditunjukkan dalam cuplikan kode berikut. Namun, perhatikan bahwa rasio lebar tinggi yang lebih besar dari yang Anda tentukan akan menyebabkan game disajikan dalam tampilan lebar pada layar.<application> <meta-data android:name="android.max_aspect" android:value="2.4" /> </application>
Beberapa aktivitas terlihat secara bersamaan
Banyak perangkat mendukung berbagai tata letak layar, termasuk layar terpisah, picture-in-picture, dan area tampilan besar. Saat menggunakan salah satu tata letak ini, sistem dapat membuat beberapa aktivitas yang terlihat pada saat yang sama.
Pada perangkat yang menjalankan Android 9 (API level 28) atau yang lebih baru, semua
aktivitas teratas yang terlihat dapat dilanjutkan pada saat yang sama. Namun, agar perilaku ini
berfungsi, baik game Anda maupun OEM perangkat harus memilih fungsi
tersebut. Anda dapat menambahkan dukungan dalam game dengan menyetel
android.allow_multiple_resumed_activities
ke true
di manifes game,
seperti yang ditampilkan dalam cuplikan berikut:
<application> <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true" /> </application>
Selanjutnya, Anda dapat menguji game di berbagai perangkat guna mengetahui perangkat mana yang menyediakan dukungan OEM yang diperlukan agar multi-resume berfungsi dengan baik.
Untuk informasi selengkapnya tentang cara mengonfigurasi game Anda agar muncul sebagai bagian dari tampilan multi-aplikasi, lihat panduan cara menambahkan dukungan multi-aplikasi.
Menangani berbagai jenis model interaksi
Game Anda menangani keberadaan dan ketersediaan keyboard secara manual setiap kali
Anda menyertakan nilai keyboard
dan keyboardHidden
,
dalam atribut
android:configChanges
. Anda dapat menggunakan nilai baru ini untuk memperbarui metode input utama
game Anda.
Saat mengonfigurasi game untuk mendukung beberapa jenis input pengguna, ingat hal berikut:
- Deteksi metode input daripada perangkat individu. Pola pikir ini membuatnya lebih mudah untuk meningkatkan pengalaman pemain tanpa terlalu fokus pada perangkat tertentu yang mungkin dimiliki pemain.
- Sertakan atribut
keyboardHidden
dalam daftar perubahan konfigurasi yang ditangani secara manual. Dengan begitu, game Anda dapat melacak saat keyboard terpasang secara fisik ke perangkat, tetapi tidak dapat digunakan. Tentukan metode input yang saat ini tersedia. Untuk melakukannya, panggil
getInputDeviceIds()
saat memulai game dan setelah setiap perubahan konfigurasi.Anda dapat menentukan bagaimana pemain berencana untuk berinteraksi dengan game berdasarkan perangkat input yang mereka pilih:
- Pemain biasanya menggunakan keyboard atau pengontrol game untuk menekan urutan tombol cepat.
- Pemain biasanya menggunakan touchscreen atau touchpad untuk melakukan gestur yang lebih rumit.
- Pemain biasanya menggunakan input presisi lebih tinggi.
Bagian berikut memberikan praktik terbaik untuk jenis perangkat input tertentu.
Keyboard
Saat membuat tata letak keyboard untuk game, pertimbangkan cara pemain melihat scene tertentu dan berinteraksi dengan setelan game.
Tombol WASD atau tombol panah paling optimal digunakan untuk mengontrol gerakan karakter. Sebaiknya juga tetapkan tombol khusus untuk setiap skill atau aksi penting yang dapat dilakukan karakter yang dapat dikontrol dalam game. Demi memaksimalkan pengalaman pemain, pertimbangkan untuk menambahkan dukungan untuk binding tombol kustom pada game Anda.
Pemain juga harus dapat membuka menu game dan memilihnya
menggunakan keyboard. Tombol Esc
adalah pemetaan umum untuk menjeda adegan dan
menampilkan menu game.
Untuk informasi selengkapnya tentang cara mendukung input keyboard dalam game, lihat panduan cara mendukung navigasi keyboard serta panduan cara menangani tindakan keyboard.
Pengontrol game
Untuk informasi selengkapnya tentang cara menangani input pengontrol dalam game, lihat panduan cara mendukung pengontrol game.
Mouse atau touchpad
Jika game Anda mendukung input pemain dari mouse atau touchpad, ingat bahwa pemain berinteraksi dengan perangkat menggunakan berbagai cara selain memainkan game. Penting diketahui bahwa dengan meminta gambar penunjuk, semua input mouse diarahkan ke game Anda. Oleh karena itu, setelah game Anda memiliki informasi yang dibutuhkan, tampilkan gambar penunjuk agar pemain mendapatkan kembali kontrol mouse standar perangkatnya.
Di perangkat yang menjalankan Android 8.0 (API level 26) dan yang lebih baru, Anda dapat menggunakan Mouse
Capture API untuk membantu proses gambar penunjuk. Dalam game yang merespons
input presisi tinggi, Anda dapat memperoleh koordinat penunjuk saat ini dengan memanggil
metode getX()
dan
getY()
.
Untuk informasi tambahan tentang cara menambahkan dukungan untuk input mouse dan touchpad dalam game, lihat panduan cara melacak gerakan penunjuk serta panduan cara menangani gestur multi-kontrol.
Menguji game Anda
Sebelum meluncurkan game, uji tanggapan game terhadap perubahan konfigurasi dengan menyelesaikan langkah-langkah yang dijelaskan di bagian berikut:
Memperbarui rencana pengujian
Saat memvalidasi fungsionalitas game, cantumkan kasus pengujian berikut:
- Perkecil dan perbesar jendela yang berisi game Anda. (Tidak berlaku jika game selalu dalam mode layar penuh.)
- Ubah ukuran layar.
- Ubah orientasi layar. (Tidak berlaku jika game memiliki orientasi tetap.)
- Sambungkan dan lepaskan sambungan perangkat input, seperti keyboard dan mouse.
- Lakukan multi-resume, jika game mendukungnya.
Selain itu, pertimbangkan untuk mengupdate sistem kontrol kualitas game agar Anda dapat mengoptimalkan beragam pengalaman pemain yang lebih luas.
Untuk praktik terbaik terkait pengujian game, lihat panduan Dasar-Dasar Pengujian.
Menggunakan fitur pengujian dan proses debug
Anda dapat melakukan pengujian menggunakan berbagai alat yang didukung platform:
Emulator, termasuk Android emulator dan Firebase Test Lab.
Performa ChromeOS Penganalisis, tersedia saat menjalankan ChromeOS M75 atau yang lebih baru.