Unity Gyroscope Örneği

Yayınlandı: 05 Kasım 2015 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME (04.04.2020): Kodlar C#’a çevrildi.

Hepinize merhabalar,

Bu yazımda, Unity‘de gyroscope (gyro) kullanımını göstermek için hazırladığım bir örneği sizinle paylaşacağım. Gyroscope dediğimiz şey telefonun 3D uzayda hangi rotation’a sahip olduğunu algılamamıza yarıyor. Gyroscope’un döndürdüğü veriden faydalanarak da kameraya eğim verebiliyoruz. Bu sayede oyuncu elindeki cihazı nereye çevirirse oyun içi kamera da o yöne dönüyor. Yani güzel bir fikir ile entegre edildiğinde gyroscope, oyununuzun piyasadaki diğer oyunlar arasından sıyrılmasına yardımcı olabilir.

Benim hazırladığım örnekte elimizde bir bombaatar silah (grenade launcher) bulunmakta ve biz gyroscope ile nereye bakarsak silah oraya ateş etmekte. Oyunda herhangi bir amacımız yok; buradaki asıl olay gyroscope’u iş üstünde görmek. İşte size örnekten bir resim:

GyroOrnek

Örneği indirmek için: https://www.dropbox.com/s/475zv4argw0ndgd/Gyro%20Ornek.zip?dl=0

Faydalandığım kaynak: http://blog.heyworks.com/how-to-write-gyroscope-controller-with-unity3d/

Detaylı açıklama için yazının devamını okuyabilirsiniz…

Öncelikle şunu söylemek istiyorum: her mobil cihaz gyroscope desteklemeyebilir çünkü bazı cihazlarda gyro sensörü bulunmamaktadır. Cihazın gyro destekleyip desteklemediğini öğrenmek için, Input.gyro.enabled değişkeninin true olup olmadığına bakabilirsiniz.

Kamerayı gyroscope ile döndüren basit bir script yazmaya çalıştım: KameraHareketGyro.cs. Kendi oyunlarınızda yapmanız gereken şey, bu scripti sahnedeki kamera objenize atamak. Ardından ne zaman ki bu scriptteki GyroBaslat() fonksiyonunu çağırırsınız, işte o zaman kamera gyro ile hareket etmeye başlar. Ne zaman ki GyroDurdur() fonksiyonunu çağırırsınız, o vakit gyroscope kamerayı etkilemeyi bırakır.

Örnek projedeki tüm scriptler bana ait, onlardan istediğiniz gibi faydalanabilirsiniz. Ancak geri kalan şeyler (sesler, kaplamalar, partikül efektleri, silah modeli) hep hazır şeyler; o yüzden onları kendi projelerinizde kullanmanızı tavsiye etmem (copyright sıkıntısı yaşayabilirsiniz).

Örneği Unity 5.6 sürümünde hazırladım. Eğer daha önceki bir sürümde örneği açarsanız belki bir takım sorunlarla karşılaşabilirsiniz.

Eğer örnek projede de halihazırda yer alan KameraHareketGyro.cs scriptinin içeriğini direkt buradan görmek isterseniz buyurun:

using System.Collections;
using UnityEngine;

// Kaynak: http://blog.heyworks.com/how-to-write-gyroscope-controller-with-unity3d/
public class KameraHareketGyro : MonoBehaviour
{
	private Transform tr;
	private Gyroscope g;

	private Quaternion referenceRotation;
	private Quaternion cameraBase;
	private Quaternion hedefRotation;

	private bool gyroAcik = false;

	IEnumerator Start()
	{
		// Oyun başladığında gyroscope'u aktif hale getir
		tr = transform;
		g = Input.gyro;
		g.enabled = true;

		// Gyroscope'un kullanıma hazır hale gelmesi için 1 frame bekle
		yield return null;

		GyroBaslat();
	}

	void Update()
	{
		// PC'de gyro olmadığı için bu kodu Unity editörde çalıştırma
#if !UNITY_EDITOR
		if( gyroAcik )
		{
			// Kameranın rotasyonunu gyroscope'un döndürdüğü değere göre ayarla
			hedefRotation = cameraBase * ConvertRotation( referenceRotation * g.attitude );

			// Kamera hareketini yumuşat (Slerp)
			tr.rotation = Quaternion.Slerp( tr.rotation, hedefRotation, 0.3f );
		}
#endif
	}

	// Gyroscope'u test etmek için GUI arayüzü
	/*void OnGUI()
	{
		if( GUILayout.Button( "Gyro Baslat", GUILayout.Width( 200 ), GUILayout.Height( 100 ) ) )
			GyroBaslat();
		if( GUILayout.Button( "Gyro Durdur", GUILayout.Width( 200 ), GUILayout.Height( 100 ) ) )
			GyroDurdur();
	}*/

	// Android cihazdan okunan gyro değerini 
	// Unity'nin quaternion'una uygun hale getir
	private Quaternion ConvertRotation( Quaternion q )
	{
		return new Quaternion( q.x, q.y, -q.z, -q.w );
	}

	// Gyroscope'tan değer okumaya başla
	public void GyroBaslat()
	{
		gyroAcik = true;

		// Buradaki kodu ben de pek anlamıyorum, 
		// kaynaktan copy-paste yaptım sayılır
		Vector3 fw = g.attitude * Vector3.back;
		fw.z = 0;
		if( fw == Vector3.zero )
			referenceRotation = Quaternion.Euler( 270, 0, 0 );
		else
			referenceRotation = Quaternion.Euler( 270, 0, 0 ) * Quaternion.Inverse( Quaternion.FromToRotation( Vector3.up, fw ) );

		fw = tr.forward;
		fw.y = 0;
		if( fw == Vector3.zero )
			cameraBase = Quaternion.identity;
		else
			cameraBase = Quaternion.FromToRotation( Vector3.forward, fw );
	}

	// Gyroscope'tan değer okumayı sonlandır
	public void GyroDurdur()
	{
		gyroAcik = false;
	}
}

Faydalı olması ümidiyle; sonraki derste görüşmek üzere!

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.