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

Unity ile Flappy Bird Klonu: Temel Mekaniklere Derin Bakış

Paylaşan: Unity Eğitim 31 October 2025 8 dakika okuma 126 görüntülenme

Giriş: Flappy Bird Klonu Neden Önemli?

Basit ama bağımlılık yapıcı oyun mekanikleriyle Flappy Bird, mobil oyun dünyasında bir fenomen haline geldi. Bu projenin bir klonunu yapmak, Unity'nin 2D fizik, obje üretimi ve çarpışma tespiti gibi temel özelliklerini öğrenmek için mükemmel bir başlangıç noktasıdır. Bu makalede, kendi Flappy Bird klonu oyununuzu geliştirirken ihtiyacınız olacak temel mekanikleri adım adım inceleyeceğiz. Amacımız, Unity'nin sunduğu araçları kullanarak akıcı bir oyuncu hareketi, dinamik boru üretimi ve doğru çarpışma algılaması sağlamaktır.

Oyuncu Karakteri ve Hareket Mekaniği

Oyunumuzun kalbi, kuş karakterimizin hareketidir. Flappy Bird'deki kuş, sürekli yerçekimi etkisi altında aşağı düşer ve oyuncu ekrana dokunduğunda yukarı doğru bir zıplama gerçekleştirir. Bu mekaniği Unity'de uygulamak için Rigidbody2D bileşenini kullanacağız.

Oyuncu Kontrolü (PlayerController.cs)

Kuş karakterimize bir Rigidbody2D ekleyerek yerçekimi ve fiziksel kuvvetlerin etkileşimini sağlayabiliriz. Gravity Scale değerini artırarak daha hızlı bir düşüş hissi verebiliriz. Zıplama için ise AddForce metodunu kullanacağız. Fiziksel işlemlerin tutarlı olması için bu tür kuvvet uygulamalarını FixedUpdate metodu içinde gerçekleştirmek önemlidir.

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float jumpForce = 5f;
    private Rigidbody2D rb;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        // Mevcut dikey hızı sıfırlayarak her zıplamanın aynı kuvvetle başlamasını sağlarız.
        rb.velocity = Vector2.zero;
        rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
    }

    void OnCollisionEnter2D(Collision2D collision)
    {
        // Oyun bittiğinde yapılacaklar (örneğin, sahneyi yeniden yükle)
        if (collision.gameObject.CompareTag("Ground") || collision.gameObject.CompareTag("Pipe"))
        {
            Debug.Log("Game Over!");
            Time.timeScale = 0; // Oyunu durdur
            // Sahne yeniden yükleme veya oyun sonu UI gösterme burada yapılabilir.
        }
    }
}

Bu kodda, fare tıklaması veya boşluk tuşu ile kuşun zıplamasını sağlıyoruz. ForceMode2D.Impulse, anlık bir kuvvet uygulamak için idealdir. Ayrıca, kuşun yere veya borulara çarpması durumunda oyunun bitmesini sağlayan basit bir OnCollisionEnter2D metodu da ekledik. Kuşun fiziksel bir cisim gibi davranmasını istiyorsak, Rigidbody2D bileşeninin Freeze Rotation Z seçeneğini işaretlemeyi unutmayın, aksi takdirde kuş çarpmalarda dönebilir.

Boru Üretimi ve Hareket Sistemi

Flappy Bird klonu oyununda borular, oyuncunun aşması gereken temel engellerdir. Bu boruların sürekli olarak üretilmesi, ekran boyunca hareket etmesi ve belirli bir noktadan sonra yok edilmesi gerekir.

Boru Spawner (PipeSpawner.cs)

Boru üretimi için ayrı bir GameObject ve script kullanacağız. Bu script, belirli aralıklarla boru prefab'larını oluşturacak ve onları oyun alanına yerleştirecektir. Boruların dikey pozisyonları rastgele olmalıdır.

using UnityEngine;

public class PipeSpawner : MonoBehaviour
{
    public GameObject pipePrefab;
    public float spawnRate = 2f;
    public float pipeMinY = -1f;
    public float pipeMaxY = 3f;

    private float timer = 0f;

    void Update()
    {
        if (Time.timeScale == 0) return; // Oyun durdurulduysa boru üretme

        if (timer < spawnRate)
        {
            timer += Time.deltaTime;
        }
        else
        {
            SpawnPipe();
            timer = 0f;
        }
    }

    void SpawnPipe()
    {
        float randomY = Random.Range(pipeMinY, pipeMaxY);
        Vector3 spawnPos = new Vector3(transform.position.x, randomY, 0);
        Instantiate(pipePrefab, spawnPos, Quaternion.identity);
    }
}

Bu scripti yeni bir boş GameObject'e ekleyin. pipePrefab alanına, daha önce oluşturduğunuz boru prefab'ını sürükleyip bırakın. spawnRate boruların ne sıklıkla üretileceğini, pipeMinY ve pipeMaxY ise boruların dikey konumlarının hangi aralıkta rastgele seçileceğini belirler.

Boru Hareketi (PipeMovement.cs)

Üretilen boruların ekran boyunca soldan sağa hareket etmesi ve belirli bir noktadan sonra sahneden silinmesi gerekir. Bu, performansı optimize etmek ve gereksiz objelerin birikmesini önlemek için önemlidir.

using UnityEngine;

public class PipeMovement : MonoBehaviour
{
    public float moveSpeed = 2f;
    public float destroyXPos = -10f;

    void Update()
    {
        if (Time.timeScale == 0) return; // Oyun durdurulduysa hareket etme

        transform.Translate(Vector2.left * moveSpeed * Time.deltaTime);

        if (transform.position.x < destroyXPos)
        {
            Destroy(gameObject);
        }
    }
}

Bu scripti boru prefab'ınızın kök GameObject'ine ekleyin. moveSpeed boruların ne kadar hızlı hareket edeceğini, destroyXPos ise boruların bu X koordinatına ulaştığında yok edileceği noktayı belirler. Bu, ekranın sol tarafının dışında bir değer olmalıdır.

Çarpışma Tespiti ve Oyun Sonu

Kuşun borulara veya yere çarpması oyunun bitmesi anlamına gelir. Bu tespiti OnCollisionEnter2D metoduyla gerçekleştirdik (PlayerController.cs içinde). Borularınızın ve zemin objenizin Collider2D bileşenlerine sahip olduğundan ve kuşun da bir Collider2D'si olduğundan emin olun. Ayrıca, zemin ve borulara uygun tag'ler (örn. "Ground", "Pipe") atamak, çarpışan objeyi doğru bir şekilde tanımamızı sağlar.

Temel Puan Sistemi

Oyuncu her boru setini geçtiğinde puan kazanmalıdır. Bunu gerçekleştirmek için, her boru setinin ortasına bir BoxCollider2D ekleyebilir ve Is Trigger seçeneğini işaretleyebiliriz. Kuş bu tetikleyiciye girdiğinde puanı artıracağız.

// PlayerController.cs içindeki örnek
void OnTriggerEnter2D(Collider2D other)
{
    if (other.CompareTag("ScoreZone"))
    {
        // Puanı artır ve UI'da göster
        GameManager.Instance.AddScore(1);
        Debug.Log("Puan: " + GameManager.Instance.Score); // Geçici olarak konsola yazdır
        Destroy(other.gameObject); // Puanlama bölgesini yok et, tekrar puanlamayı engelle
    }
}

Burada basit bir GameManager sınıfının olduğunu varsaydık. Boru prefab'ınıza, boruların ortasına gelecek şekilde, Is Trigger işaretli yeni bir BoxCollider2D ekleyin ve Tag'ini "ScoreZone" olarak ayarlayın.

Pratik İpuçları

  1. Fizik Ayarlarıyla Oynayın: Kuşun zıplama kuvveti (jumpForce) ve yerçekimi ölçeği (Rigidbody2D'deki Gravity Scale) ile denemeler yaparak oyununuz için en iyi hissi bulun. Küçük değişiklikler bile oyunun oynanışını büyük ölçüde etkileyebilir.
  2. Prefab Varyasyonları Oluşturun: Boruların sadece dikey konumları değil, aynı zamanda aralarındaki boşluk (kuşun geçeceği alan) da rastgele olabilir. Bunun için boru prefab'ınızı oluşturan iki ayrı boru parçasını içeren bir ana prefab oluşturabilir ve bu parçaların konumlarını script üzerinden değiştirebilirsiniz.
  3. Kamera Ayarları: 2D oyunlar için genellikle Orthographic kamera kullanılır. Kameranın boyutu (Size özelliği) ve Projection ayarını yaparak oyun alanınızın nasıl göründüğünü kontrol edebilirsiniz. Kamerayı sabitlemek, oyuncu hareketine odaklanmayı kolaylaştırır.
  4. Geliştirme Hızlandırma: Oyununuzu test ederken, Time.timeScale = 0.5f; gibi bir kodla oyun hızını yavaşlatarak veya Time.timeScale = 2f; ile hızlandırarak hata ayıklama ve deneme süreçlerinizi kolaylaştırabilirsiniz.

Yaygın Hatalar ve Çözümleri

  • Tutarsız Zıplama: Oyuncu zıplamasını Update yerine FixedUpdate içinde çağırmak, fiziksel etkileşimlerin kare hızından bağımsız ve tutarlı olmasını sağlar.
  • Karakterin Dönmesi: Kuşunuzun borulara çarptığında kontrolsüzce dönmesini engellemek için Rigidbody2D bileşeninde Constraints altındaki Freeze Rotation Z seçeneğini işaretleyin.
  • Boru Üretimi Sorunları: Boruların çok sık veya çok seyrek üretilmesi, oyunun zorluğunu etkiler. spawnRate değerini iyi ayarlayın. Ayrıca, boruların ekranın dışına çıktığında yok edildiğinden emin olun (destroyXPos kontrolü).
  • Çarpışma Algılanmaması: Tüm çarpışan objelerde Collider2D bileşenlerinin olduğundan ve en az birinin Rigidbody2D'ye sahip olduğundan emin olun. Ayrıca, Is Trigger seçeneğinin doğru ayarlandığından emin olun (çarpışma için kapalı, tetikleyici için açık).

Performans ve Optimizasyon Notları

Basit bir Flappy Bird klonu gibi 2D oyunlar genellikle performans sorunları yaşamaz. Ancak, daha büyük ve karmaşık oyunlar için bazı optimizasyon teknikleri önemlidir:

  • Object Pooling: Boruları sürekli Instantiate etmek ve Destroy etmek yerine, bir havuzda önceden oluşturulmuş boruları kullanıp onları tekrar etkinleştirmek ve devre dışı bırakmak (Object Pooling), bellek tahsisini azaltarak performansı artırır.
  • Gereksiz Hesaplamalardan Kaçınma: Özellikle Update metodunda, her karede tekrar tekrar yapılması gerekmeyen pahalı hesaplamalardan kaçının.

Sonuç

Bu makalede, Unity ile kendi Flappy Bird klonu oyununuzu geliştirmeniz için gerekli temel mekanikleri öğrendiniz. Oyuncu hareketi, boru üretimi, çarpışma tespiti ve temel bir puan sistemi ile sağlam bir temel oluşturdunuz. Bu temeli kullanarak oyununuza yeni özellikler (menüler, ses efektleri, farklı kuş karakterleri, güçlendirmeler) ekleyerek kendi benzersiz deneyiminizi yaratabilirsiniz. Unutmayın, oyun geliştirmenin en iyi yolu pratik yapmaktır!

🧠 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!