Membuat Game Flappy Bird menggunakan Unity3D Part 6




Langsung saja kita mulai melanjutkan, pada tahap ini kita akan menambahkan script yang gunanya mengatur random Pipe.

Buatlah script GameManager.cs kemudian buka dan tempelkan kode hingga menjadi seperti ini:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class GameManager : MonoBehaviour {

    //STATIK CLASS SINGLETON
    public static GameManager m_Instance;

    //OBJECT PIPE
    public GameObject m_Pipe;

    [HideInInspector]
    public int m_Score;

    private Text m_TextScore;
    void Awake()
    {
        if (m_Instance == null)
            m_Instance = this;

        m_TextScore = GameObject.Find("Score").GetComponent<Text>();
    }

    void Start()
    {
        //MENGULANG FUNGSI "CREATEPIPE" SETIAP 1 DETIK
        InvokeRepeating("CreatePipe", 1f, 1f);
    }

    void Update()
    {
        m_TextScore.text = m_Score.ToString();
    }

    //FUNGSI GENERATE PIPE
    void CreatePipe()
    {
        Instantiate(m_Pipe , new Vector3(2, transform.position.y,transform.position.z), Quaternion.identity);
    }

    //FUNGSI GAMEOVER
    public void OnGameOver()
    {
        //BATALKAN PERULANGAN "CREATEPIPE"
        CancelInvoke();
    }
}

Setelash itu buat objek pada Hierarchy kemudian beri nama GameManager, atur posisi (0, 0, 0 ) dan tambahkan komponen script GameManager.cs 

 

Setelah itu pada objek GameManager, isikan Pipe dengan objek Pipe yang ada pada folder Prefab, caranya:



Kemudian buatlah Canvas Text, dimana objek ini berfungsi menampilkan score pada game.
Klik Kanan Hierarchy -> UI -> Text kemudian objek Text dirubah namanya menjadi Score, poisiskan Text di tengah atas sceen. Seperti contoh:



Setelah itu coba kalian Play.

Ups..sepertinya terlihat aneh dikarenakan Ground terlihat dibelakang Pipa. Baik, kita coba rubah layer Pipa nya agar terlihat menarik.

Caranya masuk ke folder Prefab, expand Prefab Pipe. Klik Sprite Pack_53 dan Sprite Pack_54 secara bersamaan dengan cara menekan tombol Shift + Mouse Klik. kemudian lihat pada Inspector > Sprite Renderer. Pada Sprite Renderer terdapat properti Order In Layer, rubah 0 menjadi -2


Kemudian tambahkan beberapa kode pada PlayerController.cs tepat dibawah tulisan void Update() {

 
        //JIKA PERTAMA MEMULAI
        if (isFirstJump)
        {
            //SET VELOCITY 0
            m_RigidBody.velocity = Vector2.zero;
            //LOMPAT
            m_RigidBody.AddForce(m_JumpForce);

            isFirstJump = false;
        }
Kemudian tambahkan fungsi lagi :
    //FUNGSI UNITY UNTUK MENDETEKSI BENTURAN POIN
    void OnTriggerEnter2D(Collider2D other)
    {
        //PENAMBAHAN POIN
        GameManager.m_Instance.m_Score += 1;
    }
Tambahkan kode ini di atasa tulisan //NONAKTIFKAN CLASS GROUNDMOVE
        //MENCARI SEMUA OBJECT YANG MEMPUNYAI CLASS PIPEMOVE
        foreach (PipePlatform mPipe in GameObject.FindObjectsOfType(typeof(PipePlatform)))
        {
            //JALANKAN FUNGSI STOP
            mPipe.StopMove();
        }
Sehingga, PlayerController.cs secara keseluruhan akan seperti ini:
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 PERTAMA MEMULAI
        if (isFirstJump)
        {
            //SET VELOCITY 0
            m_RigidBody.velocity = Vector2.zero;
            //LOMPAT
            m_RigidBody.AddForce(m_JumpForce);

            isFirstJump = false;
        }

        //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()
    {
        //MENCARI SEMUA OBJECT YANG MEMPUNYAI CLASS PIPEMOVE
        foreach (PipePlatform mPipe in GameObject.FindObjectsOfType(typeof(PipePlatform)))
        {
            //JALANKAN FUNGSI STOP
            mPipe.StopMove();
        }

        //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();
    }

    //FUNGSI UNITY UNTUK MENDETEKSI BENTURAN POIN
    void OnTriggerEnter2D(Collider2D other)
    {
        //PENAMBAHAN POIN
        GameManager.m_Instance.m_Score += 1;
    }
} 
 

Hasil akhir untuk Part 6 bisa di download di bawah ini

DOWNLOAD
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