Menu
CoddyTech

Komponen Abstrak

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

Beberapa kelas dasar menjelaskan jenis sesuatu yang tidak pernah ada dengan sendirinya. Setiap senjata menembak, tetapi senjata yang bukan pistol maupun shotgun tidak punya cara untuk menembak. Tandai kelas seperti itu dengan abstract, lalu deklarasikan setiap langkah yang harus ditulis oleh subkelasnya sebagai method abstrak, tanpa isi:

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

Subkelas yang tidak menulis Fire tidak bisa dikompilasi: CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity juga menolak menambahkan skrip abstrak ke sebuah objek. Seret Weapon ke objek, lalu Unity menampilkan pesan Can't add script behaviour 'Weapon'. The script class can't be abstract!, karena Unity tidak bisa membuat Weapon yang tidak memiliki Fire.

Skrip lain tetap bisa menggunakan tipe dasar. GetComponent<Weapon>() mengembalikan subkelas apa pun yang ada pada objek, dan Pull() menjalankan Fire milik subkelas tersebut:

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

Ganti komponen Shotgun dengan Pistol, dan skrip Player tetap sama.

challenge icon

Tantangan

Mudah

Jadikan Monster abstrak dan biarkan menara menyetrum setiap jenis monster.

  1. Di Monster, tulis public abstract class Monster dan protected abstract void React();, tanpa isi fungsi.
  2. Sekarang compiler menunjuk ke Imp: tambahkan protected override void React() yang menambahkan Vector3.forward * 2f ke posisinya.
  3. Di Tower, di dalam perulangan, panggil Zap() pada target.GetComponent<Monster>().

Tekan tombol “Main” lalu Space: slime menyusut, imp melompat mundur. Lalu tekan tombol “Periksa”.

Coba sendiri

using UnityEngine;

// Hal yang dimiliki setiap monster.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // Cara monster jenis ini bereaksi setelah selamat dari serangan listrik.
    protected virtual void React()
    {
    }
}

Semua pelajaran di Arsitektur Game di Unity

Latihan sendiri: Playground Unity