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

Unity'de Mobil İvmeölçer Kullanımı: Input.acceleration

Paylaşan: Unity Eğitim 28 November 2025 10 dakika okuma 80 görüntülenme

Giriş: Mobil Oyunlarda İvmeölçer Önemi

Mobil oyunlar, dokunmatik ekranların yanı sıra cihazın fiziksel sensörlerini kullanarak daha zengin ve sürükleyici deneyimler sunar. Bu sensörlerden biri de ivmeölçerdir. Unity geliştiricileri için Input.acceleration, bu veriye kolayca erişmenin anahtarıdır. Bu makalede, Unity ivmeölçer kullanımı hakkında derinlemesine bilgi edinecek, temelden ileri seviyeye kadar farklı kullanım senaryolarını ve pratik ipuçlarını keşfedeceksiniz.

İvmeölçer, bir cihazın uzaydaki doğrusal ivmesini (hızlanma) ölçen bir sensördür. Cihazın hareketini algılaması sayesinde, oyunlarda karakter kontrolünden menü navigasyonuna, hatta puzzle çözümlerine kadar geniş bir yelpazede kullanılabilir. Özellikle yarış oyunlarında direksiyon kontrolü, top yuvarlama oyunlarında topun yönlendirilmesi gibi dinamik etkileşimler için vazgeçilmezdir. Bu makale, mobil oyunlarınızda Input.acceleration verisini etkili bir şekilde nasıl kullanacağınızı adım adım açıklayacaktır.

Input.acceleration Nedir?

Unity'de Input.acceleration, cihazın ivmesini bir Vector3 yapısı olarak döndürür. Bu Vector3, her bir eksen (X, Y, Z) üzerindeki ivme değerini temsil eder. Bu değerler m/s² birimindedir ve cihazın kendi yerel koordinat sistemine göre ölçülür. Yerçekimi kuvveti de bu okumalara dahil olduğu için, cihaz sabit dururken bile (örneğin masanın üzerinde) Z ekseninde yaklaşık -9.81 m/s² gibi bir değer görebilirsiniz. Bu, cihazın aşağı doğru 'hızlandığını' gösteren yerçekimi etkisidir.

Koordinat Sistemi

  • X Ekseni: Cihazın sağ tarafına doğru ivmeyi temsil eder. (Sağa eğim pozitif X)
  • Y Ekseni: Cihazın üst tarafına doğru ivmeyi temsil eder. (Yukarı eğim pozitif Y)
  • Z Ekseni: Cihazın ekranından dışa doğru ivmeyi temsil eder. (Ekrandan uzaklaşma pozitif Z)

Bu koordinat sistemi, cihazın dikey tutulduğu (portre modu) varsayılarak genellikle geçerlidir. Cihazın yönüne bağlı olarak bu eksenler değişebilir, bu yüzden test etmek önemlidir.

Temel Kullanım

Input.acceleration verisine erişmek oldukça basittir. Genellikle bir MonoBehaviour sınıfının Update() metodunda bu veriyi okuruz:

using UnityEngine;

public class AccelerationReader : MonoBehaviour
{
    void Update()
    {
        Vector3 acceleration = Input.acceleration;
        Debug.Log("İvme: " + acceleration);

        // Örnek: Bir GameObject'i ivmeye göre hareket ettirme
        // transform.Translate(acceleration * Time.deltaTime * moveSpeed);
    }
}

Yukarıdaki örnekte, her karede cihazın ivme verisi alınıp konsola yazdırılmaktadır. moveSpeed gibi bir çarpan ekleyerek, ivme verisini oyun nesnesinin hareketine dönüştürebilirsiniz. Ancak, bu ham veriyi doğrudan kullanmak genellikle istenmeyen sonuçlar doğurur çünkü sensör verileri genellikle 'gürültülü'dür (ani ve küçük dalgalanmalar içerir).

İvmeölçer Verilerini Anlamak ve İşlemek

Ham ivme verileri, cihazın küçük titreşimleri, kullanıcının elindeki titremeler veya sensörün kendi iç gürültüsü nedeniyle oldukça dalgalı olabilir. Bu dalgalanmaları azaltmak ve daha pürüzsüz bir kontrol sağlamak için veri işleme teknikleri kullanmak önemlidir. Bu, Unity ivmeölçer kullanımında başarının anahtarlarından biridir.

Gürültü Azaltma: Düşük Geçiren Filtre (Low-Pass Filter)

Düşük geçiren filtre, sensör verilerindeki ani değişiklikleri yumuşatarak daha istikrarlı bir okuma elde etmenizi sağlar. Bu filtre, mevcut okuma ile önceki okumalar arasında bir ortalama alarak çalışır. Alfa (alpha) değeri, filtrenin ne kadar agresif olacağını belirler: daha yüksek bir alpha, daha hızlı tepki veren ancak daha az filtrelenmiş bir sonuç; daha düşük bir alpha ise daha yavaş tepki veren ancak daha pürüzsüz bir sonuç verir.

using UnityEngine;

public class FilteredAcceleration : MonoBehaviour
{
    public float lowPassFilterFactor = 0.1f; // 0 ile 1 arası değer
    private Vector3 filteredAcceleration;

    void Start()
    {
        // Başlangıç ivme değerini alarak filtreyi başlat
        filteredAcceleration = Input.acceleration;
    }

    void Update()
    {
        // Düşük geçiren filtre uygulama
        filteredAcceleration = Vector3.Lerp(filteredAcceleration, Input.acceleration, lowPassFilterFactor);

        Debug.Log("Filtrelenmiş İvme: " + filteredAcceleration);

        // Örnek: Bir topu hareket ettirme
        // float horizontal = filteredAcceleration.x;
        // float vertical = filteredAcceleration.y;
        // Vector3 moveDirection = new Vector3(horizontal, 0, vertical);
        // GetComponent<Rigidbody>().AddForce(moveDirection * moveSpeed);
    }
}

Bu kod bloğu, Vector3.Lerp kullanarak basit bir düşük geçiren filtre uygular. lowPassFilterFactor değerini ayarlayarak filtrenin hassasiyetini kontrol edebilirsiniz.

Cihaz Kalibrasyonu ve Yeniden Kalibrasyon

İvmeölçer verileri, cihazın tutulduğu başlangıç pozisyonuna göre değişebilir. Örneğin, bir oyuncu telefonu hafifçe eğik tutarak oynamaya başlayabilir. Bu durumda, oyunun "sıfır" veya "düz" olarak algıladığı pozisyon, oyuncunun gerçekte düz tuttuğu pozisyondan farklı olabilir. Bu sorunu çözmek için oyun içi kalibrasyon mekanizmaları sunmak faydalıdır.

Kullanıcı, oyunu başlatırken veya belirli bir tuşa basarak cihazı "düz" olarak kabul ettiği pozisyonda tutar ve bu anlık ivme değeri referans (sıfır noktası) olarak kaydedilir. Daha sonraki tüm okumalar bu referans değerine göre ayarlanır (çıkarılır). Böylece, oyuncunun başlangıç pozisyonu ne olursa olsun, relatif hareketler doğru bir şekilde algılanır. Bu, daha hassas ve kullanıcı dostu bir Unity ivmeölçer kullanımı deneyimi sağlar.

Pratik İpuçları

İpucu 1: Gürültüyü Azaltın: Düşük Geçiren Filtre Uygulaması

Yukarıda bahsedildiği gibi, ivmeölçer verileri gürültülü olabilir. Oyununuzda pürüzsüz ve tahmin edilebilir bir kontrol sağlamak için düşük geçiren filtre kullanmak esastır. Filtre faktörünü (lowPassFilterFactor) oyununuzun gereksinimlerine göre ayarlayın. Hızlı tepki gerektiren oyunlar için daha yüksek bir faktör (örn: 0.2-0.3), daha yumuşak hareketler için daha düşük bir faktör (örn: 0.05-0.1) tercih edilebilir. Bu, Unity ivmeölçer kullanımında en önemli adımlardan biridir.

İpucu 2: Kullanıcı Odaklı Kalibrasyon Mekanizması

Oyuncular farklı pozisyonlarda oynayabilirler. Oyununuzun başlangıcında veya menüde bir 'Kalibre Et' düğmesi sunarak, oyuncunun cihazı o anki ideal 'düz' pozisyonuna getirmesini sağlayın. Bu anlık Input.acceleration değerini bir referans olarak kaydedin ve sonraki tüm ivme okumalarından bu referansı çıkarın. Bu, oyuncuya daha kişiselleştirilmiş ve rahat bir kontrol deneyimi sunar.

using UnityEngine;

public class CalibratedAcceleration : MonoBehaviour
{
    public float lowPassFilterFactor = 0.1f;
    private Vector3 filteredAcceleration;
    private Vector3 calibrationOffset;
    private bool isCalibrated = false;

    void Start()
    {
        // Başlangıçta kalibrasyon yapılana kadar filtreyi başlat
        filteredAcceleration = Input.acceleration;
    }

    void Update()
    {
        // Filtreleme her zaman yapılır
        filteredAcceleration = Vector3.Lerp(filteredAcceleration, Input.acceleration, lowPassFilterFactor);

        Vector3 currentAcceleration = filteredAcceleration;

        if (isCalibrated)
        {
            // Kalibre edilmiş ivmeyi hesapla
            currentAcceleration -= calibrationOffset;
        }

        Debug.Log("Kalibre Edilmiş İvme: " + currentAcceleration);
    }

    // Kalibrasyon butonuna basıldığında çağrılacak metod
    public void CalibrateDevice()
    {
        calibrationOffset = filteredAcceleration; // Filtrelenmiş değeri referans al
        isCalibrated = true;
        Debug.Log("Cihaz kalibre edildi. Offset: " + calibrationOffset);
    }

    // Kalibrasyonu sıfırlamak için (isteğe bağlı)
    public void ResetCalibration()
    {
        isCalibrated = false;
        calibrationOffset = Vector3.zero;
        Debug.Log("Kalibrasyon sıfırlandı.");
    }
}

İpucu 3: Editörde Test ve Hata Ayıklama Yaklaşımları

Mobil sensörlerle çalışırken en büyük zorluklardan biri, Unity Editor'da doğru bir şekilde test yapmanın zorluğudur. Cihazınızda test etmek en doğrusu olsa da, her küçük değişiklik için derleyip cihazınıza aktarmak zaman alıcı olabilir. Bunun yerine, Unity Remote uygulamasını kullanarak cihazınızın girdilerini editöre aktarabilir veya basit bir klavye/fare simülasyonu yazarak ivmeölçer verilerini taklit edebilirsiniz.

Örneğin, klavye ok tuşlarını kullanarak ivmeölçer hareketini simüle eden bir kod yazabilirsiniz:

using UnityEngine;

public class EditorAccelerationSimulator : MonoBehaviour
{
    public float simulationSpeed = 1.0f;
    private Vector3 simulatedAcceleration = Vector3.zero;

    void Update()
    {
        #if UNITY_EDITOR
        // Editörde klavye ile ivme simülasyonu
        if (Input.GetKey(KeyCode.LeftArrow)) simulatedAcceleration.x = -simulationSpeed;
        else if (Input.GetKey(KeyCode.RightArrow)) simulatedAcceleration.x = simulationSpeed;
        else simulatedAcceleration.x = Mathf.Lerp(simulatedAcceleration.x, 0, Time.deltaTime * 5);

        if (Input.GetKey(KeyCode.DownArrow)) simulatedAcceleration.y = -simulationSpeed;
        else if (Input.GetKey(KeyCode.UpArrow)) simulatedAcceleration.y = simulationSpeed;
        else simulatedAcceleration.y = Mathf.Lerp(simulatedAcceleration.y, 0, Time.deltaTime * 5);

        // Z ekseni için PageUp/PageDown veya Q/E kullanılabilir
        if (Input.GetKey(KeyCode.Q)) simulatedAcceleration.z = simulationSpeed;
        else if (Input.GetKey(KeyCode.E)) simulatedAcceleration.z = -simulationSpeed;
        else simulatedAcceleration.z = Mathf.Lerp(simulatedAcceleration.z, 0, Time.deltaTime * 5);

        Vector3 acceleration = simulatedAcceleration;
        #else
        // Cihazda gerçek ivmeölçer verisi
        Vector3 acceleration = Input.acceleration;
        #endif

        Debug.Log("Kullanılan İvme: " + acceleration);
        // Bu 'acceleration' değerini oyun logic'inizde kullanın
    }
}

Bu yöntem, geliştirme sürecini hızlandırır ve Unity ivmeölçer kullanımı entegrasyonunda hata ayıklamayı kolaylaştırır.

Yaygın Hatalar ve Çözümleri

Hata 1: Filtreleme Yapmadan Doğrudan Veri Kullanımı

Hata: Input.acceleration'dan gelen ham veriyi doğrudan oyun nesnelerinin hareketine uygulamak, titrek ve kontrol dışı bir deneyime yol açar.

Çözüm: Her zaman düşük geçiren filtre gibi bir yumuşatma tekniği kullanın. Bu, sensör gürültüsünü azaltır ve daha pürüzsüz, daha tahmin edilebilir bir kontrol sağlar. İpucu 1'deki kod örneği bu çözüm için idealdir.

Hata 2: Yerçekimi ve İvme Ayrımını Göz Ardı Etmek

Hata: Input.acceleration, cihazın hareket ivmesinin yanı sıra yerçekimini de içerir. Cihaz sabit dururken bile yerçekimi nedeniyle bir değer okuması olacaktır (genellikle Z ekseninde -9.81 m/s² civarı). Bu, çoğu zaman istenmeyen bir etkidir.

Çözüm: Eğer sadece cihazın kullanıcı tarafından yapılan hareketini algılamak istiyorsanız, yerçekimi etkisini veriden çıkarmanız gerekir. Bu, cihazı düz bir zeminde tutarken alınan ilk okumayı bir referans olarak kaydedip, sonraki okumalardan bu referansı çıkararak yapılabilir (kalibrasyon). Alternatif olarak, bazı durumlarda sadece hareketin yönünü normalized ivme vektörü ile almak yeterli olabilir.

Hata 3: Farklı Cihazlarda Tutarsız Davranışlar

Hata: Farklı mobil cihaz modelleri, farklı kalitede sensörlere ve farklı işletim sistemi sürümlerine sahip olabilir, bu da ivmeölçer verilerinde tutarsızlıklara yol açabilir.

Çözüm: Oyununuzu mümkün olduğunca çok farklı cihazda test edin. Filtreleme faktörlerini ve hareket hassasiyetini ayarlanabilir hale getirin veya oyun içinde oyuncuların kendi hassasiyet ayarlarını yapmasına olanak tanıyın. Kalibrasyon mekanizması sunmak da bu tutarsızlıkları gidermeye yardımcı olur.

Performans ve Optimizasyon Notları

  • Gereksiz Hesaplamalardan Kaçının: İvmeölçer verisini her karede almak ve işlemek genellikle sorun yaratmaz, ancak Update() içinde karmaşık ve yoğun hesaplamalar yapmaktan kaçının.
  • Sadece Gerektiğinde Kullanın: Eğer oyununuzun belirli bir bölümünde ivmeölçer kullanımına ihtiyacınız yoksa, ilgili scriptleri veya sensör okuma mantığını devre dışı bırakarak CPU ve pil tüketimini optimize edebilirsiniz.
  • Filtreleme Optimizasyonu: Düşük geçiren filtre gibi algoritmaları mümkün olduğunca basit tutun. Aşırı karmaşık filtreler performans düşüşüne neden olabilir. Vector3.Lerp gibi Unity'nin dahili fonksiyonları genellikle iyi optimize edilmiştir.

Sonuç

Input.acceleration, Unity'de mobil cihazların ivmeölçer yeteneklerinden yararlanmak için güçlü bir araçtır. Ham veriyi anlamak, filtreleme ve kalibrasyon gibi tekniklerle işlemek, oyunlarınıza dinamik ve sürükleyici bir kontrol katmanı eklemenizi sağlar. Bu makaledeki bilgiler ve ipuçları sayesinde, Unity ivmeölçer kullanımı konusunda sağlam bir temel oluşturacak ve mobil oyunlarınız için yenilikçi etkileşimler tasarlayabileceksiniz. Unutmayın, en iyi sonuçlar için her zaman farklı cihazlarda test yapmak ve oyuncu geri bildirimlerine açık olmak önemlidir.

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