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.
Görev
KolayBü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()
{
}
}
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
1Hiyerarşiler Değil, Bileşenler
Küçük BileşenlerTemel Bir Düşman BetiğiSoyut BileşenlerBirlikte Çalışan BileşenlerÖzet: Modüler Taret4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larÖzet: Ganimet Tablosu7Durum Makineleri
Sınıflar Olarak DurumlarBir Durum MakinesiGeçişlerDüşmanların Yapay ZekâsıTekrar: Kapı Durumları10Proje: Arena Hayatta Kalma
KahramanDüşman Türleri5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriPaylaşılan AyarlarVeri Olarak DalgalarTekrar: Eşya Veritabanı8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest