Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity Platformer Oyunlarında Çarpışma Hasarı ve Sağlık Sistemi

Paylaşan: Unity Eğitim 02 November 2025 7 dakika okuma 108 görüntülenme

Platformer oyunları, oyuncuların engelleri aşarken ve düşmanlarla mücadele ederken hayatta kalma becerilerini test eder. Bu hayatta kalma mücadelesinin temelini ise şüphesiz bir sağlık sistemi ve çarpışma hasarı mekanikleri oluşturur. Karakterin ne kadar dayanıklı olduğunu, ne zaman hasar alacağını ve ne zaman oyunun sona ereceğini belirleyen bu sistemler, oyuncu deneyiminin ayrılmaz bir parçasıdır. Bu makalede, Unity motorunda platformer oyunları için sağlam bir çarpışma hasarı ve sağlık sistemi nasıl oluşturulur adım adım inceleyeceğiz.

Sağlık Sistemi Temelleri: Hayatta Kalma Mekanikleri

Herhangi bir oyun karakterinin veya objesinin hayatta kalma süresini yönetmek için bir sağlık sistemine ihtiyacımız vardır. Bu sistem genellikle bir maksimum sağlık değeri (maxHealth) ve anlık sağlık değeri (currentHealth) içerir. Unity'de bu sistemi uygulamak için C# script'lerinden faydalanacağız.

Gerekli Bileşenler ve Script Yapısı

Bir objenin hasar alabilmesi ve sağlığının yönetilebilmesi için bazı Unity bileşenlerine ihtiyacı vardır:

  • Collider2D: Çarpışmaları algılamak için (örneğin BoxCollider2D, CircleCollider2D).
  • Rigidbody2D: Fizik tabanlı çarpışmalar için (Is Kinematic kapalı olmalı veya Is Trigger kullanılıyorsa fiziksel etkileşim gerekmeyebilir).
  • C# Script: Sağlık değerlerini yönetecek ve hasar alma mantığını işleyecek bir script.

Şimdi temel bir HealthManager (veya PlayerHealth) script'i oluşturalım. Bu script, karakterin sağlığını takip edecek ve hasar alma (TakeDamage) ile iyileşme (Heal) gibi temel işlevleri içerecektir. Bu, temel Unity Sağlık Sistemi'nin ilk adımıdır.


using UnityEngine;
using UnityEngine.Events;

public class HealthManager : MonoBehaviour
{
    [SerializeField] private int maxHealth = 100;
    private int currentHealth;

    public UnityEvent OnDeath;
    public UnityEvent<int> OnHealthChanged;

    void Awake()
    {
        currentHealth = maxHealth;
        OnHealthChanged?.Invoke(currentHealth); // Başlangıç sağlığını UI'a bildir
    }

    public void TakeDamage(int amount)
    {
        if (currentHealth <= 0) return; // Zaten ölmüşse tekrar hasar almasın

        currentHealth -= amount;
        currentHealth = Mathf.Max(currentHealth, 0); // Sağlık 0'ın altına düşmesin
        OnHealthChanged?.Invoke(currentHealth); // UI'ı güncelle

        if (currentHealth <= 0)
        {
            Die();
        }
    }

    public void Heal(int amount)
    {
        if (currentHealth <= 0) return; // Ölü karakter iyileşmesin

        currentHealth += amount;
        currentHealth = Mathf.Min(currentHealth, maxHealth); // Sağlık maxHealth'i geçmesin
        OnHealthChanged?.Invoke(currentHealth); // UI'ı güncelle
    }

    private void Die()
    {
        Debug.Log(gameObject.name + " öldü!");
        OnDeath?.Invoke(); // Ölüm olayını tetikle
        // GameObject'i devre dışı bırakabilir veya sahneden kaldırabiliriz
        // Destroy(gameObject);
        gameObject.SetActive(false);
    }

    public int GetCurrentHealth()
    {
        return currentHealth;
    }

    public int GetMaxHealth()
    {
        return maxHealth;
    }
}

Yukarıdaki script, basit ama işlevsel bir Unity Sağlık Sistemi çekirdeği sunar. UnityEvent'ler sayesinde, sağlık değiştiğinde veya karakter öldüğünde UI güncellemeleri veya diğer görsel/işitsel efektler gibi dış olayları kolayca tetikleyebiliriz.

Çarpışma Hasarı Uygulama: Düşmanlar ve Tuzaklar

Şimdi sıra, düşmanların veya tuzakların karaktere nasıl hasar vereceğini yönetmeye geldi. Bunun için hasar veren objelere ayrı bir script ekleyebiliriz.


using UnityEngine;

public class DamageDealer : MonoBehaviour
{
    [SerializeField] private int damageAmount = 10;
    [SerializeField] private float invincibilityDuration = 0.5f; // Hasar sonrası dokunulmazlık süresi

    private float lastDamageTime = -Mathf.Infinity;

    private void OnTriggerEnter2D(Collider2D other)
    {
        // Belirli bir tag'e sahip objelere hasar ver
        if (other.CompareTag("Player"))
        {
            // Dokunulmazlık süresi henüz bitmediyse hasar verme
            if (Time.time < lastDamageTime + invincibilityDuration)
            {
                return;
            }

            HealthManager playerHealth = other.GetComponent<HealthManager>();
            if (playerHealth != null)
            {
                playerHealth.TakeDamage(damageAmount);
                lastDamageTime = Time.time; // Son hasar alma zamanını güncelle
                // Hasar sonrası görsel/işitsel geri bildirim tetiklenebilir
            }
        }
    }

    // Eğer isterseniz OnCollisionEnter2D de kullanabilirsiniz
    // private void OnCollisionEnter2D(Collision2D collision)
    // {
    //     if (collision.gameObject.CompareTag("Player"))
    //     {
    //         // Aynı hasar mantığı burada da uygulanabilir
    //     }
    // }
}

DamageDealer script'i, objenin bir tetikleyici (Trigger) ile çarpıştığında (OnTriggerEnter2D) karaktere hasar verir. Burada önemli olan, hasar veren objenin Collider2D bileşeninde Is Trigger kutucuğunun işaretli olmasıdır. Ayrıca, karakterin GameObject'ine "Player" tag'i atamayı unutmamalıyız.

Pratik İpuçları: Sağlık Sistemini Geliştirme

1. Hasar Gecikmesi (Invincibility Frames)

Bir karakter hasar aldığında, genellikle kısa bir süre için dokunulmaz hale gelir. Bu, oyuncunun tek bir çarpışmada art arda hasar almasını engeller ve adil bir oyun deneyimi sunar. DamageDealer script'imizdeki bu mekaniği invincibilityDuration ve lastDamageTime değişkenleriyle zaten uyguladık. Karakter script'inde de bir dokunulmazlık durumu (bool isInvincible) tutularak görsel geri bildirim (karakterin yanıp sönmesi) sağlanabilir.

2. Görsel ve İşitsel Geri Bildirim

Oyuncuya hasar aldığını bildirmek çok önemlidir. Bu, karakterin rengini değiştirmek, kısa süreliğine titretmek, bir parçacık efekti (particle effect) oynatmak veya bir ses efekti çalmakla yapılabilir. HealthManager script'indeki OnHealthChanged UnityEvent'i bu tür geri bildirimleri kolayca tetiklemek için kullanılabilir.

3. Sağlık Yenileme Mekanikleri

Platformer oyunlarında genellikle toplanabilir sağlık paketleri bulunur. Bu paketler, karakterin Heal() metodunu çağırarak sağlığını artırır. Ayrıca, bazı oyunlarda belirli bir süre sonra veya bir kontrol noktasında sağlık otomatik olarak yenilenebilir. Bu tür mekanikler, Unity Sağlık Sistemi'ne derinlik katar.

Yaygın Hatalar ve Çözümleri

1. Yanlış Collider veya Trigger Kullanımı

Hata: Çarpışmaların algılanmaması veya beklenmedik fiziksel etkileşimler. Örneğin, bir hasar tetikleyicisi (trigger) olması gereken bir objede Is Trigger işaretinin unutulması.

Çözüm: Hasar veren objeler için Is Trigger seçeneğini işaretleyin. Karakterin ve hasar veren objelerin Rigidbody2D bileşenine sahip olduğundan emin olun. Karakterin Rigidbody2D'sinin Body Type'ının genellikle Dynamic, hasar veren objelerin ise Kinematic olması önerilir.

2. `tag` veya `layer` Kontrolünü Atlamak

Hata: Herhangi bir objeyle çarpışıldığında hasar alınması veya sadece belirli objelerden hasar alınması gerekirken alınmaması.

Çözüm: Hasar veren objelerin ve hasar alacak karakterin doğru tag'lere (örneğin "Player", "Enemy") sahip olduğundan emin olun. OnTriggerEnter2D veya OnCollisionEnter2D metotlarında other.CompareTag("Player") gibi kontroller kullanarak sadece istenen objelere hasar verin. İleri seviye için Unity'nin Layer Collision Matrix'ini kullanabilirsiniz.

3. Çoklu Hasar Alma (Rapid Damage)

Hata: Oyuncunun tek bir çarpışmada veya düşmanla temas halinde kaldığında saniyede birden fazla kez hasar alması.

Çözüm: Hasar gecikmesi (invincibility frames) mekaniğini uygulayın. Hasar alındıktan sonra belirli bir süre boyunca karakterin hasar almasını engelleyin. Bu, DamageDealer script'imizde uyguladığımız lastDamageTime ve invincibilityDuration ile sağlanabilir.

4. UI Güncellemesini Unutmak

Hata: Karakterin sağlığı değişiyor ama oyuncu bunu ekranda göremiyor.

Çözüm: HealthManager script'indeki OnHealthChanged UnityEvent'ini kullanarak bir UI sağlık barını veya sayısal değeri güncelleyin. Bu, oyuncuya anlık geri bildirim sağlayarak deneyimi iyileştirir.

Performans ve Optimizasyon Notları

Büyük ve karmaşık oyunlarda Unity Sağlık Sistemi'nin performansını göz önünde bulundurmak önemlidir:

  • GameObject.Find Kullanmaktan Kaçının: Özellikle Update() veya FixedUpdate() içinde sıkça GameObject.Find veya GetComponent çağırmak performansı düşürebilir. Referansları Awake() veya Start() içinde önbelleğe alın.
  • Object Pooling (Nesne Havuzlama): Eğer hasar alma efektleri (parçacıklar, kan efektleri vb.) sıkça tetikleniyorsa, bu objeleri her seferinde Instantiate edip Destroy etmek yerine bir nesne havuzlama sistemi kullanın. Bu, çöp toplama (garbage collection) yükünü azaltır.
  • Layer Collision Matrix: Unity'nin Proje Ayarları (Project Settings) > Fizik 2D (Physics 2D) altında bulunan Layer Collision Matrix'ini kullanarak, hangi katmanlardaki objelerin birbiriyle çarpışacağını belirleyebilirsiniz. Bu, gereksiz çarpışma kontrollerini önleyerek performansı artırır.

Bu makalede anlatılan adımları ve ipuçlarını kullanarak, platformer oyunlarınız için sağlam, esnek ve performansı optimize edilmiş bir çarpışma hasarı ve sağlık sistemi oluşturabilirsiniz. Unutmayın, iyi tasarlanmış bir Unity Sağlık Sistemi, oyunculara daha keyifli ve sürükleyici bir deneyim sunar.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!