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.
Görev
KolayMonster sınıfını soyut yap ve kulenin her tür canavara ışın göndermesini sağla.
Monsteriçinde, gövdesiz olarakpublic abstract class Monsterveprotected abstract void React();yaz.- Derleyici şimdi
Impsınıfını işaret ediyor: konumunaVector3.forward * 2fekleyenprotected override void React()metodunu ekle. Toweriçinde, döngünün içindentarget.GetComponent<Monster>()üzerindeZap()ç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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground