Can ve Hasar
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 53 / 63.
Hasar sistemi için iki betik gerekir. Health betiği, hasar alabilecek her nesnenin üzerinde bulunur ve can puanlarını yönetir; hasar veren nesne bu betiği bulup üzerindeki bir yöntemi çağırır. İşte üç darbeden sonra 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 onu çağırabilir 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, sınıfının adını taşıyan kendi dosyasında bulunur.
GetComponent<Health>(), zemin gibi Health betiği olmayan nesneler için null döndürür; bu yüzden dikenler çağrı yapmadan önce kontrol eder. TryGetComponent(out Health health), aramayı ve kontrolü tek bir çağrıda yapar: yalnızca bir Health betiği varsa true döndürür ve health değişkenini doldurur.
Görev
OrtaBir eğitim silahı bir mankene ve zırhlı bir şövalyeye ateş ediyor. Silah üzerindeki Shooter betiği hazır: sol ve sağ oklar silahı döndürüyor, Boşluk tuşu ise bir Bullet ateşliyor. İsabetlerin hasar vermesini sağlayan iki betiği yaz.
Manken ve Şövalye üzerindeki Health (hp ve armor değerlerini Inspector belirler):
- Herkese açık bir
TakeDamage(int amount)metodu:hp,amounteksiarmorkadar azalır; ancak azalma her zaman en az 1 olur. - Her isabetten sonra nesnenin adını ve kalan hp değerini
Dummy hp: 2biçiminde günlüğe yaz. - hp 0 veya altına indiğinde nesneyi yok et.
Her merminin üzerindeki Bullet (damage değerini Inspector 2 olarak belirler):
- Mermi, üzerinde bir Health bulunan bir şeye çarptığında, onun
TakeDamage(damage)metodunu çağır. - Neye çarparsa çarpsın, duvar da dahil, mermiyi yok et.
Play'e bas, mankeni ve şövalyeyi devir, ardından Check'e bas.
Kendin dene
using UnityEngine;
public class Health : MonoBehaviour
{
[SerializeField] private int hp = 4;
[SerializeField] private int armor = 0;
public void TakeDamage(int amount)
{
// amount eksi armor kadar (en az 1) can kaybet, kalan canı kayda geçir, 0'da yok et
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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 Duvar3Tetikleyiciler
Tetikleyici ÇarpıştırıcılarOnTriggerEnterToplanabilir NesnelerÖlüm BölgeleriGiriş ve ÇıkışÖzet: Anahtar ve Kapı6Işın Atışları
Physics.RaycastRaycastHitIşınla Zemin KontrolüKatmanlar ve LayerMaskGörüş HattıOverlapSphere ve SphereCastTekrar: Lazerli Alarm Teli9Düşmanlar
Oyuncuyu Takip EtMenzil İçinde TakipDevriye ve TakipCan ve HasarGeri SavurmaTekrar: Bekçi Köpeği