Unity 3D Android Dokunmatik Ekran Joystick Kullanımı

Yayınlandı: 27 Mayıs 2014 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME – 17.06.2016: Bu yazıda bahsi geçen joystick scripti, performans düşmanı olan OnGUI sistemini kullanıyordu. Neyse ki artık bu script tarihin tozlu sayfalarına karışıyor; uGUI kullanan yeni versiyon için tıklayın: https://yasirkula.com/2016/06/17/unity-ui-dokunmatik-ekran-joystick-kullanimi-multi-touch-destekli/

Hepinize merhaba,

Bu yazıda sizlerle Unity 3D için hazırladığım joystick scriptini paylaşacağım. Mobil cihazlarda sanal Joystick kullanımı hakkında çok soru geldi bana ve bu yüzden bu konuda bir şeyler yapmak istedim. Bir müddet uğraşarak kendim bir script yazdım. Scriptin hem Android hem de iOS, Blackberry ve Windows Phone 8 cihazlarda çalışması lazım. Ben sadece Android’de ve Windows Phone 8’de test edebildim. Ama dikkat edin, bu script mobil cihazlar harici cihazlarda çalışmaz (yeni güncellemeyle birlikte Unity Editör’ünde de çalışıyor)!

NOT: Bu script birden çok joysticki desteklemektedir ve tüm joystickleri farklı parmaklarla, eş zamanlı olarak oynatabilirsiniz. Scripti ne kadar çok objeye component olarak atarsanız o kadar çok joystickiniz olur.

Dersi daha iyi anlamanız için bir örnek proje yaptım. İndirmek için tıklayın (hemen aşağıda projeden çekilmiş bir resim görebilirsiniz): https://www.dropbox.com/s/m0wn27ikl7qudd4/JoystickOrnek%20v2.rar?dl=0

resim

Kullanım

Şu linkteki unitypackage‘ı indirin: https://www.dropbox.com/s/l5mf5a24bwtx3av/Joystick.unitypackage?dl=0

Ardından kendi projenizi açın ve Assets-Import Package-Custom Package… yolunu izleyin. İndirdiğiniz unitypackage dosyasını seçin ve dosyaları projenize import edin.

Şimdi joysticki hangi obje(ler) için kullanmak istediğinize karar verin. Diyelim ki FPS oyun yapıyorsunuz ve joysticki karakteri hareket ettirmek için kullanacaksınız. Bu durumda Joystick.js scriptini Joystick klasöründen tutup sürükleyerek karakter objesine verin. Sonra karakteri seçin ve Inspector‘dan değişkenleri istediğiniz gibi değiştirin. Eğer dilerseniz scriptle gelen Joystick Texture‘yi Inspector’dan kendi texture’nizle değiştirebilirsiniz.

Şimdi karakterin hareket scriptinde karakteri ne zaman hareket ettirmek isterseniz bir Vector2 değişkenine GetComponent(Joystick).sonuc değişkenini kaydedin. Karakteri sağa sola hareket ettirirken bu değişkenin x değerini, ileri geri hareket ettirirken de y değerini kullanın.

Değişkenleri Tanıyalım

resim3

Joystick Texture: Bu değişkene ekranda kullanmak istediğiniz joystick’inizin resmini (texture) değer olarak veriyorsunuz. Varsayılan olarak script basit bir joystick texture’siyle beraber geliyor.

Joystick ID: Bu değişkeni sahnede birden çok Dinamik Konumlandır’ılan joystick varsa kullanın. Sahnedeki tüm dinamik joystick’lerin Joystick ID’lerinin farklı olduğundan emin olun! (Daha detaylı bilgi için Birden Çok Dinamik Joystick Olması Durumunda başlığına bakınız.)

Joystick Ebat: Burada joystick’in ekranda ne kadar yer kaplayacağını ve hareket edebileceği alanın ne kadar büyük olacağını belirliyorsunuz. Çeşitli ayarlar mevcut, neyin ne olduğunu Inspector panelindeki yeşil bilgilendirici yazıdan anlayabilirsiniz.

Hareket Ekseni: Joystiği sadece yatay eksende (Sadece X), sadece dikey eksende (Sadece Y) ya da her iki eksende de (Xve Y) oynatmayı seçebildiğiniz bir değişken. Mesela değerini Sadece X olarak verirseniz joysticki yukarı aşağı oynatamazsınız, sadece sağa sola oynatabilirsiniz.

Dinamik Konumlandır: Bu önemli bir değişken. Eğer bu seçeneği açarsanız joystick ancak ekranda bir yere tıklayınca belirir ve joystiğin merkezi ekranda tıkladığınız yer olarak ayarlanır.

Joystick Konumlandırma: Dinamik konumlandırılmayan bir joystickin ekranda nerede gösterileceğini belirlemeye yarar. Burada da çeşitli ayarlar var. Mevcut ayarın nasıl birşey olduğunu anlamak için yeşil bilgilendirici yazıyı okumanız yeterli.

sonuc: Bu public değişkenin başına @HideInInspector koydum, bu yüzden kendisini Inspector‘dan değiştiremezsiniz. Kendisini ancak Joystick.js scriptini açarsanız görebilirsiniz. Bu değişken joystickin döndürdüğü değeri depolar. Eğer joystiği tamamen yukarı kaldırırsanız değeri (0,1) olur, tamamen aşağı indirirseniz (0,-1) olur, tamamen sola kırarsanız (-1,0) olur ve tamamen sağa kırarsanız (1,0) olur. Diğer durumlarda bu Vector2‘nin x ve y değerleri -1 ile 1 arasında değişir. Anlayacağınız üzere x değeri joysticki yatay eksende oynatınca değişir ve sola kırınca negatif, sağa kırınca pozitif değer alır. y değeri de sadece joysticki dikey eksende oynatırken değişir ve yukarı oynatınca pozitif, aşağı oynatınca negatif değer alır.

Birden Çok Dinamik Joystick Olması Durumunda

Diyelim ki sahnenizde birden çok dinamik konumlandırılan joystick var. Bu durumda hangi joystickin ekranın neresine tıklayınca çıkacağını belirlemeniz gerekir ki iki dinamik joystick aynı yerde üst üste binmesin. Bunu yapmak için ise maalesef scriptte oynama yapmanız gerekecek.

Joystick.js scriptinde JoystickOlusturulsunMu(pozisyon:Vector2) isimli bir fonksiyon bulunmakta. Bu fonksiyon sadece dinamik oluşturulan joysticklerde çalışır ve eğer true döndürürse pozisyon konumunda joystick çizilir. Burada devreye bir de Joystick ID giriyor. Her dinamik joystick’in ID’sinin farklı olduğundan emin olmalısınız. Varsayılan olarak bu fonksiyonun içi şöyle doldurulmuştur:

function JoystickOlusturulsunMu( pozisyon : Vector2 )
{
	if( id == 0 )
	{
		if( pozisyon.x < Screen.width / 2 )
			return true;

		return false;
	}
	else if( id == 1 )
	{
		if( pozisyon.x > Screen.width / 2 )
			return true;

		return false;
	}

	return false;
}

Eğer bir dinamik joystickin Joystick ID’si 0 ise o joystick sadece ekranın sol yarısına tıklayınca (pozisyon.x < Screen.width / 2) oluşturulur. Benzer şekilde, Joystick ID’si 1 olan bir dinamik joystick de sadece ekranın sağ yarısına tıklayınca (pozisyon.x > Screen.width / 2) oluşturulur. Bu kodları dilediğinizce düzenleyebilirsiniz. Örneğin ekranda üç tane dinamik joystick varsa koda bir tane daha id koşulu ekleyin. Ya da diyelim ki ekranda sadece bir tane dinamik joystickiniz var (id’si 0 olan) ve bu joystickin ekranın neresine tıklarsanız tıklayın çıkmasını istiyorsunuz. O zaman fonksiyonu şöyle değiştirebilirsiniz:

function JoystickOlusturulsunMu( pozisyon : Vector2 )
{
	if( id == 0 )
	{
		return true;
	}

	return false;
}

Burada anlattıklarımı daha iyi anlamanız ve scripti daha iyi tanımanız için örnek projeyi kontrol etmenizi tavsiye ederim. Tekrar görüşmek dileğiyle!

 

yorum
  1. Barış dedi ki:

    Hocam merhaba kolay gelsin. Bu proje unity nin bu yıl çıkan sürümüyle çalışmıyordu. 2021 sürümüylede çalışmadı, hata veriyor. Çözümü var mı?

  2. Ali dedi ki:

    Merhaba, sitenizden ara ara faydalanıyorum paylaşımlarınız için teşekkürler. ben bir kaç farklı youtube videosundan izlediğim yntemlerle android için fps tarzı joystick ile karakter kontrolü yapmaya çalışıyorum fakat karşılaştığım sorun şu unityde oyunu çalıştırdığımda mause ile joysticki tutup istediğim yöne çekiyorum karakter hareket ediyor hiçbir sorun yok ama oyunu apk yapıp tablete yüklediğim zaman tablette joystick tepki vermiyor yada düzgün çalışmıyor, bu arada joystickin yanında örneğin zıplama butonu var ona bastığımda sorunsuz zıplama işini yapıyor. Bir türlü çözemedim bu sorunu yardımcı olursanız çok sevinirim teşekkürler.

yasirkula için bir cevap yazın Cevabı iptal et

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 )

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.