Unity Gyroscope Örneği

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

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…

Yukarıda belirttiğim kaynaktan faydalanarak basit bir script yazmaya çalıştım: KameraHareketGyro.js

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.2.1 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.js scriptinin içeriğini direkt buradan görmek isterseniz buyurun:

#pragma strict

// Kaynak: http://blog.heyworks.com/how-to-write-gyroscope-controller-with-unity3d/

private var tr : Transform;
private var g : Gyroscope;

private var referenceRotation : Quaternion;
private var cameraBase : Quaternion;
private var hedefRotation : Quaternion;

private var gyroAcik : boolean = false;

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

function 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.3 );
	}
	#endif
}

// Gyroscope'u test etmek için GUI arayüzü
/*function 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
function ConvertRotation( q : Quaternion )
{
	return new Quaternion( q.x, q.y, -q.z, -q.w );
}

// Gyroscope'tan değer okumaya başla
function GyroBaslat()
{
	gyroAcik = true;
	
	// Buradaki kodu ben de pek anlamıyorum, 
	// kaynaktan copy-paste yaptım sayılır
	var fw : Vector3 = 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
function 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.