UNITY 3D Multi-Touch Destekleyen Butonlar Oluşturmak

Yayınlandı: 01 Ağustos 2014 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

NOT: Unity’nin yeni UI sistemi otomatik olarak multi-touch desteklediği ve OnGUI‘ye göre daha performanslı çalıştığı için, artık OnGUI veya GUI Texture kullanmak yerine UI sistemini kullanmanızı öneririm.

Hepinize merhaba,

Unity’nin OnGUI fonksiyonuyla oluşturulan arayüz elemanları (butonlar, sliderlar vb.) ve GUI Texture‘larla oluşturulan butonlar multi-touch desteklemez. Yani diyelim ekranda iki buton varsa, bu ikisine aynı anda basamazsınız çünkü ekranda birden çok parmak olduğunda GUI elemanları düzgün çalışmazlar. Örneğin araba oyunlarında direksiyonu tutarken bir yandan da gaza basabilmek için butonlarınızın multi-touch desteklemesi gereklidir.

Bir arayüz elemanının multi-touch desteklemesi, ekrandaki parmak sayısını döndüren Input.touchCount değişkenini ve bir parmak hakkında detaylı bilgi döndüren Input.GetTouch fonksiyonunu kullanmasıyla sağlanır. Bu fonksiyon hakkında daha fazla bilgi için: https://yasirkula.com/2013/07/17/unity-ile-androide-uygulama-gelistirmek-1-dokunmatik-ekran-entegrasyonu/

A) GUI Texture İle Oluşturulan Butonlar

Elimizde public GUITexture buton; diye bir değişken olsun ve bu değişkene multi-touch desteklemesini istediğimiz GUI Texture objesi değer olarak verilmiş olsun.

Eğer GUI Texture’a dokunulduğu anda bir kodun tek seferlik çalışmasını istiyorsanız şu scripti kullanın:

public GUITexture buton;

void Update()
{
	for( int i = 0; i < Input.touchCount; i++ )
	{
		Touch t = Input.GetTouch( i );
		if( t.phase == TouchPhase.Began && buton.HitTest( t.position ) )
		{
			// yapılacaklar buraya
		}
	}
}

Buradaki GUITexture.HitTest fonksiyonu, parmağın ekrandaki konumu o GUITexture’un içerisindeyse (yani parmak GUITexture’a dokunuyorsa) true döndürür, yoksa false döndürür.

Eğer parmak GUI Texture’nin üzerinde olduğu sürece bir kodun çalışmasını istiyorsanız (mesela gaz pedalına dokunmak) şu scripti kullanın:

public GUITexture buton;

void Update()
{
	for( int i = 0; i < Input.touchCount; i++ )
	{
		Touch t = Input.GetTouch( i );
		if( buton.HitTest( t.position ) )
		{
			// yapılacaklar buraya
		}
	}
}

B) OnGUI Fonksiyonunda Oluşturulan Butonlar

İki çeşit GUI butonu bulunmakta: GUI.Button ve GUI.RepeatButton. İlki butona basıldığı anda tek seferlik çalışırken ikincisi butona basılı tutulduğu sürece sürekli çalışır.

Diyelim ki oyunumuzda ekranda iki buton var: gaz butonu (RepeatButton) ve kameranın açısını değiştirmeye yarayan bir buton (Button). Normalde bu iki butonu şöyle oluştururuz (bu, multi-touch desteklemeyen koddur):

void OnGUI()
{
	if( GUI.Button( new Rect( 0, 0, 200, 100 ), "Kamera Açısı" ) )
	{
		// kamera açısını değiştirmeye yarayan kod
	}

	if( GUI.RepeatButton( new Rect( 0, 150, 200, 100 ), "GAZ" ) )
	{
		// gaza basılı tutulurken yapılacak şeyler
	}
}

Bu kodu şöyle değiştirerek multi-touch desteği verebilirsiniz:

private Rect kameraButonRect;
private Rect gazButonRect;

void Start()
{
	kameraButonRect = new Rect( 0, 0, 200, 100 );
	gazButonRect = new Rect( 0, 150, 200, 100 );
}

void Update()
{
	for( int i = 0; i < Input.touchCount; i++ )
	{
		Touch t = Input.GetTouch( i );
		Vector2 parmakKonum = new Vector2( t.position.x, Screen.height - t.position.y );

		if( t.phase == TouchPhase.Began && kameraButonRect.Contains( parmakKonum ) )
		{
			// kamera açısını değiştirmeye yarayan kod
		}
		else if( gazButonRect.Contains( parmakKonum ) )
		{
			// gaza basılı tutulurken yapılacak şeyler
		}
	}
}

void OnGUI()
{
	GUI.Button( kameraButonRect, "Kamera Açısı" );
	GUI.RepeatButton( gazButonRect, "GAZ" );
}

GUITexture.HitTest‘e benzer şekilde, buradaki Rect.Contains fonksiyonu, parmağın ekrandaki konumu o butonun içerisindeyse true döndürür, yoksa false döndürür.

Bu kısa dersin sonuna geldik. Sonraki derslerde görüşmek üzere!

yorum
  1. Alp Can Marangoz dedi ki:

    Abi Ellerine sağlık ancak sürekli parmağımı kaydırmak zorunda kalıyorum,basılı tutunca harekete devam etmiyor. Başka bir projede denedim.

Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.