Menu
CoddyTech

Temel Düşman Script'i

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

C# dilinde bir sınıf başka bir sınıftan türeyebilir: class Ghost : Enemy, Enemy sınıfının tüm alan ve metotlarını alır ve kendine ait olanları ekler. Temel sınıfta virtual olarak işaretlenen bir metot, alt sınıfta override ile değiştirilebilir; base.Describe() ise yeni metodun içinden temel sınıfın sürümünü çalıştırır. Sade C# ile:

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

Bir Ghost'un Describe() metodu Enemy with 3 hp, see-through döndürür. protected, Enemy sınıfının ve alt sınıflarının hp değişkenini kullanabileceği, diğer sınıfların ise kullanamayacağı anlamına gelir.

Unity'de düşmanlar kodlarının büyük bölümünü paylaşır: can puanları, hız ve hareket etme biçimi. Bu kod, MonoBehaviour sınıfından türeyen bir temel sınıfta bulunur ve her düşman türü bu sınıftan türetilir. Bu Enemy sınıfı, Start metodunda can puanlarını ayarlar ve Update metodunda baktığı yöne doğru yürür; Ghost ise başlangıçta iki kat daha hızlı hareket edecek şekilde değişiklik yapar:

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 alanları devralır; bu nedenle Inspector, bir Ghost üzerindeki maxHp ve speed alanlarını gösterir. Update metodunu da devraldığı için kendine ait bir Update metodu olmadan yürür. hp değişkeni protected olduğu için Enemy sınıfı ve alt sınıfları bunu kullanabilir, ancak diğer betikler kullanamaz.

Unity, erişim belirleyicileri ne olursa olsun Start ve Update metotlarını adlarına göre bulur ve en alt sınıftaki metodu çağırır. Enemy sınıfının Start metodu private void Start() olsaydı ve Ghost kendi Start metodunu tanımlasaydı, Unity yalnızca Ghost'un metodunu çağırırdı: Enemy'nin metodu hiç çalışmaz ve hiçbir hata oluşmadan hp değeri 0 kalırdı. Temel sınıfın metotlarını protected virtual olarak tanımlamak, bunu sade C# ile açık hâle getirir: alt sınıf override yazar ve base.Start(), çağırdığın noktada temel sınıfın ilgili bölümünü çalıştırır. Bu çağrıyı eklemezsen temel sınıfın bölümü atlanır; böylece alt sınıf, bir adıma ekleme yapmak yerine o adımı değiştirir.

challenge icon

Görev

Kolay

Golem ve Wasp'ın kendi kodlarından önce Enemy'nin kodunu çalıştırmasını sağla.

  1. Enemy içinde, void Start() ve void Update() ifadelerinin önüne protected virtual yaz.
  2. Golem içinde, ilk satırı base.Start(); olacak şekilde protected override void Start() yap.
  3. Wasp içinde, ilk satırı base.Update(); olacak şekilde protected override void Update() yap.

“Oyna” düğmesine bas: golem tam hp ile ilerler ve yaban arısı ilerlerken zikzak çizer. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

// Her canavarın ortak özellikleri.
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()
    {
        // z ekseni boyunca kaleye doğru ilerle
        transform.position += Vector3.back * speed * Time.deltaTime;
    }
}

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

Kendi başına pratik yap: Unity playground