Pada tutorial kali ini, kita akan mengenal salah satu konsep untuk berkomunikasi antar objek dengan menggunakan Delegates dan Event. Cara yang paling umum untuk digunakan jika ingin berkomunikasi dengan objek lain adalah dengan memberikan reference terhadap sebuah object. Kita bisa melakukan ini dengan cara membuat public variable untuk suatu game object lalu memberikan reference melalui inspector. Kita juga bisa melakukan komunikasi dengan cara menggunakan fungsi find game object. Atau yang paling mudah, kita bisa menggunakan fungsi sendMessage yang memiliki limitasi hanya bisa memanggil fungsi di script lain yang berada dalam satu komponen game object.
Pendekatan delegates dan event merupakan salah satu pendekatan yang cukup populer dalam bahasa pemrograman C# dan bisa membuat kode kita bisa lebih bersih. Jika komunikasi yang kita lakukan sudah semakin banyak percabangan dan referencenya, pendekatan delegates dan event akan membantu kita untuk bisa mendesain arsitektur kode kita lebih baik lagi. Mari kita akan coba bahas teori dari delegate dan event secara general terlebih dahulu.
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar SekarangDelegate
Secara konsep, delegate merupakan pointer reference dari suatu method. Delegate dapat membuat kita menjadikan sebuah method menjadi variabel dan melempar sebuah method sebagai sebuah variable ketika melakukan callback. Ketika method ini dipanggil, maka sistem akan menotifikasi seluruh metode yang merefer ke delegate. Analoginya mirip dengan subscription. Semua method yang melakukan subscription akan diupdate secara otomatis. Delegate sangat bermanfaat untuk invoke method dalam jumlah banyak dalam satu event runtime dan digunakan untuk trigger callback method.
Mungkin secara konsep terasa sangat membingungkan, namun jangan khawatir, seiring nanti kita belajar mempraktekan delegate dan event, akan semakin terbayang betapa simpel dan efisiennya penggunakan metode ini untuk komunikasi antar objek.
Sebagai contoh, kita bisa ambil kasus sebuah kode dimana jika kita menekan tombol, akan memberikan efek di dua gameobject yang berbeda. Semisal jika kita menekan button shoot, maka akan ada dua gameobject yang menjalankan methodnya. Yang pertama akan ada object pistol yang menginisiasi peluru dan yang kedua akan ada object UI yang mengurangi jumlah peluru yang player miliki. Contoh sintaksnya adalah sebagai berikut:
1 2 |
//Declare Delegate public delegate void ButtonClick (); |
Event
Event merupakan tipe spesial dari delegates yang dapat digunakan untuk menotifikasi kelas lainnya ketika sesuatu terjadi. Contohnya ketika button shoot dipencet, event akan memberikan notifikasi kepada kelas peluru dan kelas jumlah peluru untuk melakukan aksinya masing-masing. Event bisa di deklarasi menggunakan delegates. Ini adalah contoh sintaksnya.
1 2 3 4 5 |
//Declare Delegate public delegate void ButtonClick(); //Declare Event public static event ButtonClick Click; |
Contoh Penggunaannya
Pertama kita akan memberikan deklarasi delegate dan event pada kelas yang memproses tombol shoot yang diklik, kita beri nama kelas ButtonShoot.cs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class ButtonShoot : MonoBehaviour { //delegate() public delegate void ButtonClick(); //event public static event ButtonClick Click; public void Update() { if(Input.GetKeyDown(KeyCode.A)) { OnButtonShootClick (); } } //method yang mentrigger untuk event Click dipanggil public void OnButtonShootClick() { //panggil eventnya Click (); } } |
Selanjutnya kita akan membuat kode dari kelas yang subscribe tersebut sehingga ketika terjadi perubahaan, method pada kelas ini akan dijalankan. Kita akan membuat dua kelas yang subscribe terhadap event Click yakni kelas Pistol.cs dan kelas TextPeluru.cs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pistol : MonoBehaviour { public GameObject peluru; public Transform moncongPistol; //melakukan subscribsi method ke event void OnEnable() { ButtonShoot.Click += BulletShoot; } void BulletShoot() { //diisi kode untuk menembakan peluru Rigidbody rig = Instantiate(peluru, moncongPistol.position, Quaternion.identity).GetComponent<Rigidbody>(); rig.velocity = moncongPistol.TransformDirection (Vector3.forward*400); } } |
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 32 33 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class TextPeluru : MonoBehaviour { //variabel untuk menyimpan jumlah peluru int bullet; public Text textBullet; public void Start() { bullet = 100; } public void Update() { textBullet.text = bullet.ToString (); } //melakukan subscribsi method ke event void OnEnable() { ButtonShoot.Click += ReduceBullet; } void ReduceBullet() { //diisi kode untuk menembakan peluru bullet--; } } |
Dengan memasang kode di atas, maka ketika tombol button shoot ditekan, secara otomatis kelas Pistol.cs akan menjalankan method BulletShoot() dan kelas Peluru.cs akan menjalankan method ReduceBullet().
Semoga tutorial ini bisa membantu teman-teman untuk membuat kode program yang lebih clean dan efektif. Untuk mengunduh contoh programnya, silakan klik link berikut.
Masih banyak pembahasan menarik di Dicoding Academy Belajar Membangun Game 2D dan 3D dengan Unity yang belum kita bahas di sini, untuk pembahasan lebih jauh silakan kunjungi Academy Belajar Membangun Game 2D dan 3D dengan Unity (https://www.dicoding.com/academies/39). Jika ada pertanyaan, saran atau masukan jangan sungkan untuk menuliskannya di kolom komentar.
Selamat belajar, semoga bermanfaat, dan nantikan tutorial pembuatan game menggunakan Unity selanjutnya.