Menu
CoddyTech

Sağlık ve Hasar

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 55 / 71.

Hasar sistemi iki betik gerektirir. Health betiği, zarar görebilecek her nesnenin üzerinde bulunur ve can puanlarını yönetir; hasar veren nesne de bu betiği bulup içindeki bir yöntemi çağırır. İşte üç darbede parçalanan bir kasanın Health betiği ve üzerlerine düşen her şeye hasar veren dikenler:

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

TakeDamage, public olduğu için diğer betikler tarafından çağrılabilir ve hp değerini değiştiren tek kod parçasıdır. Dikenler, mermiler ve lav aynı yöntemi çağırır; 0'ın ne anlama geldiğine yalnızca Health betiği karar verir: kasayı yok etmek, oyunu bitirmek veya bir ölüm animasyonu oynatmak. Her betik kendi dosyasında bulunur ve dosyaya sınıfının adı verilir.

GetComponent<Health>(), zemin gibi Health betiği olmayan nesneler için null döndürür; bu nedenle dikenler çağrı yapmadan önce kontrol eder. TryGetComponent(out Health health), aramayı ve kontrolü tek bir çağrıda yapar: yalnızca bir Health bileşeni varsa true döndürür ve health değişkenine bileşeni atar.

challenge icon

Görev

Orta

Darbelerin etkili olmasını sağla. Bullet hazır ve isabet ettiği nesneye TakeDamage(2) çağrısı yapıyor.

  1. Health içinde TakeDamage(int amount) metodunu doldur: hp değerinden Mathf.Max(amount - armor, 1) çıkar.
  2. Örneğin Dummy hp: 2 olacak şekilde name + " hp: " + hp ifadesini günlüğe yaz.
  3. hp <= 0 olduğunda Destroy(gameObject); çağrısı yap.

“Oyna” düğmesine bas ve kuklaya iki kez ateş et: önce Dummy hp: 2 günlüğe yazılır, ardından kukla kaybolur. Sonra “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // armor düşüldükten sonra kalan amount kadar (en az 1) can kaybet, kalan canı logla, 0 olduğunda nesneyi yok et
    }
}

Fizik ve Oynanış bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground