IDamageable
Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 7 / 64.
Arayüz, bir sınıfın içlerinde kod bulunmadan sunmayı taahhüt ettiği yöntemlerin listesidir. Başka hiçbir ortak yönü olmayan sınıflar aynı taahhütte bulunabilir. Sade C# ile:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}IGreeter türündeki bir değişken, bir Robot veya Cat tutabilir ve greeter.Greet() hangisini tutuyorsa onu çalıştırır. IGreeter listesini içeren ancak herkese açık Greet() yöntemi olmayan bir sınıf derlenmez.
Bir oyunda birçok şey hasar alabilir ve çok az başka ortak yönleri vardır: oyuncunun can puanları vardır, bir sandık ise ilk darbede kırılır. Ortak bir temel sınıf onları tek bir aileye zorlar. Arayüz, paylaştıkları tek şeyi adlandırır 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 tek bir temel sınıfı, MonoBehaviour, vardır ve arayüzleri onun ardından listeler. Arayüz kendi dosyasında, IDamageable.cs içinde yer alır ve MonoBehaviour'dan türemez: bir bileşen değildir ve tek başına hiçbir zaman bir nesneye eklenmez. Arayüzü listeleyen bir sınıfta herkese açık bir TakeDamage(int) bulunmalıdır; yoksa sınıf derlenmez.
Hasar veren her neyse, bir sınıfı değil arayüzü ister:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}Ateş topu aynı satırlarla oyuncuya hasar verir ve sandıkları kırar; daha sonra eklenen yeni bir hedef türü de burada değişiklik gerektirmez. Unity, Inspector'da arayüz türündeki bir alanı göstermez. Bu nedenle betikler, ateş topunun yaptığı gibi bir GameObject veya bileşen tutar ve ondan arayüzü ister.
Görev
KolayKardan adamı, zili ve korkuluğu IDamageable yap ki çekiç onlara vursun.
Snowman:TakeDamage, her eksende0.25f * amountkadar küçültür; 0.5 veya daha az olduğunda onu yok et.Bell: Her puan için bir kezDongkaydı oluştur veamountdeğeriniringsdeğerine ekle.Scarecrow:transform.Rotate(0f, 0f, 90f);yalnızca ilk vuruşta çalışır.Slamiçinde, varsa her collider'ın IDamageable nesnesindeTakeDamage(power)çağır.
“Oyna” düğmesine bas ve her birine vur. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
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