Mobil oyunlar, günümüz oyun endüstrisinin en büyük segmentlerinden birini oluşturuyor ve bu oyunların temel etkileşim mekanizması dokunmatik ekranlar. Unity ile mobil oyun geliştirirken, kullanıcı girdilerini doğru ve verimli bir şekilde işlemek hayati önem taşır. Bu makalede, Unity’nin mobil dokunmatik girdileri işlemek için sunduğu anahtar metodlardan biri olan Input.GetTouch() metodunu detaylıca inceleyeceğiz. Oyunlarınızda akıcı ve sezgisel bir Unity dokunmatik kontrol sistemi kurmak için ihtiyacınız olan her şeyi burada bulacaksınız.
Unity’de Mobil Dokunmatik Kontrolün Temelleri
Input.GetTouch() metodu, belirli bir dokunuşun (parmak) bilgilerini almak için kullanılır. Bu metod, masaüstü platformlardaki Input.GetMouseButton() veya Input.mousePosition gibi fare girdisi metodlarından farklı olarak, mobil cihazların çoklu dokunmatik özelliklerini tam olarak destekler. Bir ekrana aynı anda birden fazla parmakla dokunulduğunda, her bir dokunuş ayrı bir Touch yapısı olarak işlenir ve bu yapılar aracılığıyla dokunuşun konumu, fazı (durumu), parmak kimliği gibi bilgilere erişilebilir.
Bir dokunuşun temel özellikleri şunlardır:
fingerId: Her dokunuşa atanan benzersiz kimlik. Bu, aynı parmağın hareketini takip etmek için kullanılır.position: Dokunuşun ekran koordinatlarındaki (piksel) konumu.phase: Dokunuşun mevcut durumu. Bu,TouchPhaseenum’u ile belirtilir veBegan,Moved,Stationary,Ended,Canceleddeğerlerini alabilir.deltaPosition: Bir önceki kare ile mevcut kare arasındaki dokunuş konumundaki değişiklik. Genellikle sürükleme işlemleri için kullanılır.deltaTime: Bir önceki kare ile mevcut kare arasındaki zaman farkı.
Basit Bir Dokunuş Algılama
Herhangi bir dokunuş olup olmadığını kontrol etmek için Input.touchCount özelliğini kullanırız. Bu özellik, o an ekrana dokunan parmak sayısını verir. Eğer Input.touchCount sıfırdan büyükse, en az bir dokunuş vardır.
void Update()
{
if (Input.touchCount > 0)
{
// İlk dokunuşu al
Touch touch = Input.GetTouch(0);
// Dokunuşun fazını kontrol et
if (touch.phase == TouchPhase.Began)
{
Debug.Log("Ekrana dokunuldu! Konum: " + touch.position);
}
}
}
Yukarıdaki örnekte, ekrana ilk dokunulan parmağın (index 0) bilgilerini alıyor ve dokunuşun yeni başladığı (TouchPhase.Began) anı tespit ediyoruz. Bu, bir butona basma veya bir objeye tıklama gibi tekil etkileşimler için idealdir.
Çoklu Dokunuşları Yönetme
Mobil oyunlarda genellikle birden fazla parmakla etkileşim (örneğin yakınlaştırma/uzaklaştırma veya iki parmakla hareket) gerekir. Input.GetTouch() metodunu bir döngü içinde kullanarak tüm dokunuşları işleyebilirsiniz:
void Update()
{
if (Input.touchCount > 0)
{
for (int i = 0; i < Input.touchCount; i++)
{
Touch touch = Input.GetTouch(i);
// Her bir dokunuşun fazını ve konumunu kontrol et
if (touch.phase == TouchPhase.Began)
{
Debug.Log("Parmak " + touch.fingerId + " dokunmaya başladı: " + touch.position);
}
else if (touch.phase == TouchPhase.Moved)
{
Debug.Log("Parmak " + touch.fingerId + " hareket ediyor: " + touch.deltaPosition);
}
else if (touch.phase == TouchPhase.Ended)
{
Debug.Log("Parmak " + touch.fingerId + " dokunmayı bitirdi.");
}
}
}
}
Bu döngü, ekrandaki her bir dokunuşu ayrı ayrı ele almamızı sağlar. fingerId özelliğini kullanarak her bir parmağı benzersiz bir şekilde tanımlayabilir ve böylece karmaşık çoklu dokunuş hareketlerini (örneğin pinch-to-zoom) uygulayabiliriz. Unity dokunmatik kontrol geliştirirken bu yaklaşım size büyük esneklik sağlar.
Pratik İpuçları
1. UI Etkileşimlerini Yönetme
Oyun dünyasındaki objelerle etkileşim kurarken, dokunuşun bir UI elementi üzerinde olup olmadığını kontrol etmek önemlidir. Unity’nin Event System’i, bu tür durumları yönetmek için harika bir yol sunar. Eğer bir dokunuş bir UI elementi üzerindeyse, oyun dünyasındaki objeleri etkilememesi gerekir.
using UnityEngine.EventSystems;
void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)
{
// Dokunuşun bir UI elementi üzerinde olup olmadığını kontrol et
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
Debug.Log("UI elementi üzerinde dokunuldu.");
return; // UI'yı etkileyecekse devam etme
}
// Oyun dünyasındaki objelerle etkileşim...
Debug.Log("Oyun dünyasına dokunuldu: " + touch.position);
}
}
}
2. Sürükle ve Bırak (Drag & Drop) İşlemleri
Touch.deltaPosition özelliğini kullanarak objeleri sürüklemek oldukça kolaydır. Bu özellik, bir dokunuşun önceki kareden bu kareye ne kadar hareket ettiğini piksel cinsinden verir.
void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Moved)
{
// Ekran koordinatlarını dünya koordinatlarına dönüştürme
Vector2 deltaWorldPos = Camera.main.ScreenToWorldPoint(touch.deltaPosition) -
Camera.main.ScreenToWorldPoint(Vector2.zero);
// Objenin pozisyonunu güncelle
transform.position += (Vector3)deltaWorldPos;
}
}
}
Bu örnek, bir objeyi parmağınızla sürükleyerek hareket ettirmenizi sağlar. ScreenToWorldPoint dönüşümü, ekran piksel hareketini oyun dünyası birimlerine çevirmek için önemlidir.
3. Dokunuşları Filtreleme ve Belirli Eylemleri Tetikleme
TouchPhase enum’unu etkili bir şekilde kullanarak sadece belirli dokunuş durumlarında kod çalıştırmak, kontrol sisteminizi daha temiz ve hatasız yapar. Örneğin, bir butona basma işlemi sadece TouchPhase.Began fazında, sürükleme işlemi TouchPhase.Moved fazında, bırakma işlemi ise TouchPhase.Ended fazında tetiklenmelidir.
void HandleTouch(Touch touch)
{
switch (touch.phase)
{
case TouchPhase.Began:
// Objeyi seç, basma animasyonunu başlat
Debug.Log("Basıldı: " + touch.fingerId);
break;
case TouchPhase.Moved:
// Objeyi sürükle, karakteri hareket ettir
Debug.Log("Hareket etti: " + touch.fingerId + ", Delta: " + touch.deltaPosition);
break;
case TouchPhase.Ended:
// Objeyi bırak, butonu serbest bırak
Debug.Log("Bırakıldı: " + touch.fingerId);
break;
case TouchPhase.Canceled:
// Dokunuş kesintiye uğradı (örn. arama geldi)
Debug.Log("İptal edildi: " + touch.fingerId);
break;
case TouchPhase.Stationary:
// Parmak sabit duruyor
// Debug.Log("Sabit: " + touch.fingerId);
break;
}
}
void Update()
{
if (Input.touchCount > 0)
{
for (int i = 0; i < Input.touchCount; i++)
{
HandleTouch(Input.GetTouch(i));
}
}
}
Yaygın Hatalar ve Çözümleri
1. Input.touchCount Kontrolünü Atlamak
Hata: Doğrudan Input.GetTouch(0) veya Input.GetTouch(i) çağırmak, ekranda dokunuş yokken hata fırlatabilir.
Çözüm: Her zaman Input.touchCount > 0 kontrolünü yapın. Çoklu dokunuşlarda ise döngüyü Input.touchCount ile sınırlayın.
2. Fare ve Dokunmatik Girdileri Karıştırmak
Hata: Mobil oyun geliştirirken Input.GetMouseButton() veya Input.mousePosition kullanmak, bu metodlar dokunmatik girdileri fare girdisi olarak yorumladığı için beklenmedik davranışlara yol açabilir. Özellikle Unity Editor’da test yaparken bu durum kafa karıştırıcı olabilir.
Çözüm: Mobil platformlarda sadece Input.GetTouch() ve ilgili metodları kullanın. Eğer hem fare hem de dokunmatik kontrolü desteklemek istiyorsanız, platforma özel kod blokları (örneğin #if UNITY_EDITOR veya #if UNITY_ANDROID) kullanın ya da her iki girdi tipini de işleyecek genel bir sistem tasarlayın.
3. TouchPhase Göz Ardı Etmek
Hata: Dokunuşun fazını kontrol etmeden her karede aynı işlemi yapmak, çift tetikleme veya yanlış davranışlara neden olabilir.
Çözüm: Her eylem için doğru TouchPhase‘i kullandığınızdan emin olun. Örneğin, bir objeyi sadece dokunuş başladığında seçmek için TouchPhase.Began kullanın.
4. fingerId Yerine Doğrudan İndeks Kullanmak
Hata: Çoklu dokunuşlarda, her zaman Input.GetTouch(0) ve Input.GetTouch(1) gibi sabit indeksler kullanmak, parmakların ekrandan kalkıp tekrar basıldığında veya sırası değiştiğinde yanlış parmağı takip etmenize neden olabilir.
Çözüm: Çoklu dokunuşları takip ederken her parmağın benzersiz fingerId‘sini depolayın ve bu ID’yi kullanarak belirli bir parmağı takip edin. Bu, daha karmaşık Unity dokunmatik kontrol senaryolarında tutarlılık sağlar.
Performans ve Optimizasyon Notları
Input.GetTouch() ve ilgili metodlar genellikle oldukça optimize edilmiştir. Ancak büyük ölçekli oyunlarda veya düşük performanslı cihazlarda, bazı noktalara dikkat etmek faydalı olabilir:
- Gereksiz Hesaplamalardan Kaçının: Her
Update()döngüsünde veya her dokunuşta karmaşık matematiksel işlemler yapmaktan kaçının. ÖzellikleScreenToWorldPointgibi dönüşümler performans maliyetine sahip olabilir. - Sadece İhtiyaç Duyulduğunda Kontrol Edin: Eğer bir dokunuş olayı sadece belirli oyun durumlarında anlamlıysa, bu kontrolü sadece o durumlarda yapın.
- Bellek Ayırmayı Azaltın: Özellikle sıkça çağrılan metodlarda, her karede yeni nesneler (örneğin yeni
Vector3veyaList) oluşturmaktan kaçının. Mevcut nesneleri yeniden kullanmaya çalışın.
Unity’nin Input.GetTouch() sistemi, mobil oyunlar için güçlü ve esnek bir Unity dokunmatik kontrol altyapısı sunar. Bu makaledeki bilgiler ve ipuçları sayesinde, oyunlarınız için sezgisel ve etkileşimli dokunmatik deneyimler yaratmak için sağlam bir temele sahip olacaksınız. Unutmayın, en iyi kontrol sistemleri, oyuncunun doğal hareketlerini taklit eden ve gereksiz karmaşıklıktan kaçınan sistemlerdir.



