Spawn dan Collision
Pada bagian ketiga ini, kita akan membahas mengenai cara spawning objek baru ketika game sedang berlangsung. Serta cara membuat interaksi antara satu objek dengan objek lain ketika bertemuan menggunakan sistem collision yang sudah ada pada Unity. Selain kedua hal itu, kita akan mengenal beberapa konsep baru yang ada pada Unity seperti prefab, physics, dan lain sebagainya.
Prefab
Di Unity, umumnya game object selalu dikaitkan dengan suatu scene, seperti yang dijelaskan pada bagian pertama, dimana scene dapat tersusun dari beberapa game object. Namun, suatu game object bisa dibentuk menjadi sebuah asset, sehingga tersimpan diluar scene, dan dapat digunakan di scene manapun tanpa perlu membuat ulang game object tersebut dan menyusun component-nya lagi di scene baru. Game object yang berbentuk asset ini secara umum dikenal sebagai prefab. Salah satu kegunaan dari prefab, selain yang dijelaskan sebelumnya adalah sebagai template game object yang nantinya bisa digunakan dalam spawning.
Informasi lebih lanjut mengenai prefab pada Unity bisa dilihat disini.
Prefab Enemy
- Salah satu contoh dari prefabs yang sudah kita sediakan adalah prefab dari game object
Enemy
. Prefab ini nantinya akan digunakan untuk memunculkan objekEnemy
secara otomatis selama game sedang berlangsung. -
Buka prefab
Enemy
yang ada di folderPrefabs
dengan cara double klik.Sebagai catatan, sama seperti asset yang lain, umumnya asset berbentuk prefab juga diletakkan di folder tersendiri yang bernama
Prefabs
. -
Tambahkan component
Random Start
danUp Movement
. IsiSpeed
dengan nilai bebas.Jika diperhatikan, kita menggunakan component yang sama dengan yang sebelumnya kita buat pada bagian pertama. Hal ini sesuai dengan prinsip dari component based architecture, dimana kita tidak perlu menulis ulang setiap program yang memiliki kegunaan sama, cukup membagi program menjadi potongan potongan kecil sehingga nantinya dengan mudah bisa digunakan untuk hal lain.
-
Kemudian drag and drop prefab tersebut ke dalam scene
Game
.Sebagai kebalikan, jika game object dilakukan drag and drop dari scene ke Project Window maka game object tersebut secara otomatis akan berubah menjadi prefab.
-
Klik tombol
PLay
untuk melihat hasilnya.Pada tahap ini, perilaku dari game object
Enemy
akan sesuai dengan yang ada pada bagian pertama dimana objek akan berpindah tempat secara acak di awal sambil bergerak ke atas.Jika dilihat dengan teliti, game object
Enemy
yang dibuat sebelumnya akan secara otomatis menghilang ketika keluar dari pandangan. Hal ini disebabkan oleh componentDestroy On Disappear
yang sebelumnya sudah disematkan pada prefab dari game objectEnemy
tersebut.
Object Spawning
Dalam game development, object spawning mengacu pada istilah pembuatan suatu objek baru ketika game sedang berlangsung.
Di Unity sendiri object spawning bisa dilakukan dengan cara memanggil method Instantiate()
menggunakan template dari suatu objek yang bisa berupa game object maupun prefab.
Informasi lebih lanjut mengenai method
Instantiate()
bisa dilihat disini.
Component Spawner
Pada percobaan kali ini, kita akan membuat component baru yang akan digunakan untuk melakukan spawning dari suatu objek dalam interval tertentu.
Untuk itu, pertama, buat C# script baru dengan nama Spawner
.
Buka C# script tersebut dan ubah isi dari class Spawner
sebagai berikut:
public class Spawner : MonoBehaviour
{
public GameObject prefab;
public float spawnInterval = 1;
float time = 0;
void Update()
{
time += Time.deltaTime;
if (time >= spawnInterval) {
time -= spawnInterval;
if (prefab != null) {
Instantiate(prefab, transform.position, transform.rotation);
}
}
}
}
Penjelasan singkat dari baris program diatas, program tersebut akan menambah nilai dari variabel time
sebesar Time.deltaTime
.
Baris program seperti diatas secara umum digunakan di Unity sebagai timer sederhana yang akan memanggil fungsi yang ada di dalam blok if
jika waktunya sudah terpenuhi (dalam hal ini yang dimaksud dengan waktu adalah waktu dari spawnInterval
).
Kemudian program akan menge-_check_ jika variabel prefab
ada (kembali untuk menghindari runtime error), dan memanggil method Instantiate()
menggunakan parameter prefab
yang nantinya diset di Inspector Window dan parameter posisi serta rotasi dari objek yang memanggil method Instantiate()
itu sendiri._
Menggunakan Component Spawner
- Buka scene
Game
yang sebelumnya sudah dibuat. - Buat game object baru dengan bentuk empty (
Create Empty
) dan beri namaEnemy Spawner
. -
Posisikan game object tersebut ke bagian paling bawah dari scene, diluar tampilan viewport.
-
Tambahkan component
Spawner
yang sebelumnya sudah dibuat. IsiPrefab
dengan prefab dariEnemy
, sedangaknSpawn Interval
isi dengan nilai bebas. -
Klik tombol
Play
untuk melihat hasilnya.Pada tahap ini, objek
Enemy
akan secara otomatis muncul terus menerus dalam interval waktu yang sudah ditentukan.
Physics
Kebanyakan game yang ada saat ini, baik itu yang berbentuk 3D maupun 2D sudah menerapkan physics dalam game yang dibuat. Jadi untuk pergerakan dari objek pada game tidak hanya dilakukan dengan mengubah nilai dari transformasi secara linear, namun juga dengan menerapkan prinsip fisika seperti inertia, gravitasi, dan lain sebagainya.
Informasi lebih lanjut mengenai physics pada Unity bisa dilihat disini.
Component Rigidbody 2D
Secara sederhana, rigidbody pada Unity merupakan istilah yang digunakan untuk menunjukkan objek yang akan dipengaruhi oleh physics.
Di Unity sendiri terdapat perbedaan antara physics untuk game 3D dengan 2D.
Oleh karena itu terdapat dua macam bentuk component dari rigidbody, yakni Rigidbody
untuk game 3D dan Rigidbody 2D
untuk game 2d.
Karena game yang kita buat merupakan game 2D, disini kita akan menggunakan rigidbody menggunakan component Rigidbody 2D
.
Informasi lebih lanjut mengenai component
Rigidbody 2D
bisa dilihat disini.
Mengganti Pergerakan Transform Dengan Rigidbody 2D
Sebelumnya kita sudah membuat component Movement Input
dan Up Movement
yang digunakan untuk menggerakkan objek dengan mengubah transformasi.
Kali ini kita akan mengubah isi dari kedua component tersebut sehingga alih-alih menggunakan transformasi sederhana, pergerakan dari game object akan dipengaruhi oleh physics untuk mendapatkan hasil yang lebih baik.
Buka C# script dari component Movement Input
dan ubah isi dari class MovementInput
sebagai berikut:
public class MovementInput : MonoBehaviour
{
...
Rigidbody2D rigidbody2d;
void Start()
{
rigidbody2d = GetComponent<Rigidbody2D>();
}
// void Update()
void FixedUpdate()
{
...
// Vector3 translation = new Vector3(inputX, inputY, 0);
Vector2 translation = new Vector2(inputX, inputY);
...
// transform.Translate(translation * Time.deltaTime * speed);
if (rigidbody2d != null) {
rigidbody2d.velocity = translation * Time.deltaTime * speed;
}
}
}
Penjelasan singkat dari baris program diatas, program akan menyimpan referensi dari component Rigidbody 2D
karena berbeda dengan component Transform
, secara default referensi dari component Rigidbody 2D
tidak disimpan pada class MonoBehaviour
.
Lalu fungsi Update()
harus diganti dengan FixedUpdate()
karena perhitungan yang dipengaruhi oleh physics pada Unity harus ditaruh disana.
Kemudian kita harus mengganti bentuk dari variabel translation
menjadi Vector2
karena Rigidbody 2D
hanya bisa berkerja dengan perhitungan 2D
.
Dan terakhir, alih-alih melakukan translasi pada component Transform
, program akan mengubah nilai velocity
dari rigidbody2d
menggunakan perhitungan yang sama.
Setelah selesai, simpan baris program tersebut.
Kemudian buka C# script dari component Up Movement
dan ubah isi dari class UpMovement
sebagai berikut:
public class UpMovement : MonoBehaviour
{
public float speed = 1;
Rigidbody2D rigidbody2d;
void Start()
{
rigidbody2d = GetComponent<Rigidbody2D>();
}
// void Update()
void FixedUpdate()
{
// Vector3 translation = new Vector3(0, 5, 0);
// transform.Translate(translation * Time.deltaTime);
if (rigidbody2d != null) {
rigidbody2d.velocity = Vector2.up * Time.deltaTime * speed;
}
}
}
Penjelasan singkat dari baris program diatas, program memiliki kesamaan dengan program dari component Movement Input
seperti yang sudah dijelaskan sebelumnya.
Selain itu, program juga mulai menggunakan public property sehingga nantinya kecepatan dari objek bisa diatur lebih mudah pada Inspector Window seperti yang dijelaskan pada bagian kedua.
Sebagai tambahan,
Vector2.up
merupakan salah satu member variabel dari classVector2
yang memiliki nilai yang sama dengannew Vector2(0, 1)
. Informasi lebih lanjut mengenai classVector2
bisa dilihat disini.
Setelah selesai, simpan baris program tersebut.
Menggunakan Rigidbody
- Buka game object
Player
pada sceneGame
. -
Tambahkan component
Rigidbody 2D
, setGravity Scale
menjadi0
, dan setFreeze Rotation
pada bagianConstraints
menjadi enable.Gravity Scale
di-_set_ menjadi0
agar objek tidak dipengaruhi gravitasi yang nantinya bisa menyebabkan objek bergerak ke bawah. SedangkanFreeze Rotation
di-_enable_ agar objek tidak berputar secara tidak disengaja karena pengaruh physics dari rigidbody yang lain. -
Lakukan hal yang sama seperti diatas pada prefab
Enemy
.Pergerakan menggunakan
Rigidbody 2D
memiliki kecepatan gerak yang berbeda dibandingkan ketika menggunakanTransform
. Agar objek yang digerakkan tidak bergerak lambat, atur ulang nilai dariSpeed
pada componentMovement Input
danUpMovement
dengan nilai yang lebih besar. -
Klik tombol
Play
untuk melihat hasilnya.Pada tahap ini, pengaruh dari penggunaan rigidbody dibandingkan transformasi biasa tidak akan banyak kelihatan karena gerakan yang kita buat merupakan gerakan yang terbilang sederhana. Namun penggunaan rigidbody ini sendiri merupakan hal yang penting, terutama untuk memastikan collision yang akan kita buat nantinya bisa bekerja secara benar.
Tag
Sesuai dengan namanya, tag merupakan istilah yang digunakan di Unity untuk memberi label pada suatu game object, sehingga kita bisa menggolongkan game object menjadi beberapa jenis berdasarkan tag yang diberikan. Pada bahasan kali ini kita akan menggunakan tag terutama untuk membedakan antara objek yang berjenis player dengan enemy yang nantinya akan digunakan lebih lanjut dalam bagian collision.
Informasi lebih lanjut mengenai tag pada Unity bisa dilihat disini
Mengatur Tag
- Penambahan tag baru bisa dilakukan pada Project Settings, sedangkan untuk mengatur tag yang digunakan pada game object bisa dilakukan pada Inspector Window.
- Buka
Project Settings
yang ada di menuEdit
->Project Settings...
. - Pada bagian
Tags and Layers
, buka bagianTags
, klik tombol+
. -
Tambahkan tag baru dengan nama
Enemy
, lalu klik tombolSave
. -
Buka game object
Player
pada sceneGame
dan set tag dari game object tersebut menjadiPlayer
.Sebagai informasi, tag
Player
merupakan salah satu tag yang secara default sudah ada di Unity sehingga kita tidak perlu membuat tag itu lagi. - Buka prefab
Enemy
dan set tag dari game object tersebut menjadiEnemy
.
Collider
Collider pada Unity merupakan jenis component yang memiliki kegunaan untuk mendeteksi sentuhan dari suatu objek dengan objek yang lain. Secara umum terdapat dua bentuk collider di Unity, yakni collision itu sendiri dan trigger. Perbedaannya terletak pada seberapa detail informasi yang diperlukan ketika dua objek saling bersentuhan. Pada trigger informasi yang diberikan hanya berupa objek yang disentuh, sedangkan pada collision informasi yang diberikan akan lebih detail lagi seperti letak sentuhan, dan seberapa banyak objek yang bersentuhan.
Informasi lebih lanjut mengenai collider pada Unity bisa dilihat disini
Membuat Component Destroy On Contact
Pada percobaan kali ini kita akan membuat component baru yang digunakan untuk menghapus suatu objek jika objek tersebut bersentuhan dengan objek lain yang memiliki tag tertentu.
Untuk itu, pertama, buat C# script baru dengan nama DestroyOnContact
.
Buka C# script tersebut dan ubah isi dari class DestroyOnContact
sebagai berikut:
public class DestroyOnContact : MonoBehaviour
{
public string contactTag;
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == contactTag)
{
Destroy(gameObject);
}
}
}
Penjelasan singkat dari baris program diatas, fungsi OnTriggerEnter2D()
akan dipanggil jika suatu collider bersentuhan dengan collider yang lain.
Dan jika objek dari collider tersebut memiliki tag seperti yang ditentukan di contactTag
, maka program akan menghapus game object itu sendiri.
Sebagai catatan,
OnTriggerEnter2D()
merupakan salah satu bentuk fungsi event yang ada pada classMonoBehaviour
, sama seperti fungsiStart()
,Update()
, dan lain sebagainya. Informasi lebih lanjut mengenai fungsi event yang ada padaMonoBehavior
bisa dilihat disini.
Menggunakan Component Destroy On Contact
- Buka game object
Player
pada sceneGame
. - Tambahkan component
Destroy On Contact
dan setContact Tag
menjadiEnemy
. -
Tambahkan component
Box Collider 2D
, setIs Trigger
menjadi enable, dan atur ulangSize
sehingga berukuran1.5
,1.5
.Seperti yang dijelaskan sebelumnya, dengan meng-_enable_
Is Trigger
mengakibatkan collider bekerja sebagai trigger dan bukan collision. - Lakukan hal yang sama seperti diatas pada prefab
Enemy
, namun dengan menge-_set_Contact Tag
menjadiPlayer
. - Klik tombol
Play
untuk melihat hasilnya.
Pada tahap ini, ketika objek
Player
bersentuhan dengan objekEnemy
maka kedua objek tersebut akan secara otomatis terhapus dari game. Hal ini sesuai dengan cara kerja dari componentDestroy On Contact
seperti yang dijelaskan sebelumnya.
Menembak Peluru
Game yang sudah kita buat sudah berjalan cukup lancar, namun akan terasa membosankan jika tantangan yang ada hanyalah menghindari gerakan dari musuh. Untuk itu kita akan menerapkan fitur baru yang ada pada game yang kita buat sehingga kedua objek player maupun enemy memiliki kemampuan untuk menembakkan peluru.
Sebagai catatan, untuk mempersingkat waktu, component yang akan digunakan pada tahap ini sebelumnya sudah dibuat dan siap untuk digunakan. Detail dari cara kerja component tersebut tidak akan dibahas disini, namun bisa ditanyakan di lain waktu.
Component Enemy Behavior
Enemy Behavior
merupakan component yang akan digunakan agar objekEnemy
mampu membidik pemain dan menembakkan peluru ke arahnya.-
Pada prefab
Enemy
, tambahkan componentEnemy Behavior
dan aturBullet
menjadi prefabEnemyBullet
yang sudah ada serta aturShoot Interval
dengan nilai yang diinginkan. -
Pada prefab
EnemyBullet
, ubah tag dari game object tersebut menjadiEnemyBullet
dan tambahkan componentDestroy On Contact
denganContact Tag
berisiPlayer
. - Pada game object
Player
di sceneGame
, tambahkan lagi componentDestroy On Contact
denganContact Tag
berisiEnemyBullet
. -
Klik tombol
Play
untuk melihat hasilnya.Pada tahap ini, selama game berlangsung, game object
Enemy
akan menembakkan peluru ke arah game objectPlayer
. dan sesuai dengan componentDestroy On Contact
yang ditambahkan, ketika peluru tersebut menyentuh pemain, maka kedua objek tersebut akan terhapus dari game.
Component Shoot Input
Shoot Input
merupakan component yang digunakan untuk menembakkan objek peluru ketika pemain memberikan input klik menggunakan mouse.-
Pada game object
Player
di sceneGame
, tambahkan componentShoot Input
dan aturBullet
menjadi prefabPlayerBullet
yang sudah ada serta aturReload TIme
dengan nilai yang diinginkan. -
Pada prefab
PlayerBullet
, ubah tag dari game object tersebut menjadiPlayerBullet
dan tambahkan componentDestroy On Contact
denganContact Tag
berisiEnemy
. - Pada prefab
Enemy
, tambahkan lagi componentDestroy On Contact
denganContact Tag
berisiPlayerBullet
. -
Klik tombol
Play
untuk melihat hasilnya.Pada tahap ini, selain musuh, pemain juga sudah bisa menembakkan peluru yang mana ketika bersentuhan dengan game object
Enemy
akan menghapus kedua objek tersebut.Sebagai tambahan, agar game terasa menyenangkan, anda bisa secara bebas mengatur parameter yang ada mulai dari skala objek, kecepatan, spawn interval, dan lain sebagainya.
Kesimpulan
Dari bagian ketiga ini kita telah membahas mengenai cara melakukan object spawning ketika game sedang berlangsung serta interaksi yang dapat dilakukan dari dua objek berbeda ketika keduanya bersentuhan. Selain itu kita juga mengenal beberapa konsep baru di Unity seperti detail dari sistem Physics sebagai alternatif cara menggerakkan objek selain dengan cara transformasi serta beberapa konsep dasar seperti prefab untuk menyimpan game object sebagai asset dan tag untuk menggolongkan game object menjadi jenis tertentu.
Pada bagian selanjutnya kita akan mematangkan lagi game yang sudah kita buat dengan menambahkan scene baru untuk keperluan menu, menambahkan tatap muka pada game, serta menerapkan sistem score pada game yang kita buat.