Duck Shooter dengan Unity part-8

Helo,

Tutorial duck shooter kali ini akan membahas batasan waktu permainan, sehingga pada saat pemain melebihi batasan waktu yang telah di berikan, maka permainan kita hentikan. Sebelum dimulai, tarik napas dalam-dalam, karena tutorial hari ini cukup panjang 🙂

Oke, tanpa basa basi lebih lanjut kita langsung mulai dengan game object baru dan kita beri nama “Time”, dan juga kita buat script dan kita beri nama GameTimer.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using UnityEngine;
using System.Collections;

public class GameTimer : MonoBehaviour {

public float setTimer ;

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {

if(setTimer<0){
setTimer -= Time.deltaTime;
if(setTimer<0){
GlobalVariable.stateMachine = "end";
}
}
}
}

Okey, kita lanjut lagi, dengan membuka script GlobalVariable.cs untuk menambahkan variable baru disana

1
2
3
4
5
6
public class GlobalVariable{

public static int nilai = 0;
public static int amunisi = 6;
public static string stateMachine = "play";
}

Disini kita akan membuat state machine, atau bisa di bilang status mesin dari permainan kita. Jadi semua logika permaianan yang menyangkut dengan permainan kita hanya boleh berjalan saat state mechine ber-status “play”.

Sekarang saatnya kita melakukan setting kepada game object baru kita, masukan script “GameTimer.cs” didalam game object “Time”, dan kita atur setTimer kita menjadi 10 (saya ingin permainan berjalan 10 detik)

aturTime

Selanjutkan buka DuckCollider.cs dan PeluruUI.cs untuk masukan beberapa script tambahan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
using System.Collections;

public class DuckCollider : MonoBehaviour {

// ... Kode yang diatas tidak saya tulis

void OnMouseDown(){
//jika state machine tidak berstatus play maka tidak boleh melakukan apa-apa (kembali ke awal)
if (GlobalVariable.stateMachine != "play")
return;

if (GlobalVariable.amunisi < 1)
{
return;
}
killed = true;
GlobalVariable.nilai += 1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using UnityEngine;
using System.Collections;

public class PeluruUI : MonoBehaviour {

//... Kode yang diatasnya tidak saya tulis

// Update is called once per frame
void Update () {
//jika state machine tidak berstatus play maka tidak boleh melakukan apa-apa
if (GlobalVariable.stateMachine != "play")return;

if(Input.GetMouseButtonDown (0)){
Vector2 worldPoint = mainCamera.ScreenToWorldPoint (Input.mousePosition);
RaycastHit2D hit = Physics2D.Raycast (worldPoint, Vector2.zero);
GlobalVariable.amunisi -= 1;
if(hit.collider != null){
if(hit.collider.name == "reload"){
ReloadPeluru ();
}
}
if (GlobalVariable.amunisi < 0)return;
if(GlobalVariable.amunisi<6){
objectPeluru [GlobalVariable.amunisi].GetComponent <SpriteRenderer> ().sprite = spritePeluruKosong;
}

}
}

// .. kode reload tidak saya tulis
}

Jika sudah selesai semuanya, kita lanjut dengan melakukan testing

Dari contoh diatas saya berhasil melakukannya, Tapi sepertinya seperti itu saja kurang menarik. Disini saya akan coba menambahkan beberapa object tambahan supaya terlihat lebih menarik.

Yang pertama saya ingin lakukan adalah dengan menambahkan mempersiapkan “Ready GO” untuk kepada pemain.

Walau terlihat simple tapi Tulisan diatas membuat game kita terlihat lebih menyenangkan. Untuk membuatnya, buat child gameobject di “Time”, dan kita beri nama “Ready” dan “Go” dan berikan juga Sprite Renderer pada component keduanya, jangan lupa juga memberikan sprite yang sesuai dengan nama tersebut

aturReadyGo

Jika sudah atur transform scale pada gameobject “Ready” dengan ukuran (x:2, y:2, z:1), atur scale pada gameobject “Go” degan ukuran (x:0, y:0, z:1). Jika sudah, kita akan membuat script kepada untuk keduanya

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;

public class ReadyFade : MonoBehaviour {

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
Color colorRender = this.GetComponent <SpriteRenderer> ().color;
if (colorRender.a < 0)
{
if (!GlobalVariable.readyDone)
GlobalVariable.readyDone = true;
return;
}
colorRender.a -= .02f;
this.GetComponent <SpriteRenderer> ().color = colorRender;
Vector3 changeLocalSize = this.transform.localScale;
changeLocalSize.x += .05f;
changeLocalSize.y += .05f;
this.transform.localScale = changeLocalSize;

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using UnityEngine;
using System.Collections;

public class GoFade : MonoBehaviour {

float setTiming = 0.1f;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (!GlobalVariable.readyDone)return;

Vector3 localScaling = this.transform.localScale;
if(localScaling.Equals (new Vector3(2,2,1))){
//trigger untuk mengubah state machine
if (GlobalVariable.stateMachine != "play")GlobalVariable.stateMachine = "play";
this.transform.position = new Vector3 (200, 0, 0);
this.gameObject.SetActive (false);
return;
}
else{
setTiming += Time.deltaTime;
this.transform.localScale = Vector3.Lerp (localScaling, new Vector3 (2, 2, 1), setTiming);
}
}
}

sekarang buka kembali GlobalVariable.cs karena saya membuat tambahan variable, dan mengubah state machine menjadi “stop”. Jadi yang melakukan trigger dan mengubah state machine kita adalah game object “Go”.

1
2
3
4
5
6
7
public class GlobalVariable{

public static int nilai = 0;
public static int amunisi = 6;
public static string stateMachine = "stop";
public static bool readyDone = false;
}

Jika sudah semua, kalian boleh melakukan pengetesan untuk mengetahui perubahanya.

Kita lanjut dengan membuat gameobject tambahan yaitu “Time UP”. Object tambahan ini untuk mengingatkan pemain saat waktunya sudah habis. Kita buat child kembali pada gameobject “Time”, kita beri nama “time up”, lalu buat child lagi pada “time up”, karena kedua tulisan tersebut terpisah, jadi kita akan lebih mudah mengaturnya jika menjadi 1 game object. Kalian bisa melihat gambar di bawah untuk jelasnya

aturTimeup

Sekarang kita kembali membuat script untuk menampilkan “time up” saat waktu sudah habis.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using UnityEngine;
using System.Collections;

public class ResizeTimeout : MonoBehaviour {

private bool resizing = false;
private float setTiming = 0;
// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
if (!resizing)return;
Vector3 localScaling = this.transform.localScale;
if(localScaling.Equals (new Vector3(2,2,1))){
return;
}
else{
setTiming += Time.deltaTime;
this.transform.localScale = Vector3.Lerp (localScaling, new Vector3 (2, 2, 1), setTiming);
}
}

public void activeResize(){
resizing = true;
GlobalVariable.stateMachine = "end";
}
}

Kita lanjutkan lagi dengan membuka GameTimer.cs dan mengubahnya menjadi code seperti dibawah

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using UnityEngine;
using System.Collections;

public class GameTimer : MonoBehaviour {

public float setTimer ;
public GameObject timeOut; //tempat kita meletakan game object "time up"

// Use this for initialization
void Start () {

}

// Update is called once per frame
void Update () {
//saya menambahkan (GlobalVariable.stateMachine == "play") untuk memastikan state play yang sedang dimainkan
if(setTimer>0 && GlobalVariable.stateMachine == "play"){
setTimer -= Time.deltaTime;
}

// ini adalah code yang di panggil saat timer sudah habis.
if(setTimer<0 && !timeOut.activeSelf){
timeOut.SetActive (true);
timeOut.GetComponent <ResizeTimeout>().activeResize ();
}
}
}

Next saatnya kita coba kembali pemainan kita.

wuih… akhirnya selesailah tutorial untuk hari ini, saya harap kalian bisa membelajari beberapa dari tutorial ini

  1. mengetahui state machine (https://en.wikipedia.org/wiki/Finite-state_machine)
  2. Menggunakan Lerp (https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html)

Sebelum saya tutup, saya kembali mengadakan quest untuk kalian semua. Bisakah kalian membuat tampilan waktu yang tersisa menggunakan sprite?

aturTimeSprite

jika kalian lupa kalian bisa melihat kembali Duckshooter-part6, karena logikanya tidak terlalu berbeda berdengan itu. Okey sampai bertemu di next tutorial, dan tidak lupa saya akan meletakan unitypackage saya disini

Cheers 🙂