Unity Mobil Giriş: Joystick ve Swipe Kontrolleri

Unity'de sanal joystick ve swipe (kaydırma) kontrollerini nasıl uygulayacağınızı öğrenin. Mobil oyunlarınız için akıcı ve sezgisel bir kullanıcı deneyimi yaratın.

Giriş: Mobil Oyunlarda Kontrolün Önemi

Mobil oyunlar, dokunmatik ekranların sunduğu benzersiz etkileşim olanakları sayesinde dünya çapında milyonlarca oyuncuya ulaşıyor. Ancak bu platformda başarılı olmak için oyun kontrollerinin sezgisel, akıcı ve kullanıcı dostu olması büyük önem taşır. Klavyeden veya gamepad’den farklı olarak, mobil cihazlarda oyuncuların ekrana doğrudan dokunarak etkileşim kurması gerekir. Bu makalede, Unity Mobil Giriş sistemini kullanarak en yaygın iki mobil kontrol yöntemini; sanal joystick ve swipe (kaydırma) kontrollerini detaylı bir şekilde inceleyeceğiz. Bu kontrolleri nasıl uygulayacağınızı, karşılaşılabilecek sorunları ve performans ipuçlarını öğrenerek mobil oyunlarınızın kullanıcı deneyimini zirveye taşıyabileceksiniz.

Sanal Joystick Kontrolleri

Sanal joystick, karakter hareketini veya kamera kontrolünü sağlamak için mobil oyunlarda sıklıkla kullanılan bir yöntemdir. Oyuncular, ekran üzerindeki sanal bir çubuğu sürükleyerek yönlendirme yaparlar. Unity’de bu sistemi oluşturmak için UI (Kullanıcı Arayüzü) elemanlarını ve EventSystem‘ı kullanırız.

Temel Konseptler

Bir sanal joystick genellikle iki ana UI elemanından oluşur: joystick’in hareket edebileceği alanı belirten bir arka plan (Background) ve oyuncunun sürüklediği kol (Handle). Bu elemanlar bir Canvas üzerinde konumlandırılır. Dokunmatik etkileşimleri yakalamak için Unity’nin EventSystem arayüzlerinden yararlanırız. Özellikle IPointerDownHandler, IDragHandler ve IPointerUpHandler arayüzleri, dokunma başlangıcını, sürüklemeyi ve dokunma sonunu tespit etmek için idealdir.

Joystick Uygulaması (Kod Örneği)

Bir joystick oluşturmak için öncelikle bir Canvas ve iki adet Image UI elemanı oluşturmalısınız. Biri arka plan, diğeri ise kol için. Kolu arka planın bir alt objesi olarak ayarlayın. Ardından, aşağıdaki gibi bir C# betiği oluşturup joystick arka planına ekleyebilirsiniz:


using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class VirtualJoystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
    [SerializeField] private Image joystickBackground; // Joystick'in arka planı
    [SerializeField] private Image joystickHandle;     // Joystick'in kolu
    [SerializeField] private float joystickRange = 1f; // Kolun hareket mesafesi

    private Vector2 inputVector; // Joystick'ten gelen yön vektörü
    private Vector2 joystickCenter; // Joystick'in merkez pozisyonu

    public Vector2 InputVector => inputVector;

    void Start()
    {
        // Joystick'in merkez pozisyonunu başlangıçta alıyoruz
        // RectTransform'ın pivot noktasının merkezde (0.5, 0.5) olduğundan emin olun.
        joystickCenter = joystickBackground.rectTransform.anchoredPosition;
        joystickHandle.rectTransform.anchoredPosition = Vector2.zero;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        // Dokunma başladığında joystick'i aktif hale getir
        OnDrag(eventData);
    }

    public void OnDrag(PointerEventData eventData)
    {
        Vector2 currentPos;
        // Dokunma pozisyonunu lokal koordinatlara dönüştür
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
            joystickBackground.rectTransform, eventData.position, eventData.pressEventCamera,
            out currentPos))
        {
            // Merkezden dokunma pozisyonuna olan vektörü hesapla
            Vector2 direction = currentPos - joystickCenter;

            // Vektörün uzunluğunu kontrol et ve belirlenen aralıkta tut
            float magnitude = direction.magnitude;
            if (magnitude > joystickRange)
            {
                direction = direction.normalized * joystickRange;
            }

            // Kolu yeni pozisyona taşı
            joystickHandle.rectTransform.anchoredPosition = direction;

            // Yön vektörünü normalize et ve dışarıya ver
            inputVector = direction / joystickRange;
        }
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        // Dokunma bittiğinde kolu merkeze geri getir ve yön vektörünü sıfırla
        joystickHandle.rectTransform.anchoredPosition = Vector2.zero;
        inputVector = Vector2.zero;
    }
}

Bu betik sayesinde, InputVector özelliğinden joystick’in yönünü alabilir ve karakterinizi hareket ettirmek için kullanabilirsiniz. Örneğin, bir karakter kontrolcüsünde FixedUpdate metodu içinde transform.Translate(joystick.InputVector * moveSpeed * Time.fixedDeltaTime); gibi bir kod ile karakterinizi hareket ettirebilirsiniz. Bu, etkili bir Unity Mobil Giriş yöntemidir.

Swipe (Kaydırma) Kontrolleri

Swipe kontrolleri, genellikle menülerde gezinme, kamera döndürme veya hızlı özel yetenekleri tetikleme gibi durumlarda kullanılır. Oyuncunun parmağını ekran üzerinde belirli bir yöne sürüklemesiyle tetiklenirler.

Temel Konseptler

Swipe tespiti için bir dokunmanın başlangıç pozisyonu ve bitiş pozisyonu arasındaki farkı hesaplamamız gerekir. Ayrıca, yanlışlıkla yapılan dokunmaları (tap) swipe’tan ayırmak için minimum bir mesafe eşiği ve bazen de maksimum bir süre eşiği belirlemek önemlidir. Unity’nin Input.GetTouch metodu, mobil dokunma verilerini almak için kullanılır.

Swipe Uygulaması (Kod Örneği)

Aşağıdaki betik, basit bir swipe tespiti yaparak hangi yöne kaydırıldığını belirler:


using UnityEngine;

public class SwipeDetector : MonoBehaviour
{
    private Vector2 touchStartPos;
    private Vector2 touchEndPos;

    [SerializeField] private float minSwipeDistance = 50f; // Minimum swipe mesafesi (piksel)
    [SerializeField] private float maxSwipeTime = 0.5f;   // Maksimum swipe süresi (saniye)

    private float touchStartTime;
    private bool touchMoved;

    void Update()
    {
        // Sadece tek dokunma varsa kontrol et
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            switch (touch.phase)
            {
                case TouchPhase.Began:
                    touchStartPos = touch.position;
                    touchStartTime = Time.time;
                    touchMoved = false;
                    break;

                case TouchPhase.Moved:
                    touchMoved = true;
                    break;

                case TouchPhase.Ended:
                    touchEndPos = touch.position;
                    float swipeTime = Time.time - touchStartTime;
                    float swipeDistance = Vector2.Distance(touchStartPos, touchEndPos);

                    if (swipeDistance > minSwipeDistance && swipeTime < maxSwipeTime)
                    {
                        DetectSwipeDirection(touchStartPos, touchEndPos);
                    }
                    break;
            }
        }
    }

    void DetectSwipeDirection(Vector2 startPos, Vector2 endPos)
    {
        Vector2 swipeVector = endPos - startPos;

        if (Mathf.Abs(swipeVector.x) > Mathf.Abs(swipeVector.y))
        {
            // Yatay swipe
            if (swipeVector.x > 0) Debug.Log("Sağa Swipe!");
            else Debug.Log("Sola Swipe!");
        }
        else
        {
            // Dikey swipe
            if (swipeVector.y > 0) Debug.Log("Yukarı Swipe!");
            else Debug.Log("Aşağı Swipe!");
        }
    }
}

Bu betik, ekran üzerindeki ilk dokunmayı takip eder ve belirli bir mesafe ve süre içinde bir yöne doğru hareket ettiğinde bunu bir swipe olarak algılar. Bu sayede Unity Mobil Giriş ile farklı oyun mekaniklerini kolayca tetikleyebilirsiniz.

Pratik İpuçları ve En İyi Uygulamalar

1. Hassasiyet Ayarı ve Eşik Değerler

Hem joystick hem de swipe kontrolleri için hassasiyet ayarları kritik öneme sahiptir. Joystick için bir ‘ölü bölge’ (dead zone) belirleyerek küçük parmak hareketlerinin istenmeyen girişlere neden olmasını engelleyebilirsiniz. Swipe için ise minSwipeDistance ve maxSwipeTime değerlerini oyununuzun dinamiklerine göre ayarlayın. Çok düşük bir mesafe, hafif dokunmaları swipe olarak algılayabilirken, çok yüksek bir mesafe oyuncuyu zorlayabilir.

2. Görsel Geri Bildirim ve Kullanıcı Deneyimi

Kullanıcıya dokunmatik girdinin algılandığını gösteren görsel geri bildirimler sağlamak, kullanıcı deneyimini artırır. Joystick hareket ettirildiğinde kolun görsel olarak hareket etmesi veya bir swipe yapıldığında kısa bir animasyonun veya ses efektinin tetiklenmesi, oyuncunun kontrolü üzerinde daha fazla hissetmesini sağlar. Bu, Unity Mobil Giriş deneyimini güçlendirir.

3. Çoklu Dokunma Yönetimi

Mobil cihazlar genellikle birden fazla dokunmayı aynı anda algılayabilir. Oyununuzda hem joystick hem de başka bir eylem (örneğin ateş etme veya zıplama) için butonlar varsa, bu iki eylemi aynı anda gerçekleştirebilmek önemlidir. Input.touchCount ile birden fazla dokunmayı takip edebilir ve her bir dokunmayı ayrı ayrı işleyebilirsiniz. Örneğin, ilk parmak joystick’i kontrol ederken, ikinci parmak ekranın sağ tarafındaki bir butona basabilir.

Yaygın Hatalar ve Çözümleri

Dokunma Alanı Sorunları

Hata: Joystick kolu, arka planın dışına çıkıyor veya swipe alanı çok küçük kalıyor.
Çözüm: Joystick kolunun pozisyonunu arka planın boyutlarına göre kısıtlayın (Yukarıdaki kodda joystickRange ile yapılmıştır). Swipe için ise algılama alanını (eğer bir UI elemanı ile sınırlıysa) yeterince geniş tuttuğunuzdan emin olun. UI elemanlarının RectTransform ayarlarını, farklı ekran boyutlarına uyacak şekilde doğru bir şekilde yapılandırın (Anchors ve Pivot kullanımı).

Performans Düşüşleri

Hata: Mobil cihazlarda oyun yavaş çalışıyor veya takılıyor.
Çözüm: Update metodu içinde çok yoğun hesaplamalar yapmaktan kaçının. Özellikle Input.GetTouch çağrılarını sadece gerekli olduğunda (Input.touchCount > 0 ise) yapın. UI elemanlarının yeniden çizilmesini minimize edin. Eğer karakter hareketi fizik tabanlı ise (Rigidbody kullanıyorsa), hareket kodunu FixedUpdate içinde çalıştırmak daha tutarlı sonuçlar verir. Unity Mobil Giriş sistemini verimli kullanmak önemlidir.

Çapraz Platform Uyumsuzluğu

Hata: Kontroller farklı ekran boyutları ve çözünürlüklerde beklendiği gibi çalışmıyor.
Çözüm: Unity’nin Canvas Scaler bileşenini kullanarak UI’nızın farklı ekran boyutlarına otomatik olarak uyum sağlamasını sağlayın. Genellikle Scale With Screen Size modunu kullanmak ve referans bir çözünürlük belirlemek iyi bir başlangıçtır. Joystick ve butonların Anchors ayarlarını ekranın belirli bir köşesine veya kenarına sabitleyin.

Performans ve Optimizasyon Notları

Mobil oyunlarda her karede yapılan işlem miktarı performansı doğrudan etkiler. Input.GetTouch yerine EventSystem arayüzlerini (IPointerDownHandler vb.) kullanmak, Unity’nin dahili optimizasyonlarından faydalanmanızı sağlayabilir. Ayrıca, her karede yeni Vector2 veya Vector3 objeleri oluşturmaktan kaçının; mümkünse mevcut objeleri güncelleyin. Bellek ayırmayı (garbage collection) azaltmak için sık sık çalışan metotlarda nesne oluşturmaktan kaçınmak, özellikle eski mobil cihazlarda akıcılığı artıracaktır. Fizik motorunu kullanan hareketlerde, Update yerine FixedUpdate kullanarak fizik döngüsüyle senkronize çalışın. Bu yaklaşımlar, Unity Mobil Giriş sisteminizin daha sorunsuz çalışmasına yardımcı olur.

Sonuç

Unity’de sanal joystick ve swipe kontrollerini uygulamak, mobil oyunlarınızın temel etkileşimini oluşturmanın ilk adımıdır. Doğru tasarım ve optimize edilmiş kod ile oyuncularınıza sezgisel ve keyifli bir deneyim sunabilirsiniz. Bu makalede ele aldığımız temel prensipleri, kod örneklerini ve ipuçlarını kullanarak kendi mobil oyunlarınızda güçlü ve esnek Unity Mobil Giriş sistemleri geliştirmeye başlayabilirsiniz. Unutmayın, iyi bir kontrol şeması, mobil oyununuzun başarısında kilit rol oynar!

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir