Unıty Dokunma İle Hareket İşlemleri

Sosyal medyada paylaşın

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.BeganDokunmanın başladığını algılar
TouchPhase.MovedParmağın hareket ettiğini algılar
TouchPhase.CanceledBunun hakkında soru işaretleri var bende tam bilmiyorum
TouchPhase.EndedParmağın hareketinin sona erdiğini algılar
TouchPhase.StationaryParmağı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");
                }
            }
        }
    }