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

Platformer Karakter Hareketi: Yürüme, Zıplama ve Çift Zıplama

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

Giriş ve Genel Bakış

Platformer oyunlar, oyuncuların karakterlerini çeşitli engelleri aşarak veya düşmanları yenerek ilerlettiği, genellikle yatay veya dikey düzlemde hareketin ön planda olduğu oyunlardır. Bu tür oyunların temelini, akıcı ve tatmin edici bir Unity Karakter Hareketi oluşturur. Karakterin yürümesi, zıplaması ve hatta çift zıplama gibi yetenekleri, oyunun oynanış hissini doğrudan etkiler. Bu makalede, Unity motorunda 2D platformer karakterler için temel yürüme, zıplama ve çift zıplama mekaniklerini C# kullanarak adım adım nasıl uygulayacağınızı öğreneceksiniz. Hem yeni başlayanlar hem de orta seviye geliştiriciler için pratik ipuçları ve yaygın hataların çözümlerini de ele alacağız.

Unity Karakter Hareketi Temelleri: Yürüme Mekaniği

Karakterimizin yatay düzlemde hareket etmesini sağlamak, platformer oyunların ilk ve en temel adımıdır. Bunun için Unity'nin fizik motorundan faydalanacağız.

1. Rigidbody2D ve Collider Yapılandırması

Öncelikle, karakter GameObject'inize bir Rigidbody2D bileşeni eklemelisiniz. Bu bileşen, karakterinizin fizik kurallarına (yerçekimi, çarpışmalar vb.) tabi olmasını sağlar. Ayrıca, karakterinize bir Collider2D (örneğin CapsuleCollider2D veya BoxCollider2D) ekleyerek diğer fiziksel nesnelerle etkileşime girmesini sağlamalısınız. Rigidbody2D'nin Freeze Rotation Z ayarını işaretleyerek karakterinizin havada dönmesini engelleyebilirsiniz.

2. Yatay Hareket Kodu

Yeni bir C# betiği oluşturun (örn: PlayerMovement) ve karakter GameObject'inize ekleyin. Yatay hareket için kullanacağımız temel kod bloğu aşağıdaki gibidir:

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Rigidbody2D rb;
    private float moveInput;

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

    void Update()
    {
        // Yatay girdi al
        moveInput = Input.GetAxis("Horizontal");
    }

    void FixedUpdate()
    {
        // Fiziksel hareket için FixedUpdate kullanılır
        rb.velocity = new Vector2(moveInput * moveSpeed, rb.velocity.y);
    }
}

Bu kodda, Input.GetAxis("Horizontal") ile klavyeden 'A'/'D' tuşları veya sol/sağ ok tuşlarıyla yatay girdi alıyoruz. FixedUpdate içinde karakterin Rigidbody2D'sinin velocity (hız) özelliğini doğrudan ayarlayarak hareketini sağlıyoruz. moveSpeed değişkeni ile hareketin hızını kolayca ayarlayabilirsiniz. Bu temel adımlarla ilk Unity Karakter Hareketi adımı tamamlanmış olur.

Zıplama Mekaniği: Yerçekimine Karşı Koymak

Zıplama, platformer oyunların olmazsa olmazıdır. Karakterin sadece zemindeyken zıplamasını sağlamak önemlidir.

1. Zemine Değme Kontrolü

Zıplamadan önce karakterin zeminde olup olmadığını anlamamız gerekir. Bunun için Physics2D.OverlapCircle veya Raycast kullanabiliriz. Genellikle OverlapCircle daha basit bir başlangıç sunar.

Öncelikle, zemini temsil eden katmanları (layer) belirlememiz gerekiyor. Projenizdeki zemin objelerine "Ground" gibi bir layer atayın ve kodunuzda bu layer'ı referans alın.

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // ... (önceki değişkenler)
    public float jumpForce = 10f;
    public Transform groundCheck;
    public float checkRadius = 0.2f;
    public LayerMask whatIsGround;

    private bool isGrounded;

    // ... (Start ve Update fonksiyonları)

    void FixedUpdate()
    {
        // ... (yatay hareket kodu)

        // Zemine değme kontrolü
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);
    }

    void Update()
    {
        // ... (yatay girdi al)

        // Zıplama tuşu kontrolü
        if (Input.GetButtonDown("Jump") && isGrounded)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        }
    }
}

Yeni eklenen değişkenler:

  • jumpForce: Zıplama gücü.
  • groundCheck: Karakterin ayaklarının altında bir nokta belirlemek için kullanılacak boş bir GameObject (child olarak).
  • checkRadius: OverlapCircle'ın yarıçapı.
  • whatIsGround: Zemin olarak kabul edilecek katmanlar.
  • isGrounded: Karakterin zeminde olup olmadığını tutan boolean değişken.

OverlapCircle, belirli bir noktada (groundCheck.position) belirli bir yarıçap içinde (checkRadius) belirli bir katmandaki (whatIsGround) herhangi bir collider olup olmadığını kontrol eder. Eğer varsa, isGrounded doğru olur ve zıplamaya izin verilir.

Çift Zıplama (Double Jump) Uygulaması

Çift zıplama, platformer oyunlarda karakterlere ekstra hareket özgürlüğü sağlayan popüler bir mekaniktir. Bu özelliği eklemek için mevcut zıplama mantığımızı biraz genişleteceğiz.

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    // ... (önceki değişkenler)
    public int maxJumps = 2; // Kaç kez zıplayabileceğimizi belirler (1 normal zıplama + 1 çift zıplama = 2)
    private int availableJumps;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        availableJumps = maxJumps; // Başlangıçta tüm zıplamalar mevcut
    }

    void FixedUpdate()
    {
        // ... (yatay hareket kodu)

        // Zemine değme kontrolü
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, whatIsGround);

        // Zemine değince zıplamaları sıfırla
        if (isGrounded)
        {
            availableJumps = maxJumps;
        }
    }

    void Update()
    {
        // ... (yatay girdi al)

        // Zıplama tuşu kontrolü
        if (Input.GetButtonDown("Jump") && availableJumps > 0)
        {
            rb.velocity = new Vector2(rb.velocity.x, jumpForce);
            availableJumps--; // Zıplama hakkını azalt
        }
    }
}

Burada availableJumps adında yeni bir değişken ekledik. Bu değişken, karakterin kaç kez daha zıplayabileceğini takip eder. Karakter zemine değdiğinde (isGrounded olduğunda), availableJumps değeri maxJumps'a eşitlenir. Zıplama tuşuna her basıldığında ve availableJumps sıfırdan büyük olduğunda karakter zıplar ve availableJumps bir azaltılır. Bu basit ama etkili yöntemle çift zıplama mekaniğini Unity Karakter Hareketi sisteminize entegre etmiş olursunuz.

Pratik İpuçları ve En İyi Uygulamalar

1. Ayarlanabilir Parametreler ile Esneklik

Tüm hız, kuvvet, yarıçap gibi değerleri public olarak tanımlayarak veya [SerializeField] niteliğini kullanarak Unity Inspector'dan ayarlayabilir hale getirin. Bu, kodu değiştirmeden farklı hareket hisleri denemenizi sağlar ve oyun tasarım sürecini hızlandırır. Örneğin, moveSpeed, jumpForce, checkRadius gibi değişkenler.

2. Fizik İşlemleri için FixedUpdate

Fizik motoruyla ilgili tüm işlemler (Rigidbody2D'nin velocity'sini ayarlama, kuvvet uygulama, çarpışma kontrolleri gibi) FixedUpdate() fonksiyonu içinde yapılmalıdır. FixedUpdate, sabit zaman aralıklarıyla çağrılır ve bu, fizik hesaplamalarının daha tutarlı ve güvenilir olmasını sağlar. Update() ise kare hızına bağlı olarak değişen aralıklarla çağrılır ve fiziksel tutarsızlıklara yol açabilir. Girdi alma gibi non-fiziksel işlemler için Update() kullanmaya devam edin.

3. Coyote Time ve Jump Buffer

Daha akıcı bir Unity Karakter Hareketi deneyimi için ileri seviye iki teknik: Coyote Time ve Jump Buffer.

  • Coyote Time: Karakter zeminden ayrıldıktan sonra kısa bir süre (örn: 0.1 saniye) daha zıplamasına izin veren bir mekaniktir. Bu, oyuncuların platformun kenarından düşerken bile zıplayabilmesini sağlayarak daha affedici ve doğal bir his verir.
  • Jump Buffer: Oyuncunun zıplama tuşuna zemine değmeden hemen önce basması durumunda, karakter zemine değdiği anda otomatik olarak zıplamasını sağlayan bir mekaniktir. Bu, oyuncunun zıplama zamanlamasını tam olarak tutturamasa bile zıplamanın gerçekleşmesini garantiler ve gecikme hissini ortadan kaldırır.

Bu mekanikleri uygulamak, birkaç zamanlayıcı ve boolean değişken eklemeyi gerektirir, ancak oyuncu deneyimini önemli ölçüde iyileştirir.

Yaygın Hatalar ve Çözümleri

1. Yanlış Zemine Değme Algılama

OverlapCircle veya Raycast kullanırken, whatIsGround katman maskesini doğru ayarladığınızdan emin olun. Karakterin kendisinin veya diğer etkileşimli objelerin bu katmanda olmaması gerekir. Aksi takdirde, karakter kendi collider'ı ile etkileşime girerek sürekli zeminde sanabilir veya farklı objelerden yanlış sinyal alabilir. Yalnızca zemin olarak kabul ettiğiniz objeleri bu katmana atayın.

2. Fiziksel Gecikme ve Tutarsızlıklar

Yukarıda da belirtildiği gibi, Rigidbody2D ile ilgili işlemleri Update() yerine FixedUpdate() içinde yapmak, fiziksel hareketin daha tutarlı ve öngörülebilir olmasını sağlar. Özellikle düşük kare hızlarında bu fark daha belirginleşir.

3. Karakterin Duvarlara Yapışması

Karakterinizin yanlara doğru hareket ederken duvarlara yapıştığını veya yavaşladığını fark ederseniz, bunun nedeni genellikle sürtünmedir. Bu sorunu çözmek için:

  • Karakterinizin Collider2D'sine bir Physics Material 2D atayın ve Friction (Sürtünme) değerini 0'a veya çok düşük bir değere ayarlayın.
  • Alternatif olarak, Rigidbody2D bileşeninin Linear Drag değerini kontrol edin. Bu değer, karakterin hareketine karşı uygulanan hava direncini simüle eder.

Performans ve Optimizasyon Notları

Büyük ve karmaşık sahnelerde veya mobil platformlarda çalışırken performansı göz önünde bulundurmak önemlidir.

  • GetComponent Çağrıları: GetComponent, nispeten maliyetli bir işlemdir. Start() veya Awake() fonksiyonlarında bir kez çağırarak gerekli bileşen referanslarını (örn: Rigidbody2D) önbelleğe alın ve daha sonra tekrar tekrar çağırmaktan kaçının.
  • Fizik Sorguları: Physics2D.OverlapCircle veya Raycast gibi fizik sorgularını yalnızca gerektiğinde çağırın. Örneğin, her karede değil, sadece zıplama kontrolü yapıldığında veya belirli aralıklarla. Ancak zemine değme kontrolü genellikle her FixedUpdate'te yapılmalıdır, bu yüzden burada bir optimizasyon genellikle gerekmez.
  • LayerMask Kullanımı: LayerMask kullanarak fizik sorgularının yalnızca belirli katmanlardaki nesneleri kontrol etmesini sağlamak, gereksiz hesaplamaları azaltır ve performansı artırır.

Sonuç

Bu makalede, Unity'de platformer karakterler için yürüme, zıplama ve çift zıplama gibi temel Unity Karakter Hareketi mekaniklerini nasıl uygulayacağınızı öğrendiniz. Rigidbody2D kullanımı, zemine değme algılama ve çift zıplama mantığı ile oyunlarınıza akıcı ve eğlenceli bir hareket sistemi ekleyebilirsiniz. Unutmayın, oyun geliştirme sürekli deneme ve yanılma sürecidir. Kendi oyununuzun dinamiklerine en uygun hareket hissini bulmak için parametrelerle oynamaktan çekinmeyin. Başarılar dileriz!

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