Membuat Game Flappy Bird menggunakan Unity3D Part 5


Langsung saja yaa...untuk melanjutkan tutorial sebelumnya. hehehe.
Okrey, ketika kita Play maka yang terjadi sebagai berikut dimana Ground tidak bergerak dan Player ketika jatuh dapat tembus Ground dimana seharusnya ketika jatuh tidak bisa tembus kebawah.


Untuk mengatasi masalah tersebut, maka kita akan menambahkan komponen Box Collider 2D pada masing-masing objek Ground yang berfungsi sebagai pembatas, dan menambahkan script "Ground.cs" ke parent Ground. Caranya, adalah klik dan expand Ground, kemudian tekan dan tahan Shift + Klik Mouse Ground (1) untuk memilih objek lebih dari satu.. kemudian Add Component > Physics 2D > Box Collider 2D.


Kemudian sama seperti cara sebelumnya, buat script dan beri nama "GroundPlatform" kemudian tambahkan script GroundPlatform.cs ke objek parent Ground

  

Kemudian mulai pengkodean... :D. Klik 2x script GroundPlatform.cs, dan tambahkan kode ini dibawah tulisan public class GroundPlatform : MonoBehaviour {

 //NILAI POSISI UNTUK MERESET
 public float m_Length = -1.78f;
Sehingga menjadi :
using UnityEngine;
using System.Collections;

public class GroundPlatform : MonoBehaviour {

    //NILAI POSISI UNTUK MERESET
    public float m_Length = -1.78f;

    // Use this for initialization
    void Start () {
 
    }
 
    // Update is called once per frame
    void Update () {
 
    }
}

Pada fungsi Update() tambahkan kode seperti ini:
//JIKA POSISI (X) GROUND LEBIH KECIL DARI NILAI
  if (transform.localPosition.x < m_Length) {

   //RESET KE POSISI 0
   transform.localPosition = new Vector2 (0, transform.localPosition.y);
  }

  //GESER / GERAK KE ARAH KIRI (POSISI X)
  transform.Translate (-Time.deltaTime, 0 , 0);
Sehingga script GroundMove.cs secara keseluruhan akan seperti ini :
using UnityEngine;
using System.Collections;

public class GroundPlatform : MonoBehaviour {

    //NILAI POSISI UNTUK MERESET
    public float m_Length = -1.78f;

    // Use this for initialization
    void Start () {
 
 }
 
 // Update is called once per frame
 void Update () {
        //JIKA POSISI (X) GROUND LEBIH KECIL DARI NILAI
        if (transform.localPosition.x < m_Length)
        {

            //RESET KE POSISI 0
            transform.localPosition = new Vector2(0, transform.localPosition.y);
        }

        //GESER / GERAK KE ARAH KIRI (POSISI X)
        transform.Translate(-Time.deltaTime, 0, 0);
    }
}


Jika kalian Play pada Unity Editor, maka jika berhasil dan tidak ada error pada script hasilnya akan seperti ini:

HARUSNYA JIKA PLAYER MENYENTUH TANAH MAKA GAME OVER!!!

Yaps...memang seharusnya begitu...nah dalam kasus ini kita perlu menambahkan beberapa kode pada script PlayerController.cs untuk mendeteksi benturan dan mengidentifikasi apakah Game Over atau Point.

Oke..langsung saja klik 2x script PlayerController.cs untuk kita ubah dan tambahkan beberapa baris kode.

Masih berada dalam script PlayerController.
Pertama buat fungsi DisableAllMovePlatform() yang nantinya fungsi ini menjalankan perintah untuk memberhentikan objek-objek yang bergerak, dalam kasus ini adlah objek Ground.
 //FUNGSI STOP OBJECT YANG BERGERAK
 void DisableAllMovePlatform(){

  //NONAKTIFKAN CLASS GROUNDMOVE
  (GameObject.FindObjectOfType (typeof(GroundPlatform)) as GroundPlatform).enabled = false;
 }
Kemudian bikin fungsi WaitForRestart() dimana didalam fungsi ini akan me reload scene dari awal sebagai berikut:
    //FUNGSI DELAY SEBELUM RESTART
    IEnumerator WaitForRestart()
    {
        //PANGGIL FUNGSI DisableAllMovePlatform()
        DisableAllMovePlatform();

        //MENUNGGU SELAMA 1 DETIK
        yield return new WaitForSeconds(1f);

        //LOAD ULANG / RESTART GAME
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }
 }
Karena saya menggunakan Unity3D versi 5.4 maka untuk API reference Load Scene menggunakan SceneManager, maka perlu menambahkan baris kode ini dibawah using System.Collections;

 
using UnityEngine.SceneManagement;

Kemudian bikin lagi fungsi Die() dimana fungsi ini akan memanggil fungsi delay WaitForRestart()


 
    //FUNGSI JIKA MATI
    void Die()
    {
        StartCoroutine(WaitForRestart());
    }

SAMPAI SINI SUDAH SELESAI???


Belum, karena kita belum menambahkan fungsi untuk pendeteksian benturan anatara Ground dengan Player, nah..untuk itu kita perlu menambahkan script API Unity :

 
 //FUNGSI UNITY UNTUK MENDETEKSI BENTURAN
 void OnCollisionEnter2D(Collision2D other){
  //GAMEOVER
  Die ();
 }

Maka jika kalian benar mengikuti tutorialnya akan nampak secara keseluruhan script PlayerController.cs sebagai berikut :

 
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class PlayerController : MonoBehaviour {

    //VARIABEL TINGGI LOMPATAN
    public Vector2 m_JumpForce = new Vector2(0, 150);

    //FILE AUDIO
    public AudioClip m_AudioHit;
    public AudioClip m_AudioCoin;
    public AudioClip m_AudioSwing;

    //PRIVATE MEMBER
    private Rigidbody2D m_RigidBody;
    private AudioSource m_AudioSource;
    private bool isFirstJump = true;
    private bool isSoundOn = true;

    // Use this for initialization
    void Start () {
        //INISIAL RIGIDBODY
        m_RigidBody = GetComponent<Rigidbody2D>();
        //INISIAL AUDIOSOURCE
        m_AudioSource = GetComponent<AudioSource>();

        //MATIKAN EFEK GRAVITASI
        m_RigidBody.isKinematic = true;
    }
 
    // Update is called once per frame
    void Update () {

        //JIKA MOUSE KANAN DI KLIK
        if (Input.GetMouseButtonDown(0))
        {
            m_RigidBody.isKinematic = false;
            m_RigidBody.velocity = Vector2.zero;
            m_RigidBody.AddForce(m_JumpForce);
        }
        
        //JIKA VELOCITY LEBIH BESAR DARI 0
        if (m_RigidBody.velocity.y > 0)
        {
            float angle = Mathf.Lerp(transform.rotation.z, 90, (-m_RigidBody.velocity.y / 3f) * Time.deltaTime * 25);
            //PUTAR 90 DERAJAT
            transform.rotation = Quaternion.Euler(0, 0, 0);
        } //JIKA TIDAK
        else
        {
            float angle = Mathf.Lerp(0, -90, (-m_RigidBody.velocity.y / 3f) * Time.deltaTime * 25);
            //PUTAR -90 DERAJAT
            transform.rotation = Quaternion.Euler(0, 0, angle);
        }
    }

    //FUNGSI STOP OBJECT YANG BERGERAK
    void DisableAllMovePlatform()
    {
        //NONAKTIFKAN CLASS GROUNDMOVE
        (GameObject.FindObjectOfType(typeof(GroundPlatform)) as GroundPlatform).enabled = false;
    }

    //FUNGSI DELAY SEBELUM RESTART
    IEnumerator WaitForRestart()
    {
        //PANGGIL FUNGSI DisableAllMovePlatform()
        DisableAllMovePlatform();

        //MENUNGGU SELAMA 1 DETIK
        yield return new WaitForSeconds(1f);

        //LOAD ULANG / RESTART GAME
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
    }

    //FUNGSI JIKA MATI
    void Die()
    {
        StartCoroutine(WaitForRestart());
    }

    //FUNGSI UNITY UNTUK MENDETEKSI BENTURAN TEMBOK
    void OnCollisionEnter2D(Collision2D other)
    {
        //GAMEOVER
        Die();
    }
}

Kembali ke Unity Editor dan save Scene dengan cara File > Save Scene, simpan dengan nama "Main Game" pada root Assets Folder.

Kemudian jika kalian play akan nampak seperti berikut , ketika Player menyentuh Ground maka otomatis akan merestart scene.


KOK PLAYERNYA BISA TEMBUS KE ATAS?

Karena batas atas belum kita kasih pembatas, oke selanjutnya kita akan memberikan pembatas pada bagian atas agar Player tidak hilang melebihi screen.

Caranya klik kanan pada Hierarchy > Create Empty kemudian rubah nama menjadi "Top".
Masih dalam keadaan terpilih, pada Inspector tambahkan Box Collider 2D caranya Add Component > Physics 2D > Box Collider 2D.

Ubah nilai Position Transform menjadi ( 0, 1.6, 0) kemudian ubah nilai properti Size pada Box Collider 2D dari x:1, y:1 menjadi x:1.68, y:0.5 seperti berikut:


Coba kalian Play, maka ketika Player menyentuh batas atas secara otomatis akan mereload Scene alias Game Over. Kemudian Stop terlebih dahulu untuk melakukan editing pada Unity Editor.

Langkah selanjutnya adalah membuat rintangan untuk Player. Sebelum memulai, buatlah folder bernama "Prefab".

Pada Hierarchy klik Kanan > Create Empty kemudian beri nama "Pipe".
Posisikan objek Pipe ke posisi (0, 0, 0) dengan cara merubah Position Transform pada Inspector.
Tambahkan komponen Rigidbody 2D pada objek Pipe, dengan cara Add Component > Physics 2D > Rigidbody 2D. Kemudian check / centang Is Kinematic pada Rigidbody 2D.



Selanjutnya, buka folder Sprite dan expand Sprite Pack jika belum terbuka, dan cari Sprite dengan nama "Sprite Pack_53" dan "Sprite Pack_54" kemudian pilih dan Drag ke objek Pipe pada Hierarchy. Tambahkan komponen Box Collider 2D pada masing-masing Sprite (Sprite Pack_53, Sprite Pack_54) dengan cara Add Component > Physics 2D > Box Collider 2D.



Selanjutnya adalah merubah posisi masing-masing pipa, rubah nilai posisi "Sprite Pack_53" menjadi (0, 1.25, 0) dan "Sprite Pack_54" menjadi (0, -1.25, 0).


Kita perlu satu objek yang bertugas untuk mendeteksi Player bahwa Player telah melewati rintangan dan mendapatkan Point. Caranya, Klik Kanan objek Pipe pada hierarchy kemudian Create Empty  dan beri nama "Point" . Pada Inspector tambahkan Box Collider 2D kemudian centang /check Is Trigger dan atur Size menjadi (0.05, 1).


Buatlah script dan beri nama "PipePlatform".


Kemudian tmbahkan script tersebut (PipePlatform.cs) ke dalam objek Pipe.



Klik 2x script PipePlatform.cs untuk mulai menambahkan beberapa kode.

Dibawah kode public class PipePlatform : Monobehaviour { , tambahakn kode berikut:
 //NILAI KECEPATAN GERAK (X, Y)
 public Vector2 m_Velocity = new Vector2 (-0.8f , 0);

 //NILAI RANGE RANDOM POSISI PIPE (Y)
 public float m_Range = -0.65f;

 //VARIABEL GRAVITASi
 private Rigidbody2D m_RigidBody;
Kemudian didalam fungsi void Start() tambahkan kode inisialisasi sebagai berikut :
  //INISIALISASI GRAVITASI
  m_RigidBody = GetComponent<Rigidbody2D> ();
  //SET VELOCITY 0
  m_RigidBody.velocity = m_Velocity;

  //ACAK POSISI (Y) PIPE
  transform.position = new Vector3 (transform.position.x, transform.position.y - m_Range * Random.value, transform.position.z);
Tambahakn / buat fungsi StopMove() seperti ini:
 //FUNSGI STOP GERAK
 public void StopMove(){
  m_RigidBody.velocity = Vector2.zero;
 }
Sehingga, kode keseluruhan akan nampak seperti ini:
using UnityEngine;
using System.Collections;

public class PipePlatform : MonoBehaviour {

    //NILAI KECEPATAN GERAK (X, Y)
    public Vector2 m_Velocity = new Vector2(-0.8f, 0);

    //NILAI RANGE RANDOM POSISI PIPE (Y)
    public float m_Range = -0.65f;

    //VARIABEL GRAVITASi
    private Rigidbody2D m_RigidBody;

    // Use this for initialization
    void Start () {
        //INISIALISASI GRAVITASI
        m_RigidBody = GetComponent<Rigidbody2D>();
        //SET VELOCITY 0
        m_RigidBody.velocity = m_Velocity;

        //ACAK POSISI (Y) PIPE
        transform.position = new Vector3(transform.position.x, transform.position.y - m_Range * Random.value, transform.position.z);
    }
 
 // Update is called once per frame
 void Update () {
 
 }

    //FUNSGI STOP GERAK
    public void StopMove()
    {
        m_RigidBody.velocity = Vector2.zero;
    }
}

Langkah terakhir pada tutorial yang ke 5 ini adalah men Drag objek Pipe yang ada pada Hierarchy ke Folder Prefab yang telah kita buat tadi. Jika berhasil, objek Pipe pada Hierarchy akan berwarna biru. Kemudian hapus objek Pipe pada Hierarchy.


Okey..sekian dulu tutorial Part 5 ini, selanjutnya akan kita bahas pada tutorial Part 6.

Jika ada masalah, atau pun kesulitan dalam mengikuti tutorial ini, kalian bisa sampaikan pertanyaan pada komentar dibawah. Terim Kasih.
Share on Google Plus

About Unknown

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.

0 komentar:

Posting Komentar