Blogging for sharing, sekedar berbagi ilmu dan pengalaman

Membuat Native Android Plugin untuk Unity

July 09, 2014 Posted by Ahmad Saifuddin Azhar No comments

Unity Android

Unity merupakan game engine dimana game yang dihasilkan bersifat multi platform. Hasil output game engine ini dapat di porting ke dalam beberapa platform, mulai windows, Mac, iOS, Android, Windows Phone, dan masih banyak platform lainnya. Hal ini tentu sangat-sangat menguntungkan pengguna unity karena sekali develop game yang dihasilkan dapat dipublish ke dalam berbagai platform sesuai dengan keinginan.

Sayangnya, karena game yang dihasilkan sifatnya adalah multi platform maka tidak jarang ada fitur spesifik yang miss dan tidak dapat dibuat dengan Unity. Contoh untuk platform Android. Setahu saya Unity (sebelum dibuat plugin spesifik) tidak dapat digunakan untuk membuat fitur share, notifikasi, widget, background service, dsb. Saya belum banyak meng-explore tentang hal ini, barangkali kalau saya salah mohon dibenarkan.

Untungnya, Unity mengizinkan pemanggilan kelas native Android agar fitur-fitur tersebut dapat diintegrasikan bersama Unity.  Langkahnya kurang lebih kita buat terlebih dahulu Android plugin untuk unity, kemudian kita panggil plugin tersebut untuk menjalankan fungsi native Android.

Ok.. Langsung saja ke intinya.. Pada artikel kali ini saya akan mencoba menjelaskan sedikit tentang cara membuat Android plugin untuk Unity. Sebelum memulai kita lihat dulu apa saja alat dan bahanya :
1. Unity, pada tutorial ini saya memakai unity 4.5.1. Uniti dapat di download disini.
2. Eclipse ADT (Android Developer Tools). Merupakan modifikasi dari eclipse IDE. ADT dapat di download di situs resmi Android developer disini.
3. Android SDK, biasanya satu paket saat mendownload ADT. 
4. Device Android. Kalau tidak ada bisa menggunakan Android emulator

Setelah alat dan bahan siap langsung saja ke stepnya...

Note : Bagi yang ingin mendownload projectnya terlebih dahulu sebagai bahan belajar klik disini

Langkah 1. Buat Unity project untuk platform Android
langkah pertama buat unity project. Kemudian switch platformnya ke platfrm android. Untuk switch platform klik file >> build settings

Switch platform unity  android

Tentukan bundle identifier pada player setting. Lihat gambar

Player setting unity android

Langkah 2. Buat Android Project
Untuk membuat Android plugin kita buat dulu Android project. Caranya buka Eclipse ADT kemudian buat project Android baru seperti pada gambar di bawah

Membuat project android untuk plugin unity

Kita tentukan nama aplikasinya. Untuk nama packagenya usahakan sama dengan nama package pada langkah 1. 

Konfigurasi project android

Tentukan lokasi project. Buat 1 activity hanya untuk contoh, agar kita bisa memastikan aplikasi kita dapat berjalan sebelum di-include ke unity.

Menentukan lokasi project android

 Untuk membuat activity cukup next-next aja. Ikuti seperti gambar di bawah.


memberi nama activity

Selanjutnya kita akan mencoba native plugin ini dengan mencobanya ke device. Colokkan perangkat Android Anda di komputer. Atau Anda dapat menjalankan emulator. Buka DDMS dan pastikan koneksi PC - Device sudah berhasil.

Deteksi device pada DDMS

Kemudian run aja. Tekan button 'run' pada bar atas. Lihat statusnya pada console.

Status run android

Tunggu beberapa saat, jika eksekusi berhasil seharusnya di devica Anda akan muncul tampilan seperti pada gambar di bawah.

Langkah 4. Buat Android plugin untuk Unity
Langkah selanjutnya kita akan membuat plugin yang bisa dipanggil di Unity. Pertama buat kelas NativeAndroidBridge.java. 

Membuat kelas untuk plugin unity

adapun isi dari kelas tersebut adalah sbb :

NativeAndroidBridge.java
package com.duniadigit.androidplugin;

public class NativeAndroidBridge{
 private static int number = 0;
 
 public static int getNumber(){
  number += 1;
  return number;
 }
}

Kemudian kita atur properti project menjadi library. Hal ini karena memang project ini nantinya hanya dijadikan library tambahan untuk Unity. Stepnya seperti pada gambar di bawah :

Pertama klik kanan project >> properties

Mengganti properti project

Pada bagian Android >> klik Is Library

Centant IsLibrary karena dibuat plugin

Kemudian lihar pada folder bin. Maka ada androidplugin.jar

Plugin android dengan ekstensi .jar

Langkah 5. Import dan buat kelas Bridge di unity
Kemudian langkah selanjutnya  kita import ke unity. Buat folder /Plugins/Android. Kita drag & drop file androidplugin.jar tadi ke folder ini.

Note : Folder jangan dirubah. Selalu paka folder /Plugins/Android

Import plugin android ke unity


Kemudian buat kelas yang menjadi jembatan antara android plugin dengan unity. Disini saya membuat kelas NativeAndroidBrige.cs

Kelas bridge untuk komunikasi dengan plugin android

Adapun isi dari kelas ini adalah sbb :

using UnityEngine;
using System.Collections;

public class NativeAndroidBridge : MonoBehaviour {
 public static int GetNumber(){
  int number = 0;

  if(Application.platform == RuntimePlatform.Android){
   AndroidJavaClass androidJavaClass = new AndroidJavaClass("com.duniadigit.androidplugin.NativeAndroidBridge");
   number = androidJavaClass.CallStatic("getNumber");
  }

  return number;
 }
}

Langkah 6. Test
Langkah selanjutnya adalah melakukan test apakah plugin ini berjalan dengan baik atau tidak. Untuk melakukannya saya buat kelas tambahan. Saya beri nama GameGUI.cs

Kelas GUI untuk test plugin android


Adapun isi dari GameGUI adalah sbb :

using UnityEngine;
using System.Collections;

public class GameGUI : MonoBehaviour {
 private int number;

 void OnGUI(){
  GUI.Box(new Rect(0,0,Screen.width, 25), number.ToString());
  bool isButtonPressed = GUI.Button(new Rect(0,30,100,25), "Get Number");
  if(isButtonPressed){
   number = NativeAndroidBridge.GetNumber();
  }
 }
}

Implementasikan eklas tersebut ke dalam scene. Pada contoh ini saya meletakkan script ini ke object camera.

Meletakkan kelas GUI ke dalam scene

Karena plugin ini hanya berjalan di Android, maka kembali colokkan device Anda ke PC. Kemudian klik file >> build & run atau ctrl+B. Hasilnya adalah sbb :

Test plugin android unity

KESIMPULAN
Tutorial ini adalah tutorial sederhana membuat plugin Android untuk Unity. Pada tutorial ini plugin akan memberikan result balik berupa angka. Sedangkan unity hanya bertugas meminta angka tersebut kepada plugin.


Ok... sekian artikel yang dapat saya sampaikan. Terima kasih telah membaca. Semoga bermanfaat dan   terus berkarya ^^

Download link project klik disini



[OOP] Sekilas Tentang Fungsi Interface di Java, C#, dan Bahasa Pemrograman OOP Lainnya

July 09, 2014 Posted by Ahmad Saifuddin Azhar 7 comments
Hampir semua bahasa pemrogramaan berbasis OOP menyediakan fasilitas Interface, sebut saja yang cukup terkenal seperti Java dan C#. Mungkin Sobat programmer sedikit banyak sudah sangat hafal apa itu pengertian interface, yaitu suatu kelas yang memiliki deklarasi method tanpa adanya implementasi di dalamnya. Namun hafal pengertiannya saja tidak cukup bukan? Faktanya, dari sebagian besar sahabat programmer yang saya temui masih cukup banyak yang bingung tentang apa itu interface dan apa fungsinya. Padahal adanya interface ini menurut saya sangat-sangat penting. Nah pada artikel ini akan saya uraikan secara singkat apa saja manfaat interface dengan sedikit contoh kasus sederhana sbb :

Note : Sebelum melihat lebih jauh Anda dapat mendownload contoh projectnya disni.

Contoh kasus :
Misal saya ingin membuat game balap mobil. Tahu kan game balap mobil?  Jadi kurang lebih seperti ini nih game yang pengen saya buat 

Game mobil balap

Kemudian pengennya abis game mobil ini selesai saya mau bikin game balapan boat. Jadi kayak gini nih contohnya 

Game balap Boat

Masalahnya nih... Saya itu orangnya super males... Saya gak mau bikin program berkali-kali, saya maunya bikin code 1x doank, nanti kalo ada tambahan ya ditambahi, tapi saya gak mau ngoding sesuatu yang hampir sama 2x, gak efisien.
  
Nah.. akhirnya untuk kasus ini saya memecah program menjadi tiga kelas utama. Perkara kelas ini nanti extends ke macem-macem g masalah, yang penting saya mau bahas ketiga kelas utama ini. Kelas-kelas itu antara lain :
1. Kelas HUD (Head Up Display). Apa itu HUD? Bisa baca lebih detail di wikipedia. Intinya gini.. ibarat sebuah mobil, kelas ini adalah kelas untuk kemudi dan segala peralatan navigasinya. Kelas ini berfungsi untuk menangani input user seperti setir kanan dan kiri, gas, rem, menampilkan status kecepatan, nitro, posisi, lap, mini map, dsb. Intinya kelas ini menangani antarmuka kendaraan dengan user atau bisa dikatakan navigasi.

Tentang HUD (Head Up Display)

Karena saya itu males, saya pengennya kelas ini dipake 2x, pada proyek pertama saya akan menggunakan kelas ini untuk mengontrol mobil, tapi pada proyek kedua saya akan menggunakannya kembali untuk mengontrol boat, dimana mobil dan boat jelas-jelas berbeda, engine nya juga jelas jauh berbeda.
2. Kelas Car. Sesuai namanya, kelas ini adalah kelas untuk menjalankan mobil. Ibaratnya kelas ini adalah mesin dari mobil.
3. Kelas Boat. Sama seperti kelas mobil, kelas ini bisa diibaratkan dengan sebagai mesin dari boat. 

Kemudian gimana caranya, bikin dua kelas berbeda tapi bisa di kontrol oleh satu HUD? Inilah salah satu fungsi dari interface. Ok.. Langsung saja kita bahas lebih detail tentang fungsi dari interface. Berikut adalah beberapa fungsi dari interface :

FUNGSI 1 : Membuat program lebih reuseable. Menurut saya inilah fungsi utama interface. Dengan memanfaatkan interface setiap bagian program dapat dijadikan suatu modul tersendiri. Modul ini dapat diberi interface tertentu sehingga untuk memanfaatkan modul ini pada proyek lain cukup dengan mengimplementasikan interface yang telah disediakan, sehingga tidak perlu merubah code program sedikitpun. Cukup implementasi, beres.. 

Contoh kasus : 
Dari contoh kasus di atas jelas kan, kita pengen memakai 1 HUD untuk mengontrol lebih dari satu type kendaraan yang sangat berbeda. Bahkan bisa jadi pada proyek berikutnya muncul kelas-kelas baru seperti tank, train, truck, dsb. Kelas-kelas ini bisa sangat rumit, bisa extends ke kelas apapun. 

Tentu akan memakan waktu cukup lama kan jika kita membuat 1 kelas HUD untuk 1 type kendaraan? Bukannya lebih baik kita buat 1 HUD untuk semua kendaraan? Kalaupun texturenya beda-beda (misal bentuk kemudi mobil dan kemudi truck beda) kan itu cuman beda texture saja, bisa diganti dengan mengganti atribut texture dari kelas HUD saja, tidak perlu menambah kelas HUD baru karena intinya fungsi dari HUD itu sama, untuk mengontrol kendaraan, entah itu kendaraan darat, air, bahkan udara. Kalaupun nanti ada fungsi tambahan, misal tank tambah fungsi Shot, bisa kita extends dari kelas HUD, tp intinya ya tetap 1 HUD untuk semua vehicle. Kemudian gimana cara kita untuk memodelkannya?

Untuk itulah kita perlu interface yang menyeragamkan semua type kendaraan yang berbeda itu agar bisa di kontrol oleh HUD. Kita bisa buat interface ControllableVehicle atau jika saya pribadi saya lebih senang menambahkan huruf 'I' di awal nama interface untuk membedakan namanya dengan kelas. Jadi namanya menjadi IControllableVehicle. Nah interface inilah yang nanti bisa diimplementasikan oleh kelas-kelas yang bisa dikontrol oleh HUD. Jadi intinya HUD tidak mengenal apa itu mobil, boat, train, tank, dsb. Yang HUD tahu adalah HUD dapat mengontrol interface IControllableVehicle. Jadi kalo kita pengen menambah apapun yang bisa di kontrol HUD apakah itu truck, tank, train, motor cycle, kuda, sapi, onta, singa, keong, ubur-ubur, kecoak, semut, amoeba, kuman, virus apapun itu cukup mengimplementasikan interface IControllableVehicle. Beres...

Dengan cara ini kelas HUD menjadi sangat reuseable bukan?? 1x develop bisa buat control apapun. Kelas car, boat, dsb juga menjadi reuseable. Kenapa? Karena mereka bersifat independent. Mereka mengimplementasikan IControllableVehicle. Bisa jadi kelas-kelas ini kita buat untuk platform PC, android, iOS, Play Station, Xbox, dll. Diantara platform ini jelas memiliki HUD yang jauh berbeda, karena PC mengandalkan keyboard sebagai input, android dan iOS mengandalkan touch screen, Play Station mengandalkan Joystick. Jelas sangat jauh beda kan HUD diantara platform-platform ini? Tapi HUD yang beda-beda ini bisa kita seragamkan untuk mengontrol interface yang sama, yaitu IControllableVehicle. Nah loh... 1x develop uda bisa dipakai dimana aja, plus buat project beda-beda kan?? Inilah kekuatan OOP, cukup sakti jika kita bisa memanfaatkan fitur-fiturnya.. :)

Dan berikut adalah contoh scriptnya. Saya buat menggunakan java karena saya rasa java lebih familiar dengan Sobat programmer :

Kelas HUD.java
public class HUD {

    private final IControllableVehicle vehicle;

    public static void main(String[] args) {
        System.out.println("Start to controll Car");
        HUD hudCar = new HUD(new Car());
        hudCar.drive();

        System.out.println("Start to controll Boat");
        HUD hudBoat = new HUD(new Boat());
        hudBoat.drive();
    }

    public HUD(IControllableVehicle vehicleToControl) {
        this.vehicle = vehicleToControl;
    }

    private void drive() {
        vehicle.accelerate();
        vehicle.turnLeft();
        vehicle.turnRight();
        vehicle.brake();
    }
}

Interface IControllableVehicle.java
public interface IControllableVehicle {
    void accelerate();
    void brake();
    void turnLeft();
    void turnRight();
}

Kelas Car.java
public class Car implements IControllableVehicle {

    @Override
    public void accelerate() {
        System.out.println("Car accelerate");
    }

    @Override
    public void brake() {
        System.out.println("Car brake");
    }

    @Override
    public void turnLeft() {
        System.out.println("Car turn left");
    }

    @Override
    public void turnRight() {
        System.out.println("Car turn right");
    }
}

Kelas Boat.java
public class Boat implements IControllableVehicle {

    @Override
    public void accelerate() {
        System.out.println("Boat accelerate");
    }

    @Override
    public void brake() {
        System.out.println("Boat brake");
    }

    @Override
    public void turnLeft() {
        System.out.println("Boat turn left");
    }

    @Override
    public void turnRight() {
        System.out.println("Boat turn right");
    }
}
  
Adapun output yang ditampilkan adalah sbb :

Fungsi interface membuat program lebih reuseable

Sekarang jelas bukan? Pada contoh diatas hanya ada 1 kelas HUD. Namun kelas HUD ini dapat digunakna untuk melakukan control beberapa kelas yang berbeda, dengan catatan kelas tersebut harus mengimplementasikan IControllableVehicle. Sangat efisien bukan?



FUNGSI 2 : Menangani event. Interface dapat juga digunakan untuk menangani suatu event tertentu dari suatu kelas. Mungkins sedikit saja penjelasannya, langsung masuk ke contoh kasusnya 

Contoh kasus :
Masih dengan kasus bikin game racing tadi. Kita akan menambah 1 kelas lagi yaitu pemadam kebakaran atau kita sebut Fireman. Ceritanya, Fireman ini bertugas memadamkan object yang terbakar, entah itu Mobil atau Boat.

Satu poin penting disini, object vehicle dalam hal ini Car dan Boat adalah object utama yang menjadi pusat perhatian Fireman. Sedangkan Fireman hanya Object tambahan sebagai pelengkap. Intinya, tanpa Fireman Mobil atau Boat dapat berjalan dan tidak ada masalah. Namun Fireman tanpa Mobil atau Boat tidak bekerja karena tidak tahu apa yang diawasi. Poin penting berikutnya dalam hal ini adalah adanya sebuah event, yaitu ketika mobil terbakar, atau dapat kita sebut OnBurn event.

Dalam logika kita sebagai manusia, seorang Fireman akan selalu memantau Car setiap detik bahkan setiap milisecond. Ketika mobil meledak maka Fireman akan langsung berlari mendatangi mobil untuk memadamkan. Kita dapat membuat hal tersebut di dalam program sbb :

Kelas Car.java
public class Car implements IControllableVehicle {
    boolean isCarBurn;
    
    public boolean  isBurn(){
        return this.isCarBurn;
    }

    //Method lain-lain
}

Kelas Fireman.java
public class Fireman {
    Car car;
    
    //Fungsi ini dipanggil setiap 0.2 detik
    void Update(){
        if(car.isBurn()){
            //Mendatangi mobil dan memadamkan api
        }
    }
}

Namun pertanyaanya? Seberapa efisienkah cara ini? Bagaimana jika Fireman harus mengamati 10.000 mobil sekaligus? Tentu hal ini akan sangat membebani kerja CPU.

Salusi kedua yang lebih efisien adalah sebelum permainan dimulai kita beri tahu mobil, kalau-kalau terjadi kebakaran maka segera hubungi Fireman. Jadi ketika sewaktu waktu ada event burn, maka mobil akan segera menghubungi Fireman. Ini akan jauh-jauh lebih efisien karena fireman tidak harus selalu melihat mobil setiap detik, namun mobil apa saja yang terbakar akan segera menghubungi Fireman untuk dipadamkan.

Nah untuk membuatnya kita akan membuat interface dapat terbakar yang kita sebut IBurnable. Berikut adalah kelas Fireman, Car, dan interface IBurnable. Untuk mempermudah saya akan memodifikasi kelas mobil dengan memberinya nama.

Interface IBurnable.java
public interface IBurnable {
    void burn();
    void registerFireman(Fireman fireman);
    void removeFireman(Fireman fireman);
}


Kelas Fireman.java
public class Fireman {
    String name;
    ArrayList firemans = new ArrayList 
 
    public Fireman(String name) {
        this.name = name;
    }
    
    public void AnObjectIsOnFire(IBurnable burnable){
        System.out.println(name + " goto : " + burnable.toString());
    }
}

Kelas Car.java
public class Car implements IControllableVehicle, IBurnable {
    String name;
    
    public Car() { }
    
    public Car(String name) { 
        this.name = name;
    }
    
    @Override
    public void accelerate() {
        System.out.println("Car accelerate");
    }

    @Override
    public void brake() {
        System.out.println("Car brake");
    }

    @Override
    public void turnLeft() {
        System.out.println("Car turn left");
    }

    @Override
    public void turnRight() {
        System.out.println("Car turn right");
        burn(); //simulasi misal ketika belok kanan mobil akan terbakar
    }

    @Override
    public void burn() {
        for(Fireman fireman : firemans){
            fireman.AnObjectIsOnFire(this);
        }
    }

    @Override
    public void registerFireman(Fireman fireman) {
        if(!firemans.contains(fireman)){
            firemans.add(fireman);
        }
    }

    @Override
    public void removeFireman(Fireman fireman) {
        if(firemans.contains(fireman)){
            firemans.remove(fireman);
        }
    }

    @Override
    public String toString() {
        return this.name;
    }
}
 
Dalam kelas diatas lihat kelas mobil dalam method turnRight. Pada method tersebut kita asumsikan jika mobil belok ke kanan, maka mobil akan terbakar. Hal ini cuma digunakan untuk test program. Selain itu kita asumsikan ketika mobil meledak player akan berganti mobil dan mengendarai mobil lainya. Berikut adalah script HUD nya :

Kelas HUD.java
public class HUD {

    private final IControllableVehicle vehicle;

    public static void main(String[] args) {       
       //Create fireman
       Fireman paijo = new Fireman("Paijo");
       Fireman paimin = new Fireman("Paimin");
       Fireman santoso = new Fireman("Santoso");
       
       //Create car
       Car ferrari = new Car("Ferrari");
       Car toyota = new Car("Toyota");
       
       //Register fireman
       ferrari.registerFireman(paijo);
       toyota.registerFireman(paimin);
       toyota.registerFireman(santoso);
       
       
       //Test
       HUD hud = new HUD(ferrari);
       hud.drive();
       System.out.println("");
       hud = new HUD(toyota);
       hud.drive();
    }

    public HUD(IControllableVehicle vehicleToControl) {
        this.vehicle = vehicleToControl;
    }

    private void drive() {
        vehicle.accelerate();
        vehicle.turnLeft();
        vehicle.brake();
        vehicle.turnRight();
    }
}

Adapun outputnya adalah sbb :

Fungsi Interface untuk menangani event

Nah dalam HUD tadi dapat kita garis bawahi sbb :
1. Terdapat 3 orang fireman : Paijo, Paimin, dan Santoso.
2. Terdapat 2 buah mobil : Ferrari dan Toyota
3. Mobil Ferrari diawasi oleh Paijo, sedangkan Toyota diawasi oleh Paimin dan Santoso.
4. Ketika terjadi event burn dari mobil, maka mobil akan melaporkan event tersebut terhadap listenernya.

KESIMPULAN :
Interface merupakan satu bagian penting dari sebuah bahasa pemrograman OOP. Mungkin suatu program dapat berjalan dengan baik tanpa menggunakan interface. Namun, penggunaan fungsi interface dapat membuat program lebih flexible dan mudah dikembangkan. Penggunaan interface juga dapat membuat program menjadi lebih efisien karena Interface dapat digunakan untuk menangani event tertentu dalam suatu object.  

PENUTUP :
Ok.. Penjelasan tadi adalah sedikit fungsi dari interface yang mungkin sering digunakan.  Semoga artikel ini bermanfaat sehingga Sobat dapat menggunakan fungsi Interface dengan baik. Mungkin sekian yang dapat saya sampaikan.  Untuk download contohnya saya sertakan di link bawah. Tetap semangat dan terus berkarya... ^^

Link download contoh klik disini (netbeans project)



LibGDX, Game Development Framework yang Gratis, Ringan, dan Handal

April 03, 2014 Posted by Ahmad Saifuddin Azhar No comments


Pada artikel-artikel sebelumnya, saya banyak membahas tentang game engine Unity. Mulai dari awal buat blog sampai sekarang mungkin yang ada di blog ini 80% artikel membahas tentang Unity. Pada artikel kali ini saya akan sedikit me-review game engine lain yang mungkin dapat dijadikan pertimbangan dan alternatif lain selain Unity. Sebelumnya saya juga pernah membahas tentang sebuah game engine gratis untuk Android bernama andengine. Nah... Kali ini saya akan membahas tentang sebuah engine gratis lainnya bernama LibGDX. Ok.. Apa itu LibGDX serta kelebihan dan kelemahannya akan segera kita bahas di bawah.

LibGDX merupakan suatu game-development framework yang dikembangkan oleh LibGDX sendiri dimana sebagian besar framework ini ditulis dalam bahasa java meskipun pada beberapa komponen ditulis menggunakan C++. LibGDX bersifat cross platform dimana game yang dihasilkan dapat di jalankan pada beberapa platform seperti Windows, Linux, Mac OS X, Android, WebGL dan iOS. LibGDX dapat di download secara gratis di situs resmi libGDX.

Proses development libGDX secara umum menggunakan bahasa pemrograman java dan sesuai dokumentasi resmi libGDX disarankan untuk menggunakan editor eclipse, meskipun pada penerapannya dimungkinkan untuk menggunakan editor lain seperti Intelij Idea. Sekedar info, pengembangan game menggunakan libGDX yang menggunakan editor Intelij Idea akan memerlukan konfigurasi proyek tambahan agar game bisa berjalan, berbeda dengan menggunakan eclipse yang tinggal import dan siap digunakan.

Hampir sama seperti Unity, meskipun libGDX tersedia untuk berbagai platform namun kelebihan libGDX ini adalah proses development dan debugging dapat dilakukan hanya dengan menggunakan komputer desktop (dalam hal ini saya menggunakan windows) tanpa memerlukan perangkat lain. Setelah debugging siap maka kita dapat melakukan compile dan uji coba sesuai dengan platform yang diinginkan. Hal ini sangat memudahkan karena proses compile dan running program menjadi lebih cepat.

Untuk urusan math dan physic, libGDX secara default menyerahkan kepada Box2D sebagai physic engine-nya. Bagi Anda kalangan game developer mungkin sudah sangat familiar dengan physics engine yang satu ini. Tidak perlu saya jelaskan panjang lebar, yang jelas Physics engine yang satu ini sudah sangat terkenal dan tidak diragukan lagi kemampuannya.

Pada libGDX juga tersedia berbagai 3rd party component, seperti tween engine (untuk membuat animasi menjadi smooth), box2d (seperti yang dijelaskan diatas),  dan berbagai tools 3rd party lainnya (misal untuk multi player, leaderboard, dsb).

Beberapa fitur-fitur lainnya adalah libGDX mampu menangani berbagai jenis input seperti keyboard, mouse, touch screen, bahkan lengkap dengan gesture detector. Untuk urusan simpan-menyimpan game dalam libGDX sudah tersedia lengkap semacam kelas berfungsi sebagai file manager. Output file yang disediakan dapat berupa file json maupun xml.

Berikut adalah beberapa kelebihan libGDX
* Gratis, tidak ada splash screen, dan tidak mengharuskan developer untuk melakukan sesuatu apapun. Hasil produknya juga dapat dikomersilkan tanpa harus berbagi keuntungan (royalti) dengan libGDX.
* Mensupport pengembangan game dalam berbagai platform seperti Windows, Linux, Mac OS X, Android, WebGL dan iOS.
* Proses development dan debugging dapat dilakukan langsung di PC, tidak memerlukan perangkat lain seperti Android, iOS, dsb. Baru ketika proses debugging siap dapat dilakukan compile untuk perangkat yang diinginkan.
* Engine Physics sudah disediakan, secara default menggunakan Box2D.
* Save / load game sudah disediakan, dengan output berupa xml writer atau json.
* Tersedia berbagai 3rd party, seperti leaderboard, multi player, tween, dsb.
* Dokumentasi lengkap, serta banyak tutorial bertebaran di internet.
* Performa game cukup tinggi

Berikut beberapa kelemahan libGDX 
* Sangat primitif, hanya ada code pada editor eclipse, tanpa tampilan visual. Tampilan visual hanya muncul ketika game di run.
* Cukup sulit untuk pemula, apalagi jika konsep OOP belum lancar akan memakan banyak waktu dalam proses development. 
* Proses development relatif lama, apalagi jika dibandingkan dengan game engine berbayar seperti Unity, Flash, dsb. Berdasarkan pengalaman pribadi proses development akan memerlukan waktu 2-3 kali lebih lama dibandingkan dengan menggunakan engine Unity. 

Berikut beberapa contoh capture pengembangan game menggunakan libGDX.

gdx-setup-ui, user interface untuk membuat project baru
gdx-setup-ui, user interface untuk membuat project baru

Physics Body Editor dapat digunakan untuk editor physics yang menghasilkan   file json untuk di load sebagai physic collider di libGDX
Physics Body Editor dapat digunakan untuk editor physics yang menghasilkan 
file json untuk di load sebagai physic collider di libGDX

Texture Packer dapat digunakan untuk membuat texture atlas yang dapat di load di libGDX
Texture Packer dapat digunakan untuk membuat texture atlas yang dapat di load di libGDX 

 proyek libGDX di editor eclipse ADT
 proyek libGDX di editor eclipse ADT

 proyek libGDX di editor eclipse ADT
 proyek libGDX di editor eclipse ADT

Mungkin sekian sedikit artikel dari saya, gak banyak sih, mungkin artikel selanjutnya adalah tutorial membuat sprite sederhana menggunakan libGDX, Ok.. kurang lebihnya saya mohon maaf, terima kasih sudah berkenan membaca blog saya yang ala kadarnya, tetap semangat dan terus berkarya ^^

[OOP] Pass by Reference di Java dan C#

March 26, 2014 Posted by Ahmad Saifuddin Azhar No comments
 Mungkin bagi Anda seorang programmer tentu sudah sangat familiar dengan nama Java dan C#. Ya.. Keduanya adalah bahasa pemrograman berbasis OOP yang menurut saya sangat mirip dalam hal penggunaannya. Kedua bahasa ini merupakan bahasa yang cukup populer dan cukup bersaing jika dibanding bahasa pemrograman lainnya.

Pada artikel kali ini saya akan membahas sedikit contoh pembuatan method dengan parameter pass by reference di java dan C#. Pass by reference sendiri merupakan suatu method yang melewatkan alamat dari suatu variabel, bukan isi dari variabel. Untuk lebih jelasnya silahkan simak contoh kasus sederhana di bawah :

Contoh kasus Pass by reference :
Misal saya memiliki 2 buah variabel integer, misal : 
int a = 5, b = 10;
Kasusnya saya akan menukar nilai kedua variabel ini melalui suatu method 
swap(int a, int b)
Nah.. bagaimana cara membuatnya?? Tidak bisa menggunakan return value bukan? Satu-satunya cara adalah dengan menggunakan pass by reference.

Nah disini saya akan membahas cara membuat method / fungsi swap dalam beberapa bahasa pemrograman, khususnya java dan C#. Sebelum melangkah ke java dan C# mari kita tengok sedikit fungsi swap pada bahasa C++.

Fungsi swap pada C++
Pada C++ pass by reference dapat kita lakukan dengan memberikan parameter berupa pointer dengan tanda * dan untuk melewatkan variabel gunakan tanda & yang menyatakan alamat atau reference dari suatu variabel.
 
void swap(int* a, int* b){
  int* temp = a;
  a = b;
  b = temp;
}

int main(){
 int x = 5, y = 10;
 int *a = &x, *b = &y;
 swap(a, b);
 printf("%d %d\n"), *a, *b); //print : 10 5
}



Fungsi swap pada C#
Pada C# fungsi swap menjadi jauh lebih mudah dibanding C++ karena memang dasarnya C# adalah bahasa pemrograman yang cukup modern. Untuk membuat parameter pass by reference cukup gunakan kata kunci ref.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1{
    class Program{
        static void Main(string[] args){
            int x=5, y=10;
            swap(x, y);
            
            Console.Write(x); //print : 10
            Console.Write(y); //print : 5
        }

        static void swap(ref int a, ref int b){
            int temp = a;
            a = b;
            b = temp;
        }
    }
}
 
Fungsi swap pada Java
Pada dasarnya java sama sekali tidak menggunakan pass by reference dan tidak dikenal istilah pass by reference pada method java. Namun perlu diingat tentang teori dasar java bahwa secara implisit untuk menghemat memori, java akan me-reference alamat yang sama dari satu obyek (instance) yang sama meskipun ditunjuk oleh variabel yang berbeda. Mungkin bingung yah deskripsi saya? saya juga bingung mau nulis kayak gimana :p Ok langsung aja ke contoh :
public class MainClass {
    public static void main(String[] args) {
        Mobil a = new Mobil(100);
        Mobil b = a;
        System.out.println(b); //print : 100
        a.setKecepatan(50);
        System.out.println(b); //print 50       
    }  

    private static class Mobil{
        private int kecepatan = 100;

        public Mobil(int kecepatan) {
            this.kecepatan = kecepatan;
        }

        public void setKecepatan(int kecepatan) {
            this.kecepatan = kecepatan;
        }      

        @Override
        public String toString() {
            return "Mobil kecepatan : " + this.kecepatan;
        }      
    }
}
 
 
Output :
run:
Mobil kecepatan : 100
Mobil kecepatan : 50
BUILD SUCCESSFUL (total time: 0 seconds) 
 
Kita lihat padascript di atas, kita sama sekali merubah value dari variabel b, yang kita rubah hanya variabel a dengan script a.setKecepatan(50). Namun yang terjadi b juga ikut berubah, terbukti ketika di print nilainya menjadi 50, sama seperti a. Hal ini menunjukkan bahwa a dan b menunjuk pada alamat memori yang sama, sehingga jika salah satu di rubah maka akan berdampak pada yang lainnya. Penunjukan alamat memori yang sama ada dalam statement Mobil b = a; Sifat menunjuk alamat memori yang sama inilah yang bisa kita manfaatkan untuk pass by reference di java. Kita juga dapat memanfaatkan type data Generic untuk membuat obyek reference yang fleksibel. Langsung saja contoh pass by reference di java :

Pertama buat dulu Ref.java
 
public class Ref<T> {
    public T value;

    public Ref(T value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value.toString(); 
    } 
}

Kamudian ini fungsi swapnya ada di PassByReferenceClass.java

public class PassByReferenceClass {
    public static void main(String[] args) {
        Ref<Integer> x = new Ref<>(5);
        Ref<Integer> y = new Ref<>(10);
        
        swap(x, y);
        
        System.out.println(x + " " + y);
    }  
    
    public static void swap(Ref a, Ref b){
        Object temp = a.value;
        a.value = b.value;
        b.value = temp;
    }
}




Dan outputnya adalah sbb :
 
run:
10 5
BUILD SUCCESSFUL (total time: 0 seconds)

Ok... Mungkin sekian artikel saya ini, kurang lebihnya saya mohon maaf. Tetap semangat dan terus berkarya ^^

Screen Video Recorder, Aplikasi Gratis untuk Merekam Aktivitas Layar di Android

February 17, 2014 Posted by Ahmad Saifuddin Azhar 3 comments
Iseng-iseng ingin mendokumentasikan salah satu program Android hasil buatan saya dalam bentuk video, sayapun menemukan salah satu aplikasi yang menurut saya cukup menarik. Mungkin Sobat sudah cukup kenal dengan aplikasi Camtasia di Windows. Ya.. Aplikasi ini adalah aplikasi untuk melakukan screen recorder, yaitu merekam aktifitas layar dan menjadikan sebuah file video, gampangannya adalah screenshot dalam bentuk video. Lantas pertanyaan saya, adakah aplikasi serupa di Android? Searching-searcihng di Google Play Store akhirnya saya menemukan aplikasi z-screen recorder dan screencast video recorder. Namun sayangnya aplikasi ini berbayar. Setelah searching lagi akhirnya saya menemukan satu aplikasi screen recorder yang gratis. Saya tidak tahu juga apakah ini benar-benar gratis ato suatu saat ada popup yang mengharuskan untuk membelinya. Namun, sementara ini saya pakai dapat berjalan lancar dan tidak popup yang mengharuskan untuk membeli. Ok langsung aja kita bahas aplikasinya...

Aplikasi yang dimaksud adalah 'Screen Video Recorder'. Aplikasi ini adalah salah satu aplikasi buatan 'HT Soft'. Seperti judul artikel ini, fungsi utama aplikasi ini tidak lain adalah untuk merekam aktifitas layar pada ponsel atau tablet Android. Menurut saya pribadi dari segi fitur tidak ada kelebihan yang cukup mencolok dari aplikasi ini dibandingkan aplikasi sejenis seperti Z-Screen Recorder dan Screencast Video Recorder. Namun, yang cukup menjadi daya tarik bagi saya adalah aplikasi ini gratis. Sampai saat artikel ini ditulis tidak ada popup iklan yang mengharuskan saya untuk membayar, meskipun tidak tahu apakah ini memang benar-benar gratis atau hanya gratis dalam jangka waktu tertentu. OK.. Saya kira cukup basa-basinya, langsung ke screenshotnya.

Pojok kanan atas adalah aplikasi Screen Video Recorder, jadi pastikan Sobat mendownload aplikasi yang benar. 


Dan berikut adalah tampilan ketika kita membuka aplikasi Screen Video Recorder. Hanya ada tiga tombol, dari kiri ke kanan berupa tombol start, setting, dan exit. Cukup simple bukan.


Ketika kita tekan tombol start maka aktifitas merekam dilakukan dan aplikasi akan ditampilkan di bagian notifikasi. Untuk menghentikannya juga cukup dengan membuka notifikasi dan mengklik aplikasi ini.


Ketika di stop otomatis video hasil rekaman akan disimpan di folder yang ditentukan, sesuai setting Output Directory pada aplikasi ini. 

Berikut adalah screenshot tampilan setting agar bisa menjadi pertimbangan Sobat untuk mendownload aplikasi ini.




Seperti kebanyakan aplikasi screen recorder lainnya, aplikasi ini hanya bisa merekam audio dari microphone, otomati kualitas suara juga terbatas, dan bisa jadi suara kendaraan dan kebisingan di sekitar Anda masuk dalam video rekaman. 


Nah menariknya, kita dapat menampilkan posisi touch pada layar di video, sehingga ketika orang melihat video akan tahu bagian mana yang mendapat sentuhan. Dan berikut adalah screenshot hasil videonya.


Mungkin cukup sekian penjelasan saya, sekarang giliran Anda mencoba dengan mendownloadnya. Link download saya cantumkan di bawah. Ok... sekian dari saya, kurang lebihnya saya mohon maaf, semoga bermanfaat, tetap semangat dan terus berkarya ^^




Tutorial Membuat 2D Sprite Sederhana Untuk Membuat Game 2D di Unity

February 14, 2014 Posted by Ahmad Saifuddin Azhar 61 comments
Pada artikel sebelumnya saya pernah membahas tentang penggunaan Unity untuk membuat game 2D. Pada artikel tersebut saya masih menggunakan Unity 4.2x yang belum dilengkapi dengan tool 2D sehingga saya memerlukan tool tambahan yaitu Orthello Framework. Seiring perkembangan Unity, mulai versi 4.3 Unity telah dilengkapi dengan fitur 2D, hal ini memungkinkan Unity dapat digunakan untuk membuat game 2D secara lebih mudah tanpa memerlukan tool tambahan. Nah pada artikel kali ini saya akan membahas tutorial membuat animasi sprite 2D di Unity menggunakan tol 2D bawaan Unity secara defult. Ok langsung saja kita mulai membuatnya, simak tutorial di bawah ini :

Perhatian : klik gambar untuk memperbesar

Alat dan bahan :
Contoh sprite stickman dapat didownload disini
Sample project hasil tutorial ini dapat didownload disini

Langkah 1. Buat project baru
Seperti biasa, file >> new project. Namun perbedaannya pada pengembangan game 2D kita pilih 2D pada bagian 'Setup defaults for'.

new 2D project unity

Langkah 2. Import sprite
Disini saya memiliki sebuah sprite sederhana berupa stickman dengan animasi lari, sprite ini terdiri dari gambar-gambar biasa, dimana jika di load secara bergantian dalam tempo waktu tertentu akan menghasilkan animasi lari.
Contoh sprite 2D
Kemudian kita import dengan melakukan drag & drop. Disini sprite saya import pada direktori 'User Assets/Stickman/Sprite'. Sobat dapat membuat sendiri direktorinya.

import sprite 2D ke unity

Langkah 3. Letakkan sprite di scene
Langkah selanjutnya adalah meletakkan sprite di scene. Lakukan drag & drop sprite idle ke window scene.

meletakkan sprite ke scene
Letakkan pada posisi 0,0,0 dengan mengedit transform. Hal ini untuk memudahkan saja, Sobat dapat menggunakan posisi lainnya.

atur posisi sprite

Kemudian berilah nama sprite, kali ini saya memberinama sprite ini dengan nama 'Stickman'

Beri nama sprite

Langkah 4. Animasi
Langkah 4.1. Buat animator
Langkah selanjutnya adalah membuat animasi dari sprite. Beri component 'Animator' pada sprite. Select sprite, klik Component >> Miscellaneous >> Animator

menambahkan komponen animator di unity
Setelah memberikan component animator maka seharusnya animator ada di dalam sprite. Klik sprite 'stickman' kemudian lihat di bagian inspector.

animator telah ditambahkan ke obyek

Selanjutnya kita buat 'animator controller' untuk stickman. animation controller saya buat di dalam folder 'User Assets/Stickman/Animation Controllers'. Buat dengan klik kanan >> create >> animator controller

membuat animator controller di unity

Kita beri nama animator controller tersebut dengan nama 'Stickman'

animator controller telah dibuat dan diberi nama
Selanjutnya kita masukkan animator controller yang baru kita buat ke dalam animator dengan cara drag & drop.

masukkan animator controller ke dalam animator

Selanjutnya kita munculkan window animator dan animation. window animator dapat dimunculkan dengan klik window >> animator. Window animation dapat dimunculkan dengan klik window >> animation. Kita susun sedemikian rupa window tersebut agar enak dilihat. Sobat dapat menghapus window-window yang mungkin tidak perlu. Disini jika Sobat memiliki layar besar adalah satu keuntungan buat sobat karena seluruh window dapat dimunculkan secara jelas.

menampilkan window untuk animasi di unity

Langkah 4.2. Buat animasi 'Idle'
Animasi Idle ini nanti akan kita mainkan ketika karakter stickman dalam keadaan diam, tidak berjalan, tidak melompat, dan tidak melakukan action lain. Kita buat animasi baru, klik pada bagian window animation, klik Create New Clip.

membuat animasi baru di unity

Kita beri nama clip tersebut, misalkan 'idle'. Clip idle ini saya simpan di 'User assets/stickman/animations/Idle'. Ketika animasi idle dibuat secara otomatis state baru bernama 'Idle' juga terbentuk di animator. 

state baru di animator muncul ketika animasi baru dibuat

Kemudian kita buat clip nya dengan melakukan drag & drop sprite pada timeline animation. Kita atur sedemikan rupa kecepatannya agar tidak terlalu cepat dan tidak pula terlalu lambat. 

membuat animasi idle pada sprite 2D di unity

Kemudian sobat dapat mencoba memainkan sprite dengan mengklik play pada window animation. kita lihat animasi akan berjalan.

menjalankan animasi sprite 2D di unity

Oke, seharusnya sampai disini Sobat sudah dapat melihat sprite Sobat dengan animasi Idle.

Langkah 4.3. Buat animasi 'Run Right'
Animasi 'Run Right' akan dimainkan ketika kita menekan panah kanan. Karakter stickman akan memainkan animasi run right ini dan akan berlari ke kanan. Seperti biasa kita buat animasi baru, klik pada window animation >> Create new clip

membuat animasi run right pada sprite 2D di unity

Kemudian kita simpan animasinya seperti sebelumnya. Lihat di window animator maka akan muncul state 'Run Right'

state run right muncul di animator

Kemudian buat animasi dengan melakukan drag & drop. Sobat dapat juga menentukan kecepatan animasi dengan mengubah nilai dari sample. Silahkan mainkan nilai sample sehiingga animasi tidak terlalu cepat atau terlalu lambat.

animasi sprite 2D di unity

Coba mainkan dengan menekan tombol play pada window animation. Jika berhasil animasi dapat berjalan.

Langkah 4.4 Transition
Seluruh animasi sudah kita buat, langkah selanjutnya adalah membuat transisi animasi. Transisi ini diperlukan untuk menentukan kapan animasi berpindah, misalkan dalam kasus ini animasi berpindah dari 'idle' ke 'run right' ketika kecepatannya adalah lebih dari sekian. 

Kita lihat pada animator, state 'Idle' berwarna orange sedangkan state lainnya abu-abu. Hal ini berarti state 'Idle' merupakan default state, artinya ketika sprite di load secara default akan memainkan state 'Idle' sampai ada kondisi transisi yang menyebabkan state berpindah. Ok.. Langkah membuat transisi, kita klik kanan state 'idle' pada animator, pilih 'make transition'.

membuat transisi animasi di animator di unity

Kemudian kita arahkan panah ke state 'Run Right'

transisi animasi dari idle ke run right

Selanjutnya buat juga transisi dari state 'Run Right' ke idle dengan cara yang sama.

transisi animasi dari run right ke idle

Selanjutnya kita buat parameter 'speedX'. Parameter speedX ini kita gunakan sebagai parameter yang menyatakan kapan terjadi transisi dari idle ke run atau sebaliknya. Buat parameter speedX berupa float.Pada window animator di bagian parameters tambahkan dengan klik icon '+'

menambah parameter transisi

Kita beri nama 'speedX' dengan nilai default 0.0

memberi nama parameter transisi

Selanjutnya kita memerlukan window Inspector untuk melakukan pengaturan transisi. Munculkan window Inspector dengan klik window >> inspector

memunculkan window inspector di unity

Select transisi dari idle ke run right. Kemudian lihat inspector, pada bagian conditions lakukan pengaturan 'speedX Greater 0.1'. Hal ini berarti animasi idle akan berubah ke run right ketika nilai speedX adalah lebih besar dari 0.1

memberikan pengaturan transisi pada animator di unity
Lakukan hal serupa untuk transisi run right ke idle. Kali ini dengan pengaturan 'speedX Less 0.1'. Hal ini berarti animasi run right akan berpindah ke idle jika nilai speedX kurang dari 0.1

memberikan pengaturan transisi pada animator di unity untuk transisi lain

OK.. Kedua transisi sudah selesai. Jangan lupa simpan scene ctrl + S agar jika sewaktu-waktu terjadi crash scene kita tidak hilang. Saya simpan scene dengan nama Scene 1.

menyimpan scene di unity

Langkah 5. Memberi background arena
Selanjutnya kita beri background. Kenapa? Agar nanti bisa terlihat pergerakannya. Bayangkan jika tidak ada background. Karakter bergerak seperti apapun juga gak akan terlihat.

Kita kembalikan tampilan window seperti semula dulu agar lebih mudah. Tampilkan window scene, game, hierarchy, asset, inspector. Ini pilihan Sobat, tidak harus seperti punya saya, tergantung Sobat enaknya bagaimana dan apa saja yang perlu ditampilkan.

tampilan window standar

Kita import background dengan drag & drop

import sprite background

Nah kita masukkan background ke scene. Langkahnya seperti biasa, drag & drop doank dan atur sedemikian rupa agar terlihat rapi dan bagus. Saya tidak perlu menjelaskan panjang lebar soal ini

pengaturan letak obyek

Sobat juga dapat memainkan ukuran pandangan main camera agar obyek tidak terlihat terlalu besar atau kecil. Lihat efeknya di window game

merubah ukuran kamera di unity

Buat tampilan di window game serapi mungkin, kurang lebih seperti ini, karakter tepat di tengah dan dibawahnya ada arena permainan.

tampilan di window scene

Langkah 6. Scripting
Langkah selanjutnya adalah proses scripting. Disini saya akan membagi dalam dua script, yaitu script Stickman.cs dan HUD.cs. Script Stickman.cs adalah script perilaku dari karakter stickman seperti jalan kanan, jalan kiri, lompat, dsb. Script HUD (head up display) adalah script yang menangani input user, dan GUI 2D bila ada. Sobat dapat menambahkan healthbar, button, dsb di HUD ini, jangan menggabungkannya dengan stickman.

Pemisahan script ini penting, kenapa? karena dengan memisah script antara input/kontrol dengan karakter akan membuat program jauh lebih reuseable. Sobat dapat mengganti platform dari android, iphone, desktop, playstation, dsb hanya dengan mengganti script HUD nya saja, namun script karakter tetap. Kenapa? Karena perbedaan platform seperti iphone, android, desktop, playstation, dsb kebanyakan hanya berbeda input kontrolnya saja, namun untuk karakter  tetap, sama sekali tak berubah.

Langkah 6.1. Scripting karakter
Buat script Stickman.cs dan letakkan pada sprite Stickman di hierarchy dengan cara drag & drop

membuat script karakter stickman

Berikut adalah isi script Stickman.cs, penjelasan lebih lengkap langsung saya komentari di script 
using UnityEngine;
using System.Collections;

public class Stickman : MonoBehaviour {
 public float walkSpeed; //kecepatan berjalan

 private Animator animator; //animator
 State state; //enum state, lihat baris 27

 void Update(){
  if(Input.GetKey(KeyCode.RightArrow)){
   WalkRight();
  }
 }

 //start adalah fungsi pertama yang dijalanan ketika menjalankan script ini
 void Start(){
  animator = this.GetComponent(); //mendapatkan komponen animator dalam obyek ini
 }

 //LateUpdate dipanggil 1x tiap 1 frame setelah fungsi Update
 void LateUpdate(){
  if(state == State.idle){ //digunakan untuk mendeteksi idle, jika tidak ada action apapun (state == State.idle)
   this.animator.SetFloat("speedX", 0); //memberi tahu animator jika saat ini speednya adalah 0
  }
  state = State.idle; //secara default state adalah idle, jadi apapun statenya ketika selesai berjalan 1 frame maka state dikembalikan ke idle
 }

 //Method untuk berjalan ke kanan
 public void WalkRight(){
  state = State.walk; //ketika berjalan state adalah walk
  this.transform.Translate(Vector2.right * this.walkSpeed * Time.deltaTime); //translasi biasa untuk bergerak
  this.animator.SetFloat("speedX", walkSpeed); //memberi tahu animator jika saat ini speedX adalah sebesar kecepatan walkSpeed
 }

 private enum State {idle, walk}; //deklarasi enum State
}

Lihat script diatas, fokuskan pada bagian berikut :
public float walkSpeed; //kecepatan berjalan

Variabel walkSpeed memiliki modifier public. Di unity, variabel public dapat dirubah sesuai keinginan di inspector, seingga kita tidak perlu merubah script untuk merubah valuenya. Klik obyek Stickman, lihat inspector, rubah variabel walkSpeed, nilainya terserah Sobat, semakin besar semakin cepat berlarinya.

memasukkan parameter dari karakter stickman


Langkah 6.2 Scripting HUD
Empty GameObject  dengan klik GameObject >> Create Empty dan beri nama dengan HUD.

membuat HUD


Buat script HUD.cs  dan letakkan ke dalam object HUD dengan cara drag & drop

membuat script HUD

Berikut adalah isi dari script HUD.cs, penjelasan lebih lengkap langsung saya komentari di script 
using UnityEngine;
using System.Collections;

public class HUD : MonoBehaviour {
 public Camera activeCamera; //kamera yang aktif
 public Stickman stickman; //stickman

 //method update dipanggil 1x tiap frame
 void Update () {
  //membuat active kamera mengikuti stickman, dengan membuat nilai x kamera = nilai x stickman, sedang nilai y dan z tetap, yaitu nilai y dan z dari activeKamera itu sendiri 
  activeCamera.transform.position = new Vector3(stickman.transform.position.x, activeCamera.transform.position.y, activeCamera.transform.position.z); 

  if(Input.GetKey(KeyCode.RightArrow)){ //jika dipencet panah kanan
   stickman.WalkRight(); //memanggil fungsi WalkRight dari stickman
  } 
 }
}

Lihat kedua variabel berikut :
public Camera activeCamera; //kamera yang aktif
public Stickman stickman; //stickman

Pada variabel tersebut bertype public sehingga dapat dirubah di inspector. activeCamera isi dengan kamera, dan stickman isi dengan Stickman yang kita buat tadi. 

 mengisi atribut kamera dan karakter di HUD

Langkah 7. Uji coba
Selesai sudah... Jalankan program.. Secara default stickman akan menjalankan animasi 'Idle'.

hasil ujicoba sprite 2D untuk pembuatan game 2D

Coba tekan panah kanan, stickman akan bergerak ke kanan dan menjalankan animasi 'Run Right'


hasil ujicoba sprite 2D untuk pembuatan game 2D pada state berlari

Selesai
Nah... akhirnya selesai juga saya menulis tutorial ini, yang memakan waktu total lebih dari 8 jam, yang saya kerjakan dalam beberapa hari. Hahahaha.. Terima kasih sudah membaca, semoga artikel ini bermanfaat. Kurang lebihnya saya mohon maaf, tetap semangat dan terus berkarya ^^