Membuat Game Virtual Reality Android yang Mendukung Kontrol Joystick

Adam Ardisasmita 8 Juli 2016

Membuat Game Virtual Reality Android yang Mendukung Kontrol Joystick

Pada kesempatan kali ini saya akan membahas tutorial untuk mengembangkan game Virtual Reality yang yang menggunakan joystick sebagai controller pada game. Dengan mengikuti tutorial ini, kamu akan bisa membuat game VR yang lebih mudah dinavigasikan dan lebih menarik.

Tutorial ini dibuat untuk pengembangan game Android menggunakan Google Cardboard SDK. Engine yang digunakan di dalam tutorial ini adalah Unity Engine. Kamu bisa mempelajari tentang cara membuat game VR Android menggunakan Google Cardboard SDK pada unity di tutorial ini. Kamu juga bisa mempelajari cara membuat game menggunakan Unity di Dicoding Academy. Jadi ketika mengikuti tutorial ini, kamu sudah mengerti cara membuat game VR dengan Unity. Oke kalau begitu kita mulai saja tutorial kali ini.

Input Pada Unity

Unity telah menyediakan sebuah class di dalam library-nya untuk membaca input. Terdapat class “Input” yang bisa kita panggil dan kita gunakan untuk mendeteksi berbagai masukan seperti mouse, keyboard, dan joystick. Class “input” juga dapat membaca sensor yang ada pada smartphone seperti touch screen dan accelerometer.

Dalam class “Input” ada dua tipe input yang akan digunakan. Yang pertama adalah “Input.GetAxis” yang digunakan untuk membaca masukan dengan tipe vertikal atau horizontal. Input ini biasa digunakan untuk pergerakan pemain menggunakan keyboard, mouse, atau joystick. Yang kedua adalah “Input.GetButton” untuk aksi-aksi yang bersifat eventual atau merupakan trigger seperti melompat, menyerang, dan lain sebagainya.

using UnityEngine;
using System.Collections;

public class Fire : MonoBehaviour {
    
    // Update is called once per frame
    void Update () {
        if(Input.GetKeyDown(KeyCode.Space)){
            print ("FIRE!!!");
        }
    }
}

Kode di atas adalah contoh membaca “Input” pada Unity. Kondisi jika kita menekan tombol spasi, maka akan menampilkan tulisan “FIRE!!!” pada console Unity. Lalu jika ingin membaca input dari Joystick, kita bisa menggunakan “KeyCode.JoystickButton0” menjadi seperti ini.

using UnityEngine;
using System.Collections;

public class Fire : MonoBehaviour {
    
    // Update is called once per frame
    void Update () {
        if(Input.GetKeyDown(KeyCode.Space) || Input.GetButtonDown("joystick button 0”")){
            print ("FIRE!!!");
        }
    }
}

Diperlukan dokumentasi dari manufaktur Joystick untuk mengetahui kode “JoystickButton” terletak pada tombol yang mana di dalam Joystick. Contohnya pada Joystick miliki XBox, terdapat informasi referensi tombol dengan kode tombolnya.

[caption id="attachment_10816" align="aligncenter" width="600"]contoh mapping controller di Wiki Unity contoh mapping controller di Wiki Unity[/caption]

Dari gambar di atas, maka “joystick button 0" adalah tombol A, “joystick button 1“ adalah tombol B, dan seterusnya. Dengan mengetahui mapping ini, maka kita bisa menentukan efek terhadap game kita ketika ada tombol yang ditekan.

Input Manager

Untuk mempermudah proses scripting, Unity menyediakan sebuah fitur yang bernama InputManager. InputManager merupakan fitur yang bisa diakses melalui Inspector untuk melakukan Mapping, memberi nama kepada Input, dan juga mengatur value dari Input yang dibaca oleh sistem.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-2

Input Manager bisa diakses melalui tab Edit -> Project Settings -> Input. Setelah itu akan muncul tab baru di inspector berjudul InputManager. Secara default, telah terdapat informasi yang ada di dalam InputManager yang di-generate oleh Unity. Dalam tutorial ini kita akan coba membuat implementasi sederhana yakni input aksis horizontal dan vertikal untuk pergerakan karakter serta input tombol A dan B untuk memberikan trigger di dalam game.

Baca juga: Virtual Reality dan Perkembangannya

Yang pertama kita perlu perhatikan adalah bagian Axes. Axes merupakan jumlah input yang akan diterjemahkan oleh InputManager. Berhubung kita hanya ingin menggunakan tombol aksis X dan Y untuk pergerakan serta tombol A dan B untuk trigger, maka kita hanya perlu 4 Axes. Kita bisa menghapus Axes default dan menggantinya dengan jumlah 4.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-3

Untuk mengetahui apa fungsi dari tiap field di dalam Input Manager, Unity memberikan dokumentasi lengkap apa efek dari tiap field. Tidak semua field harus diisi dan ada beberapa field yang spesifik untuk tipe input tertentu. Berikut ini adalah tabel penjelasan fungsi dari tiap field di dalam axis.

PropertiFungsi
NameNama dari input yang dibaca. Nama ini akan dipanggil di dalam script sehingga memudahkan kita membuat script karena sesuai dengan konteks.
Descriptive NamePenjelasan dari input bernilai positif yang akan muncul pada menu konfigurasi untuk Standalone Build (Mac, PC, Linux).
Descriptive Negative NamePenjelasan dari input bernilai negatif yang akan muncul pada menu konfigurasi untuk Standalone Build (Mac, PC, Linux).
Negative ButtonTombol yang akan mengembalikan nilai negatif jika ditekan (misal button joystick 1).
Positive ButtonTombol yang akan mengembalikan nilai positif jika ditekan (misal button joystick 0).
Alt Negative ButtonTombol alternatif atau secondary yang bisa mengembalikan nilai negatif jika ditekan.
Alt Positive ButtonTombol alternatif atau secondary yang bisa mengembalikan nilai positif jika ditekan.
GravityMenentukan seberapa cepat input akan kembali ke nilai tengah ketika selesai ditekan. Hanaya bisa digunakan ketika tipe inputnya adalah Key/Mouse Button.
DeadSetiap nilai positf dan negatif yang kurang dari angka Dead akan dihitung sebagai nol. Berguna untuk penggunaan Joystick.
SensitivityUntuk input keyboard, semakin besar nilanya akan semakin cepat responnya. Untuk input mouse, semakin besar delta value nya akan membuat skala permbandingan dengan pergerakan mouse sesungguhnya.
SnapJika diaktifkan, akan membuat nilai dari axis akan kembali ke nol apabila mendapat input yang berkebalikan. Hanya bisa digunakan dalam input bertipe Key/Mouse Button.
InvertJika diaktfikan, akan membuat nilai positif dari input menjadi negatif dan sebaliknya.
TypeTipe Input yang mengendalikan axis ini
AxisAxis yang terhubung dengan perangkat untuk membaca input
Joy NumJoystick yang terhubung dengan game akan menentukan kontrol dari axis

Dengan memahami tiap field dari Input Manager, kita bisa mengatur agar Input yang kita masukan dapat sesuai dengan hasil yang kita inginkan di dalam game.

Implementasi Input Manager

Selanjutnya kita akan setup Input Manager untuk membaca input axis horizontal, axis vertikal, tombol A, dan tombol B. Yang perlu diingat, nilai dari properti button (negative button, positive button, alt negative button, dan alt positive button) harus benar pengejaannya sesuai dengan KeyCode yang disediakan oleh Unity. (cek keys yang tersedia di dokumentasi ini).

Yang pertama kita akan setup untuk Joystick horizontal dan vertikal. Jangan lupa, nilai dari properti Graviti, Dead, dan Sensitivity bisa kamu ubah-ubah hingga menemukan pengaturan yang paling cocok untuk game kamu.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-4

Selanjutnya kita akan setup input untuk membaca tombol A dan tombol B.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-5

Setup Scene

Selanjutnya kita akan belajar bagaimana mengimplementasikan Input tersebut ke dalam kode. Kita akan membaca Input dari joystick dan menjadikannya trigger ke dalam game. Yang pertama kita perlu setup scene sedikit agar bisa menampilkan perubahan yang terjadi di dalam layar. Kita bisa melakukannya dengan mengimport sample project dari Google Cardboard SDK for Unity.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-6

Setelah itu, kita bisa mengaktifkan scene Demo untuk HeadsetDemo dan klik di DemoScene.Unity. Akan muncul di layar scene baru yang berisikan kamera dalam bentuk VR mode beserta kotak yang akan teleport jika kita arahkan mata kita ke kotak tersebut. Dalam tutorial ini, kita akan coba mengimplementasikan input dari joystick untuk membuat karakter kita bisa bergerak di dalam area permainan.

Baca juga: Membuat Game Virtual Reality First Person Shooter Menggunakan Unity 3D dan Google Cardboard SDK

Pertama kita bisa membuat script baru yang berisikan kode sebagai berikut.

using UnityEngine;
using System.Collections;

public class Movement : MonoBehaviour {
    Vector3 inputMovement;
    public float speed = 10;
    
    // Update is called once per frame
    void Update () {
        inputMovement.x = Input.GetAxis ("horizontal") * speed;
        inputMovement.z = Input.GetAxis ("vertikal") * speed;

        MoveKarakter (inputMovement * Time.deltaTime);

        if(Input.GetButtonDown("A")){
            print ("A");
        }
        if(Input.GetButtonDown("B")){
            print ("B");
        }

    }

    void MoveKarakter(Vector3 newPos){
        Vector3 tempPos;
        tempPos = transform.position + newPos;
        transform.position = tempPos;
    }
}

Kita membuat sebuah variabel inputMovement yang akan mendeteksi nilai dari aksis horizontal dan vertikal yang dibaca dari joystick. Nilai tersebut kita jadikan faktor pengali untuk menggerakan kamera dari posisi awal ke posisi baru. Dengan memasangkan script ini di GameObject GvrMain, maka karakter kita akan bisa bergerak sesuai dengan input dari Joystick.

Membuat-Game-Virtual-Reality-Android-dengan-Kontrol-Joystick-7

Untuk input dengan menekan tombol, kamu bisa menambahkan script Input.GetButtonDown(“A”) dan Input.GetButtonDown(“B”). Aksi yang ingin ditampilkan bisa bermacam-macam, tapi untuk tutorial ini saya hanya akan menampilkan keluaran di console. Kamu bisa membuat tombol tersebut melakukan aksi seperti melompat, berlari, dan lain sebagainya, yang penting kamu sudah mengerti konsepnya dan cara untuk membaca input dari Joystick dan melakukan aksi di dalam game, tinggal implementasinya saja yang disesuaikan dengan game kamu.

if(Input.GetButtonDown("A")){
    //kode untuk menembak
    Tembak();
}
if(Input.GetButtonDown("B")){
   //kode untuk melompat
   Lompat();
}

Satu tips, sebaiknya buat GameObject sendiri untuk membaca input dari Joystick sebagai controller yang nanti baru akan memberikan event kepada GameObject lainnya. Semoga tutorial ini bermanfaat dan kamu bisa membuat game VR yang menyenangkan.

Buat kamu yang sudah memahaminya, kamu bisa mencoba mengikuti Lenovo Virtual Reality Challenge 2 untuk menguji skill dan keberuntunganmu (hadiahnya lumayan gede) :D