
Unity’de Can Barı(Health Bar) Nasıl Yapılır?
Oyun geliştirirken oyuncuya en temel bilgileri görsel olarak aktarmamız gerekir. Bunların başında da can (health) sistemi gelir. Oyuncunun ne kadar hasar aldığını, ne zaman tehlikede olduğunu veya ne zaman iyileştiğini anlamasını sağlayan en yaygın yöntem ise can barı kullanmaktır.
Can Barı Nedir ve Neden Önemlidir?
Can barı, karakterin mevcut sağlığını görsel olarak gösteren bir UI öğesidir.
İyi tasarlanmış bir can barı:
- Oyuncuya anlık geri bildirim verir
- Oyun içi kararları etkiler
- Kullanıcı deneyimini güçlendirir
Can Barı Yapımı
Şimdi 3 tane script oluşturacağız bunların birincisi can barı görünümünü ayarlamak için ikinicisi karakterin sağlığinı tutacağız üçüncüsü bu ikisi arasında bir köprü yapacağız. Korkmanıza gerek yok çok kod yazmayacağız. Niye ayırdık derseniz mimaride mantğına göre UI ile etkileşime giren kod ile karakterin sağlık verileri düzenleyen kodun ayrı olması gerekiyor. Sonradan eklenecek özellikler için temiz kod yapısı gerekli. mimari aşaiğıdaki gibi olucak.
PlayerHealth
└─ OnHealthChanged(int)
└─ OnMaxHealthChanged(int)
↓
HealthBarController
↓
HealthBar
↓
Slider
Sahnemizde bir tane boş obje (Create Empty) oluşturuyoruz ve içine iki tane image ekliyoruz bir tanesi arkaplanı diğeri canımımızı temsil edecek

Şimdi PlayerHealtBar kısmına gelip Inspector’dan Slider companent’i ekliyoruz. Slider içerisinden Interactable ve Transition kapatabiliriz onlarla işimiz yok. Fill Rect kısmınıda canımız olacak image’ı ekliyoruz.

Aslında UI ile işimiz bitti tabi süslemek size kalmış ben bir image daha ekleyip sprite’nı kalp yapıp sola ekledim böylece kalp simgemizde olmuş oldu.

Şimdi kod kısımlarına geçebiliriz. HealthBar adında bir bir script oluşturup içine girelim. Aşağıda kodu yazalım.

public void Awake()
{
slider = GetComponent<Slider>();
if (slider == null)
{
Debug.LogWarning("HealthBar script requires Slider component");
}
}
Burada olan şey Awake olduğunda yani oyun başlamadan hemen önce bu script’in takılı olduğu PlayerHealthBar içerisindeki Slider bileşenini alır. Slider bileşeni olup olmadığını kontrol eder eğer yok ise Console’da hata meseajı verir.
public void SetMaxHealth(int health)
{
slider.maxValue = health;
slider.value = health;
}
Slider üst sınırı belirtir ve onu başlamadan max yapar.
public void SetHealth(int health)
{
slider.value = health;
}
Oyuncu hasar olduğunda ve iyileştiğinde bar günceller
İkinci script’imize geçiyoruz

public int maxHealth;
public int currentHealth;
Oyuncunun maksimum sağlığını ve o anki sağlığını tutacak iki tane değişken yazıyoruz
public UI.HealthBar healthBar;
HealthBar kodunu refenrans ediyoruz
void Start()
{
currentHealth = maxHealth;
healthBar.SetMaxHealth(maxHealth);
}
Oyun başlar karakterin canı tam dolu başlar
UI ile oyun ilk kez burada senkron olur
Eğer bu yapılmazsa Slider yanlış başlar Ya boş görünür ya da rastgele bir değerde olur.
if (Input.GetKeyDown(KeyCode.K))
{
TakeDamage(20);
}
Bu tamamen test amaçlı K tuşuna basıldığında oyuncu hasar alıyormuş gibi davranır
public void TakeDamage(int damage)
{
currentHealth -= damage;
currentHealth = Mathf.Max(currentHealth, 0);
healthBar.SetHealth(currentHealth);
}
Gerçek can düşürülür. Alt sınır korunur .UI’ya bilgi gönderilir.
currentHealth += damage;
currentHealth = Mathf.Min(currentHealth, maxHealth);
healthBar.SetHealth(currentHealth);
Damage matnığını tersi çalışır.
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.GetComponent<Heal>())
{ HealDamage(20);
Destroy(collision.gameObject);
}
}
Karakter eğer heal objesine çarpar ise canını arttır ve objeyi sil demek.Tam terside Damage içinde geçerli.
if (collision.gameObject.GetComponent<Enemy.Enemy>())
{ TakeDamage(20);
Destroy(collision.gameObject);
}
Tamamdır bu kısmıda bitti.
Son kısıma geçebilriz köprümüzü yapmaya

[SerializeField] private HealthBar healthBar;
private PlayerHealth playerHealth;
Yazdığım önceki ik kodu alalım
void Start()
{
playerHealth = GetComponent<PlayerHealth>();
if (playerHealth == null)
{
Debug.LogError("PlayerHealth component not found!"); return;
} }
PlayerHealth scripti var mı onun kontrollünü sağlıyor
private void UpdateMaxHealth(int maxHealth){ healthBar.SetMaxHealth(maxHealth);
}
private void UpdateHealth(int currentHealth){ healthBar.SetHealth(currentHealth);
}
Oyunda maksimum can değiştiğinde çağrılırController değeri alır UI’ya aynen iletir
Oyuncu hasar alır iyileşirPlayerHealth yeni değeri üretir Controller bunu UI’ya aktarır.
Haydi test edelim

İki farklı renkte küp oluşturdum metaryellerini kırmızı ve yeşil yaptım kırmızı olana enemy yeşil olan küplere heal scripti ekledim eğer oyuncu kırmızı küpe değer ise canı azalıcak.

iki tane kırmzı küre dokundum hasar alıp küpler yok oldu şimdi yeşil olana gidelim.

Bir tane yeşil küpe dokundum ve canım arttı.
Hepsi bu kadar aslında daha gelişebilir animasyon eklenebilir ya da Action/Event mantığı ile bir yerde aktif bir yerde pasif hale getirelenebilir. Zamanalar hasar alma veya zamanla iyilşeme özelliği yapılabilir. Bu sadece başlangıç
