IDamageable
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 6 / 50.
Bir oyunda pek çok şey hasar alabilir ve bunun dışında pek az ortak noktaları vardır: oyuncunun can puanları vardır, bir sandık ise ilk darbede kırılır. Ortak bir temel sınıf, onları aynı aileye sokmaya zorlar. Bir arayüz, paylaştıkları tek özelliği tanımlar ve her betik bunu kendi yöntemiyle uygular:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}Bir betiğin yine de tek bir temel sınıfı vardır: MonoBehaviour. Arayüzleri bunun ardından listeler. Arayüz, kendine ait IDamageable.cs dosyasında bulunur ve MonoBehaviour sınıfından türetilmez: bir bileşen değildir ve tek başına hiçbir nesneye eklenmez. Onu listeleyen bir sınıfta public TakeDamage(int) bulunmalıdır; aksi hâlde sınıf derlenmez.
Hasarı veren şey, bir sınıfı değil arayüzü arar:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}Ateş topu aynı kod satırlarıyla oyuncuya hasar verir ve sandıkları kırar; daha sonra yeni bir hedef türü eklendiğinde burada hiçbir değişiklik gerekmez. Unity, Inspector'da arayüz türünde bir alan göstermez; bu yüzden betikler bir GameObject veya bileşen tutar ve ateş topunun yaptığı gibi ondan arayüzü ister.
Görev
KolayKöy meydanını devasa bir yaratık koruyor. Ok tuşları Devi hareket ettirir (Mover.cs, hazır) ve Space çekicini savurur: Hammer.cs, Slam() metodunu çağırır; bu metot radius içindeki tüm çarpıştırıcıları bulur. Meydandaki üç şey darbeye kendi yöntemleriyle karşılık verir ve başka hiçbir şeyi paylaşmaz:
Snowman: her hasar puanı, her eksendeki boyutundan 0.25 düşürür (başlangıç boyutu 1.5'tir). Boyutu 0.5 veya daha az olduğunda erir: kardan adamı yok et.Bell: her hasar puanı içinDongmesajını bir kez günlüğe yazar (2 hasarlık bir darbe mesajı iki kez yazar) ve puanlarıringsdeğerine ekler.Scarecrow: ilk darbe, hasar miktarı ne olursa olsun onu devirir ve z ekseni etrafında 90 derece döndürür. Sonraki darbeler hiçbir şeyi değiştirmez.
IDamageable.cs arayüzü tek bir metotla tanımlar: void TakeDamage(int amount). Snowman, Bell ve Scarecrow sınıflarının bu arayüzü uygulamasını ve her birinin kendine özgü tepki vermesini sağla. Ardından Slam içinde, bulduğu her çarpıştırıcının IDamageable bileşeninde TakeDamage(power) metodunu çağır. Yerde olduğu gibi bu bileşene sahip olmayan çarpıştırıcılar atlanır.
Play'e bas, her birine yaklaş ve çekici savur; ardından Check'e bas.
Kendin dene
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
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