Bu yazıda Unity ile dokunmatik işlemlerine ve bunları nasıl kullanabileceğimize göz atacağız. Birkaç farklı yöntemi var ama ben bu yazıda Touch sınıfını örnek yaparak anlatacağım.
Touch Sınıfı
Touch sınıfı ekrana dokunan parmağın durumu açıklayan yapıdır. Parmağın dokunduğunu, kaldırıldığını, konumunu vs. açıklar. Bu sınıf genellikle karakterin hareketi için kullanılır. Ama birkaç eksi yanı var bunu yazının sonunda nedeniyle açıklayacağım.
Touch Sınıfı Nasıl Kullanılır? Örneklere beraber
Basit biçimde kullanımının daha çok olduğu kısımları anlatacağım.
Örnek1
Öncelikle bu sınıfı kullanabilmek için ‘t’ adında bir Touch nesnesi oluşturmak gerekiyor.
Touch t = Input.GetTouch(0);
GetTouch(x) bize ekrana değen x. parmakla ilgili bazı verileri döndürür.
Gelin daha iyi anlaşılması için bu sınıfı kullanarak basit bir karakter hareketi scripti yazalım.
Touch nesnemizi oluşturduk sonraki yapacağımız işlem ise ekrana dokunulduğunda hareket işlemlerini yaptırmak.
if(Input.touchCount>0)
İf bloğu ile dokunmanın başladığını bu şekilde algılayabiliriz.
void Update()
{
Touch t = Input.GetTouch(0);
if (Input.touchCount > 0)
{
transform.position += new Vector3(t.deltaPosition.x*2f*Time.deltaTime, transform.position.y, transform.position.z);
}
}
t.deltaPosition.x parmağın o anki üzerinde olduğu pixelin konumuna göre bize koordinat verir. Bu koordinatı karakterin veya bir objenin pozisyonuna atayınca dokunma ile hareketi sağlamış oluyoruz. Aynısı y ekseninde de yapabilirsiniz fakat z ekseni için geçerli değil. Çünkü dokunmayı 2 boyutta algılıyor. Bunu günümüzde çok popüler olan Swipe mekaniği için kullanabilirsiniz.
Örnek2
Öncelikle TouchPhase nedir onu açıklayalım. TouchPhase size parmağın o anki durumu hakkında bilgi verir.
TouchPhase.Began | Dokunmanın başladığını algılar |
TouchPhase.Moved | Parmağın hareket ettiğini algılar |
TouchPhase.Canceled | Bunun hakkında soru işaretleri var bende tam bilmiyorum |
TouchPhase.Ended | Parmağın hareketinin sona erdiğini algılar |
TouchPhase.Stationary | Parmağın ekranda olduğunu ama pozisyonunun değişmediğini algılar. |
Bu örnekte TouchPhase ile parmağın dokundurulduğunu, kaldırıldığını veya sabit durduğuna bakarak farklı bir yöntem ile hareket kodu yazacağız.
İlk örnekten farklı olarak önce işe 3 farklı vektör oluşturarak başlıyoruz.
Vector2 firstPressPos;
Vector2 secondPressPos;
Vector2 currentSwipe;
if (Input.touchCount > 0)
{
Touch t = Input.GetTouch(0);
if (t.phase == TouchPhase.Began)
{
firstPressPos = new Vector2(t.position.x, t.position.y);
}
TouchPhase.Began diyerek parmağın dokundurulduğu andaki pozisyonunu vektöre atıyoruz.
if (t.phase == TouchPhase.Moved)
{
secondPressPos = new Vector2(t.position.x, t.position.y);
currentSwipe = new Vector2(secondPressPos.x - firstPressPos.x, secondPressPos.y - firstPressPos.y);
currentSwipe.Normalize();
//swipe right
if (currentSwipe.x > 0)
{
Debug.Log("right swipe");
}
//swipe left
if (currentSwipe.x < 0 )
{
Debug.Log("left swipe");
}
}
Eveeeet, buralar biraz karmaşık gelebilir. Parmak hareket ettirilince tekrardan o anki parmak pozisyonunu secondPressPos adlı vektöre atıyoruz. Kod daha düzgün çalışabilsin diye burda currentSwipe adlı vektöre ihtiyaç duyduk yoksa 2 vektör ile de işimizi halledebilirdik. Benim gibi 3 değilde 2 vektör kullanarak yapmaya çalışıp sonucun nasıl değişeceğini görebilirsiniz. currentSwipe adlı vektöre ise ikinci ve birinci vektörün farkını atıyoruz. En son olarak currentSwipe adlı vektörümüzü Normalize() diyerek 0 ile 1 arasında bir değer olacak şekilde ayarlıyoruz. Peki bu atamaları neden yaptık? Sağa sola kaydırmayı currentSwipe adlı vektörün x pozisyonundan anlayacağız. Eğer sıfırdan büyükse sağa, küçükse sola kaydırma olacaktır. Bi soluklanın aşağıda daha net anlatıyorum .)
Dokunma başladığı zaman ilk vektörümüze parmak pozisyonunu atamıştık. Bu vektörün değerleri parmak kaldırılıncaya kadar değişmeyecektir. Parmak hareket halindeyken ise ikinci vektörün pozisyonuna sürekli parmağın pozsiyonunu atadık. Yeni bir vektöre ilk iki vektörün farkını atadığımız zaman yön tayini yapabilir hale geldik. Örneğin dokunmaya ekranın sağında başlayınca firstPressPos vektörünün x pozisyonu 600 olsun, sola doğru kaydırınca ise secondPressPoss adlı vektörün x pozisyonu 500,400,300,200… gibi değişecektir. Bu vektörlerin farkını currentSwipe’a atayınca x değerinin pozitif veya negatif olmasından yola çıkarak sağa veya sola doğru yön tayini yapabiliyoruz.
Debug.Log kullandığım bloklara ufak bi kod yazarak objenizi hareket ettirebilirsiniz.
Yazının başında bahsettiğim bu sınıfın olumsuz yanı ise dokunma hassasiyetinin ayarlanmasının çok zor ve cihazdan cihaza değişkenlik göstermesidir. Başka bir yazıda farklı yöntemini anlatıyor olacağım.
Size bir script daha bırakıyorum. Bunda 4 farklı (aşağı,yukarı,sağa,sola) yönü algılayabilirsiniz. Fakat bu sınıftan yararlanarak sadece X ve Y ekseninde işlem yapabiliyoruz, Z ekseni mevcut değil.
Vector2 firstPressPos;
Vector2 secondPressPos;
Vector2 currentSwipe;
void Update()
{
if (Input.touchCount > 0)
{
Touch t = Input.GetTouch(0);
if (t.phase == TouchPhase.Began)
{
firstPressPos = new Vector2(t.position.x, t.position.y);
}
if (t.phase == TouchPhase.Ended)
{
secondPressPos = new Vector2(t.position.x, t.position.y);
currentSwipe = new Vector3(secondPressPos.x - firstPressPos.x, secondPressPos.y - firstPressPos.y);
currentSwipe.Normalize();
//swipe upwards
if (currentSwipe.y > 0 && currentSwipe.x > -0.5f && currentSwipe.x < 0.5f)
{
//Debug.Log("up swipe");
}
//swipe down
if (currentSwipe.y < 0 && currentSwipe.x > -0.5f && currentSwipe.x < 0.5f)
{
//Debug.Log("down swipe");
}
//swipe left
if (currentSwipe.x < 0 && currentSwipe.y > -0.5f && currentSwipe.y < 0.5f)
{
//Debug.Log("left swipe");
}
//swipe right
if (currentSwipe.x > 0 && currentSwipe.y > -0.5f && currentSwipe.y < 0.5f)
{
//Debug.Log("right swipe");
}
}
}
}