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.
Görev
OrtaDarbelerin etkili olmasını sağla. Bullet hazır ve isabet ettiği nesneye TakeDamage(2) çağrısı yapıyor.
HealthiçindeTakeDamage(int amount)metodunu doldur:hpdeğerindenMathf.Max(amount - armor, 1)çıkar.- Örneğin
Dummy hp: 2olacak şekildename + " hp: " + hpifadesini günlüğe yaz. hp <= 0olduğundaDestroy(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
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir DuvarKendi başına pratik yap: Unity playground