Duck Shooter dengan Unity-part6

Hai,

masih dengan saya reopucino, dan masih melanjutkan tulisan saya yang sebelumnya. Hari ini kita akan membuat permainan duck shooter kita menjadi lebih menarik, yaitu dengan memasukan nilai / score.

Yang pertama yang kita lakukan kali ini adalah membuat code global agar bisa diakses oleh seluruh script yang kita buat dan tempat kita meletakan variable dari score. Maka saya akan membuat script baru dengan nama “GlobalVariable.cs”

public class GlobalVariable{

	public static int nilai = 0;

}

yup simple bukan code diatas? tapi kode tersebut sangat powerful bagi saya 🙂 oke sekarang kita akan panggil kode tersebut pada saat bebek di klik. Buka code “DuckCollider” dan kita akan menambahkan 1 line disitu.

void OnMouseDown(){
	killed = true;
	GlobalVariable.nilai += 1; //tambahkan code ini
}

Okey.. sekarang saatnya kita membuat prefebs untuk nilai yang akan tampilkan, buat game object kosong, dan diberi nama nilai, selain itu juga buat 4 child tambahan untuk angka dan gambar bebek kecil

mengaturChildNilai setelah itu kita akan membuat script untuk menampilkan nilai dan membuat script yang mengkonversi nilai int menjadi gambar (karena saya menggunakan gambar untuk nilai dari object tersebut), serta membuat posisi prefeb nilai akan selalu di pojok kiri atas dengan menggunakan fungsi ScreenToWorldPoint. (untuk tutorial ini saya tidak akan menggunakan canvas, dan saya juga pernah membahas screenToWorldPoint)

using UnityEngine;
using System.Collections;

public class Nilai : MonoBehaviour {

	public Camera mainCamera;
	public Sprite[] spriteAngka;
	public GameObject[] allObject;

	void Start () {
		//mengambil nilai tinggi dari pixel
		int tinggi = mainCamera.pixelHeight;
		//mengatur posisi screen space dan mengubahnya ke world space
		this.transform.position = mainCamera.ScreenToWorldPoint (new Vector3 (30, tinggi - 30, 10));
		checkNilai ();
	}

	void Update () {
		checkNilai ();
	}

	void checkNilai(){
		string allNilai = GlobalVariable.nilai.ToString ();
		for(int i = 0; i<allObject.Length; i++){
			if(allNilai.Length< i)
			{
				string oneS = allNilai[i].ToString ();
				if (!allObject [i].activeSelf)allObject [i].SetActive (true);
				int nil = int.Parse (oneS);
				allObject [i].GetComponent<SpriteRenderer>().sprite = spriteAngka [nil];
			}
			else{
				allObject [i].SetActive (false);
			}
		}
	}
}

okey sekarang kita atur “spriteAngka” dengan memasukan seluruh sprite dari angka-angka tersebut, dan atur allObject dengan child dari nilai. jika sudah selesai semuanya saatnya percobaan.

aturChildNilai

Okey sepertinya hari ini saya cukupkan saja, dan seperti biasa sebelum di tutup saya akan menjawab quest yang kemaren saya dibuat yaitu membuat bebek tersebut random dengan gambar yang berbeda saat melewati screen, dan jika bebek tersebut mati maka saya hidupkan kembali.

Pertama ubah code dari DuckCollider.cs yang sebelumnya private menjadi public

public class DuckCollider : MonoBehaviour {

	public Sprite backImageDuck;
	public bool killed = false; // ubah variable yang sebelumnya private menjadi public
	/* hal tersebut supaya variable bisa diakses oleh script yang lain */

	//... ini adalah code yang dibawah
}

jika sudah sekarang ubah code dari DuckBehaviour.cs

using UnityEngine;
using System.Collections;

public class DuckBehaviour : MonoBehaviour {

	public Sprite[] gambarBebek;
	public GameObject childObject;
	public bool flip = false;

	// Use this for initialization
	void Start () {
		randomizeGambarBebek (); //saya membuat script yang sebelumnya menjadi function karena saya lebih mudah menghapalnya
	}

	// Update is called once per frame
	void Update () {
		if(this.flip){
			Vector3 moveDuck = this.transform.position; // buat holder variable untuk posisi perpindahan bebek
			moveDuck.x -= 1 * Time.deltaTime; // setiap 1 detik object akan bertambah kesisi X sebesar 1 point
			if(this.transform.position.x <-10){// jika posisi bebek sudah di ujung kanan kita akan membuatnya kembali ke posisi kiri
				moveDuck.x = 12;
				childObject.GetComponent <DuckCollider>().killed = false; //mengubah variable killed menjadi false
				randomizeGambarBebek (); //me-random gambar bebek
			}
			this.transform.position = moveDuck;
		}
		else{
			Vector3 moveDuck = this.transform.position; // buat holder variable untuk posisi perpindahan bebek
			moveDuck.x += 1 * Time.deltaTime; // setiap 1 detik object akan bertambah kesisi X sebesar 1 point
			if(this.transform.position.x< 10){// jika posisi bebek sudah di ujung kanan kita akan membuatnya kembali ke posisi kiri
				moveDuck.x = -12;
				childObject.GetComponent <DuckCollider>().killed = false; //mengubah variable killed menjadi false
				randomizeGambarBebek (); //me-random gambar bebek
			}
			this.transform.position = moveDuck;
		}

	}

	//fungsi untuk mengacak gambar bebek
	void randomizeGambarBebek(){
		int rand = Random.Range (0, gambarBebek.Length);
		childObject.GetComponent <SpriteRenderer>().sprite = gambarBebek[rand];
	}
}

Selesai sudah tutorial hari ini. Saya harap dari beberapa script yang saya buat kalian bisa mengetahui :
1. membuat global var yang bisa di akses oleh script yang kita buat
2. mengatur posisi X dan Y pada screen space dan mengubahnya world space (saya juga membuat pernah membuat tutorial ini disini)
3. mengambil nilai int dan menampilkan gambar angka untuk mengganti nilai tersebut.

Quest hari ini adalah, bisakah kalian membuat gambar jumlah perluru yang kita miliki disebelah kiri bawah (saya akan menggunakan 6 peluru) dari beberapa contoh code yang sudah saya berikan? kalian bebas untuk mengisi kolom komentar jika kalian ada kendala atau sudah bisa menyelesaikan quest yang saya berikan

 

Cheers 😀

NB : Ini adalah bagian dari tutorial Duck Shooter, jika kalian ada terlewat dari tutorial ini, silahkan klik part dibawah ini :
1. Part 1 (Membuat 2D game Duck Shooter dengan Unity)
2. Part 2 (Duck Shooter dengan Unity-part2)
3. Part 3 (Duck Shooter dengan Unity-part3)
4. Part 4 (Duck Shooter dengan Unity-part4)
5. Part 5 (Duck Shooter dengan Unity-part5)

Leave a Reply

Your email address will not be published. Required fields are marked *