Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Kardan adamı, zili ve korkuluğu IDamageable yap ki çekiç onlara vursun.

  1. Snowman: TakeDamage, her eksende 0.25f * amount kadar küçültür; 0.5 veya daha az olduğunda onu yok et.
  2. Bell: Her puan için bir kez Dong kaydı oluştur ve amount değerini rings değerine ekle.
  3. Scarecrow: transform.Rotate(0f, 0f, 90f); yalnızca ilk vuruşta çalışır.
  4. Slam içinde, varsa her collider'ın IDamageable nesnesinde TakeDamage(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

Kendi başına pratik yap: Unity playground