Menu
CoddyTech

Soyut Bileşenler

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

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ş etme yolu yoktur. Böyle bir sınıfı abstract olarak işaretle ve alt sınıflarının yazması gereken her adımı gövdesi olmayan bir soyut yöntem olarak tanımla:

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 soyut bir betiği bir nesneye eklemeyi de reddeder. Weapon'ı bir nesnenin üzerine sürüklediğinde Can't add script behaviour 'Weapon'. The script class can't be abstract! mesajı görünür; çünkü Unity, Fire yöntemi olmayan bir Weapon oluşturamaz.

Diğer betikler yine de temel türle çalışır. GetComponent<Weapon>() nesnedeki alt sınıf hangisiyse onu döndürür ve Pull() o 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ştir; Player betiği aynı kalır.

challenge icon

Görev

Kolay

Monster sınıfını soyut yap ve kulenin her tür canavara ışın göndermesini sağla.

  1. Monster içinde, gövdesiz olarak public abstract class Monster ve protected abstract void React(); yaz.
  2. Derleyici şimdi Imp sınıfını işaret ediyor: konumuna Vector3.forward * 2f ekleyen protected override void React() metodunu ekle.
  3. Tower içinde, döngünün içinden target.GetComponent<Monster>() üzerinde Zap() çağır.

“Oyna”'ya ve ardından Space tuşuna bas: slime'lar küçülür, imp geriye sıçrar. Ardından “Kontrol et”'e bas.

Kendin dene

using UnityEngine;

// Her canavarı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 bir canavarın, sağ çıktığı bir elektrik çarpmasına nasıl tepki verdiği.
    protected virtual void React()
    {
    }
}

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

Kendi başına pratik yap: Unity playground