Menu
CoddyTech

Skrip Dasar Musuh

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 2 dari 64.

Di C#, sebuah class dapat diturunkan dari class lain: class Ghost : Enemy mendapatkan setiap field dan method dari Enemy, lalu menambahkan miliknya sendiri. Method yang ditandai virtual oleh class dasar dapat diganti di subclass dengan override, dan base.Describe() menjalankan versi class dasar dari dalam versi yang baru. Dalam C# biasa:

class Enemy
{
    protected int hp = 3;

    public virtual string Describe()
    {
        return "Enemy with " + hp + " hp";
    }
}

class Ghost : Enemy
{
    public override string Describe()
    {
        return base.Describe() + ", see-through";
    }
}

Describe() milik Ghost mengembalikan Enemy with 3 hp, see-through. protected berarti Enemy dan subclass-nya dapat menggunakan hp, sedangkan class lain tidak.

Di Unity, sebagian besar kode musuh sama: poin nyawa, kecepatan, dan cara bergerak. Kode itu berada di class dasar yang diturunkan dari MonoBehaviour, lalu setiap jenis musuh diturunkan darinya. Enemy ini menetapkan poin nyawanya di Start dan berjalan ke arah yang dihadapinya di Update, sedangkan Ghost mengubah Start agar bergerak dua kali lebih cepat:

public class Enemy : MonoBehaviour
{
    public int maxHp = 3;
    public float speed = 2f;
    protected int hp;

    protected virtual void Start()
    {
        hp = maxHp;
    }

    protected virtual void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}
public class Ghost : Enemy
{
    protected override void Start()
    {
        base.Start();
        speed *= 2f;
    }
}

Ghost mewarisi field-nya, jadi Inspector menampilkan maxHp dan speed pada Ghost. Ghost juga mewarisi Update, jadi ia berjalan tanpa memiliki Update sendiri. hp bersifat protected: Enemy dan subclass-nya dapat menggunakannya, sedangkan skrip lain tidak.

Unity mencari Start dan Update berdasarkan nama, apa pun aksesnya, lalu memanggil method yang ada di class turunan paling akhir. Jika Start milik Enemy berupa void Start() private dan Ghost mendeklarasikan Start sendiri, Unity hanya akan memanggil milik Ghost: Start milik Enemy tidak akan pernah berjalan, dan hp akan tetap bernilai 0 tanpa error. Mendeklarasikan pesan milik class dasar sebagai protected virtual membuatnya menjadi C# biasa: subclass menulis override, dan base.Start() menjalankan bagian milik class dasar di tempat kamu memanggilnya. Jika pemanggilan itu tidak disertakan, bagian milik class dasar dilewati. Dengan cara ini, subclass mengganti suatu langkah, bukan menambahkannya.

challenge icon

Tantangan

Mudah

Buat Golem dan Wasp menjalankan bagian Enemy sebelum bagian mereka sendiri.

  1. Di Enemy, tulis protected virtual sebelum void Start() dan void Update().
  2. Di Golem, ubah menjadi protected override void Start() dengan base.Start(); sebagai baris pertamanya.
  3. Di Wasp, ubah menjadi protected override void Update() dengan base.Update(); sebagai baris pertamanya.

Tekan tombol “Main”: golem bergerak dengan hp penuh, dan tawon bergerak zigzag. Lalu tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;

// Hal yang dimiliki setiap monster.
public class Enemy : MonoBehaviour
{
    public int maxHp = 4;
    public float speed = 1.5f;

    protected int hp;
    protected Vector3 spawnPoint;

    void Start()
    {
        hp = maxHp;
        spawnPoint = transform.position;
    }

    void Update()
    {
        // Bergerak menuju kastel, ke arah negatif sumbu z.
        transform.position += Vector3.back * speed * Time.deltaTime;
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity