Menu
CoddyTech

Soyut Bileşenler

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 3 / 50.

Bazı temel sınıflar, kendi başına hiçbir zaman var olmayan bir tür şeyi tanımlar. Her silah ateş eder, ancak ne tabanca ne de pompalı tüfek olan bir silahın ateş etmesinin bir yolu yoktur. Böyle bir sınıfı abstract olarak işaretleyin ve alt sınıflarının yazması gereken her adımı gövdesi olmayan soyut bir yöntem olarak bildirin:

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);
        }
    }
}

Fire yöntemini yazmayan bir alt sınıf derlenmez: CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity ayrıca bir nesneye soyut bir betik eklemeyi reddeder. Weapon'ı bir nesnenin üzerine sürüklediğinizde Can't add script behaviour 'Weapon'. The script class can't be abstract! mesajını verir; çünkü Unity, Fire yöntemi olmayan bir Weapon oluşturamaz.

Diğer betikler temel türle çalışmaya devam eder. GetComponent<Weapon>() nesnedeki hangi alt sınıf varsa onu döndürür ve Pull() bu alt sınıfın Fire yöntemini çalıştırır:

// Player.cs
private Weapon weapon;

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

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

Shotgun bileşenini Pistol ile değiştirin; Player betiği aynı kalır.

challenge icon

Görev

Kolay

Büyücünün kulesi alandaki canavarlara ışın gönderir. Monster.cs, tüm canavarların ortak özelliklerini içerir: hp (3) ve 1 hp eksilten, 0 olduğunda canavarı yok eden, aksi hâlde React() çağıran Zap(). Slime.cs küçülerek tepki verir. Imp.cs'nin bir tepkisi yoktur ve Monster ona boş bir React verdiği için eksik olduğunu fark edemezsin.

  • Monster'ı soyut, React'i de soyut bir yöntem yap; böylece nasıl tepki vereceğini belirtmeyen bir canavar derlenmez. Derleyici bu durumda Imp'yi gösterir.
  • Imp'nin React yöntemini yaz: kule'den uzaklaşarak 2 birim geriye (+z boyunca) sıçrar.
  • Tower.cs'de Space tuşuna basıldığında, türü ne olursa olsun Monster etiketiyle işaretlenmiş her nesnenin Monster bileşenini al ve Zap() çağır.

Play'e basıp canavarlara ışın gönder, ardından Check'e bas.

Kendin dene

using UnityEngine;

// Tüm canavarların ortak özellikleri.
public class Monster : MonoBehaviour
{
    public int hp = 3;

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

    // Bu tür canavarın sağ kaldığı bir zap'e nasıl tepki verdiği.
    protected virtual void React()
    {
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de Oyun Mimarisi bölümündeki tüm dersler