Skip to content

Latest commit

 

History

History
348 lines (229 loc) · 19.8 KB

File metadata and controls

348 lines (229 loc) · 19.8 KB

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 objek Enemy secara otomatis selama game sedang berlangsung.

  • Buka prefab Enemy yang ada di folder Prefabs 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 dan Up Movement. Isi Speed dengan nilai bebas.

    Mengatur component Random Start dan Up Movement pada prefab

    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.

    Menggunakan prefab Enemy pada scene

    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 component Destroy On Disappear yang sebelumnya sudah disematkan pada prefab dari game object Enemy 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 nama Enemy Spawner.

  • Posisikan game object tersebut ke bagian paling bawah dari scene, diluar tampilan viewport.

    Memposisikan game object Enemy Spawner

  • Tambahkan component Spawner yang sebelumnya sudah dibuat. Isi Prefab dengan prefab dari Enemy, sedangakn Spawn Interval isi dengan nilai bebas.

    Mengatur component Spawner

  • 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 class Vector2 yang memiliki nilai yang sama dengan new Vector2(0, 1). Informasi lebih lanjut mengenai class Vector2 bisa dilihat disini.

Setelah selesai, simpan baris program tersebut.

Menggunakan Rigidbody

  • Buka game object Player pada scene Game.

  • Tambahkan component Rigidbody 2D, set Gravity Scale menjadi 0, dan set Freeze Rotation pada bagian Constraints menjadi enable.

    Mengatur component Rigidbody 2D

    Gravity Scale di-set menjadi 0 agar objek tidak dipengaruhi gravitasi yang nantinya bisa menyebabkan objek bergerak ke bawah. Sedangkan Freeze 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 menggunakan Transform. Agar objek yang digerakkan tidak bergerak lambat, atur ulang nilai dari Speed pada component Movement Input dan UpMovement 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 menu Edit -> Project Settings....

  • Pada bagian Tags and Layers, buka bagian Tags, klik tombol +.

  • Tambahkan tag baru dengan nama Enemy, lalu klik tombol Save.

    Menambahkan tag Enemy

  • Buka game object Player pada scene Game dan set tag dari game object tersebut menjadi Player.

    Mengatur tag dari game object

    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 menjadi Enemy.

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 class MonoBehaviour, sama seperti fungsi Start(), Update(), dan lain sebagainya. Informasi lebih lanjut mengenai fungsi event yang ada pada MonoBehavior bisa dilihat disini.

Menggunakan Component Destroy On Contact

  • Buka game object Player pada scene Game.

  • Tambahkan component Destroy On Contact dan set Contact Tag menjadi Enemy.

  • Tambahkan component Box Collider 2D, set Is Trigger menjadi enable, dan atur ulang Size sehingga berukuran 1.5, 1.5.

    Mengatur component untuk collision

    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 menjadi Player.

  • Klik tombol Play untuk melihat hasilnya.

Pada tahap ini, ketika objek Player bersentuhan dengan objek Enemy maka kedua objek tersebut akan secara otomatis terhapus dari game. Hal ini sesuai dengan cara kerja dari component Destroy 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 objek Enemy mampu membidik pemain dan menembakkan peluru ke arahnya.

  • Pada prefab Enemy, tambahkan component Enemy Behavior dan atur Bullet menjadi prefab EnemyBullet yang sudah ada serta atur Shoot Interval dengan nilai yang diinginkan.

    Mengatur component Enemy Behavior pada prefab Enemy

  • Pada prefab EnemyBullet, ubah tag dari game object tersebut menjadi EnemyBullet dan tambahkan component Destroy On Contact dengan Contact Tag berisi Player.

    Mengatur prefab EnemyBullet

  • Pada game object Player di scene Game, tambahkan lagi component Destroy On Contact dengan Contact Tag berisi EnemyBullet.

  • Klik tombol Play untuk melihat hasilnya.

    Game object Enemy menembak ke arah Player ketika game sedang berlangsung

    Pada tahap ini, selama game berlangsung, game object Enemy akan menembakkan peluru ke arah game object Player. dan sesuai dengan component Destroy 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 scene Game, tambahkan component Shoot Input dan atur Bullet menjadi prefab PlayerBullet yang sudah ada serta atur Reload TIme dengan nilai yang diinginkan.

    Mengatur component Shoot Input pada game object Player

  • Pada prefab PlayerBullet, ubah tag dari game object tersebut menjadi PlayerBullet dan tambahkan component Destroy On Contact dengan Contact Tag berisi Enemy.

    Mengatur prefab PlayerBullet

  • Pada prefab Enemy, tambahkan lagi component Destroy On Contact dengan Contact Tag berisi PlayerBullet.

  • Klik tombol Play untuk melihat hasilnya.

    Game object Player menembak peluru ketika game sedang berlangsung

    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.

Lanjut bagian keempat, Navigasi Scene