İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Unity 2D Oyunda Karakter Hareketi Nasıl Yapılır?

unity-2d-oyunda-karakter-hareketi-nasil-yapilir
Bu yazıda neler var?
  1. Hareketin temel akışı: girdi, hareket ve çarpışma
  2. Koddan önce sahne ve bileşenleri hazırla
  3. Hız temelli mi, fizik tabanlı mı? Update ve FixedUpdate ayrımı
  4. Rigidbody2D ile yatay hareket için C# örneği
  5. Karakter hareket etmiyorsa üç kontrol noktası
  6. Eksen, yön ve hareket yöntemi hatalarını çöz
  7. Sık Sorulan Sorular

Unity 2D oyunda karakter hareketi nasıl yapılır? Yatay klavye girdisini oku, seçtiğin hareket yöntemine göre karakterin hızını ya da Rigidbody2D üzerinden fizik hareketini güncelle ve çarpışma sorumluluğunu 2D fizik sistemine bırak. Collider2D temas alanını tanımlar, Rigidbody2D ise nesneyi fizik simülasyonuna bağlar.

Girdiyi, hareketi ve çarpışmayı ayrı görevler olarak kurduğunda oyuncu komutu ile sahne fiziği birbirine karışmaz. Böylece hangi davranışın koddan, hangisinin bileşen ayarlarından geldiğini daha kolay izleyebilirsin.

Hareketin temel akışı: girdi, hareket ve çarpışma

Yatay girdiyi bir yön işareti olarak ele al: sola hareket negatif, durma sıfır, sağa hareket pozitif olabilir. Bir koşul, bu işarete göre sola gitme, durma veya sağa gitme kararını verir; hareket katmanı da bu kararı hız ya da fizik gövdesi güncellemesine çevirir. Çarpışma gerçekleştiğinde karakterin konumunu elle düzeltmeye çalışmak yerine, Collider2D şeklinin ve Rigidbody2D davranışının sahne kurallarıyla birlikte çalışmasına izin ver.

Bu akış, programlama dilinden bağımsız algoritmik düşünmenin küçük bir örneğidir: girdiyi al, işareti yorumla, koşul kararını ver, hareketi uygula ve sonucu gözlemle. Bu adımları farklı problem türlerinde pekiştirmek için Algoritmik Düşünme Testi çözebilirsin.

Koddan önce sahne ve bileşenleri hazırla

Koddan önce sahne ve bileşenleri hazırla

Koddan önce Sahne içindeki nesneleri ve bileşenleri kontrol et. Karakter hareketi yalnızca bir script yazmaktan ibaret değildir; görsel nesne, temas alanı ve fizik gövdesi aynı hareket modelinde buluşmalıdır. Collider2D temas alanını, Rigidbody2D ise nesnenin fizik simülasyonundaki davranışını belirler.

  • Karakter GameObject'i: Hareket scriptinin hangi ana nesneyi yönettiğini netleştir. Böylece girdi okuyan kod ile fizik hareketinin aynı karakter yapısını takip etmesi kolaylaşır.
  • Görsel bileşenin bağlı olduğu nesne: SpriteRenderer gibi 2D görsel bileşenin karakter nesnesine veya onun görsel alt nesnesine bağlı olduğunu kontrol et. Görsel ile fizik gövdesi farklı hiyerarşilerde kalırsa ekrandaki görüntü ve hareket birbirinden ayrılabilir.
  • Karakterin Collider2D bileşeni: Temas alanını karakterin gövdesini makul biçimde çevirecek şekilde ayarla. Bu şekil, zemin ve duvarla hangi alanın temas edeceğini belirler.
  • Karakterin Rigidbody2D bileşeni: Hareketin uygulanacağı fizik gövdesini ekle ve seçtiğin Body Type davranışını dikkate al. Bu bileşen, karakteri 2D fizik simülasyonuna bağlar.
  • Sahnede varsa zemin ve duvar yüzeyleri: Platform, zemin ve duvar gibi hareketsiz yüzeylerde uygun Collider2D bileşenlerinin bulunduğunu kontrol et. Sadece görünen bir yüzey, tek başına karakterin çarpışacağı fizik şeklini oluşturmaz.
  • Inspector fizik ayarları: Body Type, Gravity Scale, Collision Detection, Simulated ve Constraints içindeki Freeze Rotation gibi alanları bağlama göre gözden geçir. Bu ayarlar yerçekimine tepkiyi, çarpışma algılamasını, simülasyona katılımı ve dönme kısıtını etkileyebilir.

Platform oyununda yerçekimi ve dönme ayarlarını düşme, zıplama ve yüzey temasına göre; üstten görünümlü harekette ise yerçekimi ve dönme davranışını serbest yönlü hareket hedefiyle birlikte değerlendir. Bu nedenle her proje için tek bir Inspector reçetesi uygulama.

Hız temelli mi, fizik tabanlı mı? Update ve FixedUpdate ayrımı

Yatay kontrolün doğrudan ve kolay ayarlanabilir olmasını istiyorsan hız temelli yaklaşım, ivmelenme, momentum veya geri tepme gibi etkileri öne çıkarmak istiyorsan fizik tabanlı yaklaşım daha uygundur. Hız temelli yöntemde yatay hızı doğrudan belirlersin. Fizik tabanlı yöntemde Rigidbody2D üzerine kuvvet ya da darbe uygularsın; kütle, yer çekimi ve çarpışmalar hareketin sonucunu etkiler.

Yaklaşım Uygulama biçimi Uygun senaryo Dikkat noktası
Hız temelli Rigidbody2D.linearVelocity içindeki X bileşenini, girdi ile hareket hızının çarpımı olarak doğrudan belirle. Yatay kontrolün hızlı ve kolay ayarlanabilir olması gereken platform oyunlarındaki karakterler. X'i değiştirirken Y'yi koru. Aksi hâlde düşme veya zıplama davranışı etkilenebilir.
Fizik tabanlı Rigidbody2D.AddForce veya kısa süreli bir darbe uygula; fizik motoru hız değişimini hesaplar. İvmelenme, momentum, geri tepme veya ağırlık hissi gereken karakterler. Kütle, yer çekimi, sönüm ve kuvvet büyüklüğü sonucu etkiler. Sürekli kuvvette tepki kademeli değişebilir.

Girdiyi okumak ile fizik hareketini uygulamak aynı görev değildir. Update her karede çağrılır; bu örnekte kullanıcı girdisi burada okunur. FixedUpdate fizik döngüsünün sabit aralıklarla çalışan bölümüdür; Rigidbody2D hızı veya kuvveti burada uygulanır. Örneğin Update içinde horizontalInput değerini günceller, FixedUpdate içinde bu değeri linearVelocity içindeki X bileşenine yazarsın.

Örnekte kodu kısa tutmak için yerleşik Input Manager'daki Input.GetAxis("Horizontal") çağrısı seçildi. Bu API'nin çalışması için proje ayarındaki etkin giriş sistemi ile kullandığın yaklaşım eşleşmelidir. Projede Horizontal ekseni farklı adlandırılmışsa kodda aynı adı kullan; Input System kullanıyorsan horizontalInput değerini tanımladığın yatay action'dan okuyabilirsin. Etkin sistemi Edit > Project Settings > Player içindeki Active Input Handling alanından, eksen tanımlarını ise Input Manager ayarlarından kontrol edebilirsin.

Rigidbody2D ile yatay hareket için C# örneği

Rigidbody2D ile yatay hareket için C# örneği

Aşağıdaki C# betiği hız temelli yatay hareketi uygular. Karakter nesnesinde bir Rigidbody2D bulunduğu kabul edilir. Betik, bileşeni GetComponent<Rigidbody2D>() ile alır, girdiyi Update içinde saklar ve fizik hareketini FixedUpdate içinde uygular. Yalnızca X bileşeni değiştirilir.

using UnityEngine;

public class PlayerMovement2D : MonoBehaviour
{
    public float moveSpeed = 5f;

    private Rigidbody2D rb;
    private float horizontalInput;

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

    private void Update()
    {
        horizontalInput = Input.GetAxis("Horizontal");
    }

    private void FixedUpdate()
    {
        Vector2 currentVelocity = rb.linearVelocity;
        float targetHorizontalSpeed = horizontalInput * moveSpeed;

        currentVelocity.x = targetHorizontalSpeed;
        rb.linearVelocity = currentVelocity;
    }
}

Yatay girdi pozitifken targetHorizontalSpeed pozitif olur ve karakter pozitif X yönüne, yani sağa hareket eder. Girdi negatifken karakter sola gider. Girdi değeri sıfır olduğunda X hızı sıfırlanır ve yatay hareket durur. currentVelocity.y değiştirilmediği için mevcut dikey hız korunur; böylece yer çekimiyle düşme veya zıplama sürerken yatay kontrol uygulanabilir.

Karakter hareket etmiyorsa üç kontrol noktası

Karakter hareket etmiyorsa önce koddan önce sahnede doğru nesneye doğru bileşenlerin eklenip eklenmediğini kontrol et.
  1. Scriptin doğru nesneye eklenmesi ve etkinliği: Play modunda karakteri Hierarchy'den seç. Inspector'da hareket scriptinin bu nesneye bağlı ve etkin, karakter GameObject'inin de üst nesneleriyle birlikte aktif olduğunu kontrol et. Değilse scripti taşı veya nesneyi etkinleştir.
  2. Collider2D, Rigidbody2D ve fizik ayarları: Karakterin Collider2D ve Rigidbody2D bileşenlerine sahip olduğunu, Body Type'ın seçilen yönteme uygun, Simulated seçeneğinin açık ve Constraints altında X konumunun dondurulmamış olduğunu gözle. Fiziksel çarpışma bekleniyorsa Is Trigger'ın yanlışlıkla açık olmadığını kontrol et; eksik bileşeni ekle, gövde tipini düzelt veya X kısıtını kaldır.
  3. Input yapılandırması ve Console hataları: Yatay değer Play modunda hep 0 kalıyorsa input yaklaşımını kodla eşleştir. Klasik Input.GetAxis("Horizontal") çağrıları için Edit > Project Settings > Input Manager içinde eksen adını ve tuş eşleşmesini kontrol et. Input System action'ları kullanıyorsan Active Input Handling seçiminin kodla uyumlu ve action adının doğru olduğunu doğrula. Window > General > Console yolundan Console'u açıp hata kaydını seçerek ayrıntı ve stack trace'i incele.

Eksen, yön ve hareket yöntemi hatalarını çöz

Yatay yerine dikey eksen veya yanlış action okunuyorsa

Belirti: Sağ ve sol tuşlarına bastığında karakter dikey hareket eder, hiç tepki vermez veya yatay değer sıfırda kalır.

Olası neden: Kod X yerine Y bileşenini güncelliyor olabilir. Klasik Input Manager'da Horizontal yerine Vertical okunması, Input System'de action adının veya bağının farklı olması aynı sonucu doğurabilir.

Düzeltme: Yatay eksen veya action değerini hız ya da konum vektörünün X bileşenine uygula. Y bileşenini yer çekimi veya zıplama için ayrı yönetiyorsan hareket kodunda üzerine yazma.

Sağ ve sol işareti ya da görsel yön tersse

Belirti: Sağa bastığında karakter sola gider veya sprite'ın yüzü hareketin ters yönüne döner.

Olası neden: Pozitif ve negatif yatay değerler ile görselin başlangıç yönü aynı kabule dayanmıyor olabilir. Input işaretini kodda ters çevirip sprite'ı da tekrar ters çevirmek çift yön değişimine yol açar.

Düzeltme: Sahne X ekseninde pozitif değeri sağ, negatif değeri sol kabul et ve tuş veya action eşleşmesini buna göre düzenle. Sprite ters bakıyorsa yalnızca görsel dönüşünde bir kez yön değiştir.

Transform, Rigidbody2D, Update ve FixedUpdate karıştırılıyorsa

Belirti: Karakter titrer, duvarın içine girer, çarpışmayı yok sayar veya hareket hızı tutarsız görünür.

Olası neden: Aynı nesnenin konumu hem Transform hem de Rigidbody2D üzerinden yazılıyor olabilir. Fizik hareketinin Update içinde uygulanması ya da kuvvet ile doğrudan hızın aynı eksende birlikte değiştirilmesi de çakışma oluşturabilir.

Düzeltme: Rigidbody2D kullanıyorsan hareketi onun API'siyle sürdür, girdiyi Update içinde alıp fiziksel değişikliği FixedUpdate içinde yap. MovePosition seçtiysen çağrıyı da fizik güncellemesinde gerçekleştir. Kuvvet tabanlı veya doğrudan hız tabanlı tek bir yaklaşım seç ve aynı gövdeyi ayrıca Transform ile taşıma.

Benzer hata ayıklama ve programlama konularını sürdürmek için Berk Akademi blog arşivindeki programlama yazılarını inceleyebilirsin.

Sık Sorulan Sorular

Unity 2D karakter hareketinde Collider2D ile Rigidbody2D'nin görevleri nasıl ayrılır?

Collider2D çarpışmada kullanılacak şekli tanımlar. Rigidbody2D ise nesnenin fizik simülasyonuna katılmasını ve hareket, hız, kuvvet davranışını yönetir. Fizik tabanlı bir karakterde genellikle birlikte kullanılırlar. Simulated kapalıysa bağlı collider'lar simülasyona katılmaz.

Yatay klavye girdisi okunuyor ancak karakter neden hareket etmeyebilir?

Yatay değer değişiyorsa input aşaması çalışıyor olabilir; sorun hareket aşamasında aranmalıdır. Scriptin etkin nesneye bağlı olduğunu, doğru Rigidbody2D'nin kullanıldığını, X hareketinin kısıtlanmadığını ve Simulated seçeneğinin açık olduğunu kontrol et. Body Type seçilen hareket yöntemiyle uyumlu olmalı, Console'da da derleme veya çalışma zamanı hatası kalmamalıdır.

Rigidbody2D kullanan harekette Update ve FixedUpdate nasıl ayrılmalıdır?

Genel olarak girdiyi Update içinde okuyup yatay değeri saklamak, Rigidbody2D'ye hız, kuvvet veya MovePosition uygulamasını FixedUpdate içinde yapmak uygun bir ayrımdır. Update görüntülenen karelerle, FixedUpdate fizik adımlarıyla ilişkilidir ve çağrı sayıları aynı olmak zorunda değildir.

Girdiyi, sahnedeki bileşenleri ve fizik güncellemesini ayrı ayrı gözlemleyerek seçtiğin hareket yöntemini tutarlı biçimde sürdürebilirsin.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara