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!

yorum
  1. Mert dedi ki:

    Unitynin gyroscope desteği yok diye biliyordum android cihazlar için.Hatta bir ara deneyip calistiramamistim.Yeni mi bu ?

  2. Emre dedi ki:

    Hocam konuyla alakasız bir şey sormak istiyorum. “Screen.orientation ScreenOrientation.LandscapeLeft;” kodunu ben sadece bir sahnede kullanmak istiyorum ama ilk sahnedeki kameraya attığımda bütün sahnelere uyguluyor. Bunu nasıl çözebilirim?

    • yasirkula dedi ki:

      Sonraki sahnede bir yerde Screen.orientation = ScreenOrientation.Portrait; yapmanız lazım. Yalnız ben oyun boyunca aynı orientation’a sadık kalmanızı öneririm.

    • Zafer Korkmaz dedi ki:

      İnsanlara ben 11 yaşındayım acıyın 5 yıldız verin demek hiç hoş değil. Oyunun eleştirilcek çok tarafı var

  3. Hasan dedi ki:

    Abi bir şey sorucam, oyunumu nasıl hızlandırabilriim? Yani oyun başladıktan 5 saniye sonra oyun hızı 2 katına çıkıcak

    • yasirkula dedi ki:

      Kodlarınızda Time.timeScale = 2; yazarsanız oyun hızı normalin iki katına çıkar, Time.timeScale = 1; yazarsanız normale döner. 5 saniye beklemek için yield WaitForSeconds ya da Invoke komutlarından faydalanabilirsiniz.

  4. Mert Kırımgeri dedi ki:

    Hocam,çok önemli bir sorum var.Arduino ve android unity serialport bağlantısı yapmaya çalışıyorum.COM portları işe yaramıyor.Bunu nasıl çözebilirim ? Java plugini de olsa,direkt te olsa çözmenin bir yolu var mı ?

  5. enverhemen dedi ki:

    merhaba bende unity üzerinden 2d bir oyun geliştirmek istiyorum yardım destek ararken tesadüfen sizi buldum iyiki de bulmuşum 🙂 sorum şöyle olacak burada sizinde kullandığınız arka plan grafiklerini bende nerede tasarlıyayım ? phohotosop ile mi yoksa unity içinde mi bi tasarım yapayım ? tasarımım iyidir yappacağım ama tam olarak başlangıç kısmını öğrensem devamını getireceğim. teşekkürler…

    • yasirkula dedi ki:

      Grafik tasarımını Photoshop varsa orada tasarlayın tabi ki. Zaten Unity’de plugin olmadan grafik tasarımı yapmanız mümkün değil. Photoshop çıktılarınızı PSD olarak alabilirsiniz; Unity PSD destekliyor.

      • enverhemen dedi ki:

        hocam bir tane kafamda ki tasarımı photoshop’da yapıp sana yollasam bi bakar mısın mail,facebook,skype fark etmez ilk harita çizimim olacakta bir yardım destek gerekiyor bana

      • yasirkula dedi ki:

        Nasıl bir yardım istiyorsunuz?

      • enverhemen dedi ki:

        hocam bu hafta içinde şu projemi biraz ilerleteceğim size buradan dönerim inşallah dediğiniz gibi photoshop’dan bi haritaı çizip yapayım da

  6. doğukan ağaoğlu dedi ki:

    örneği indirip untıy 5.2.1 de build ettim. Ancak gyroscope olayı olmuyor. yani gyroyu baslat diyorum. telefonu sağa sola çevriyorum kamera hareket etmiyor.sabit halde ateş saçıyor sadece. hata olabilir dosyada. başka sebebi var mı ?

    • yasirkula dedi ki:

      Projeyi indirip Unity 5.2.1 ile açıp hiçbir değişiklik yapmadan Android’e build aldım ve S3 cihazımda test ettim. Bende gyro sıkıntısı yoktu hâlâ. Sizin cihazınız çok eskiyse belki gyroscope’u yoktur, onun dışında aklıma bir sebep gelmiyor malesef :/

  7. kamer dedi ki:

    Bu yolla kendi wii veya vr gözlükler gibi benzeri şeyler yapılabilinir mi ?

    • yasirkula dedi ki:

      O gözlüklerde (tahminimce) bir yerine iki kameradan render alınıyor (kameralar arası göz mesafesi kadar boşluk var) ve bu görüntüler gözlüğün iki farklı gözüne gönderiliyor. Sadece gyro yeterli olmaz yani. Gyro kodlarının çalışması için cihazda gyroscope olması lazım bu arada.

  8. Ahmet Fatih AVCI dedi ki:

    Hocam merhaba. Oyunumu Play Store’a koydum Vr bir oyun. Gyro Sensör olmayan telefonlar indiremiyor. Developer sayfasından oyun özellikleriene baktığımda android.hardware.screen.LANDSCAPE android.hardware.sensor.ACCELEROMETER android.hardware.sensor.GYROSCOPE yazıyor. Gyro sensörü olmayan kullanıcıların da indirebilmesi için bu kodu ne yapmam lazım ve bu kod nerde yazıyor onu da bulamadım 😦 yardım edebilir misinz?

    • yasirkula dedi ki:

      Kodlarınızda gyro fonksiyonları kullanınca oyunun gyro kullandığını belirten satır, build sırasında Unity tarafından AndroidManifest’e otomatik olarak ekleniyor. Bunun önüne geçmenin mümkün olduğunu sanmıyorum. Piyasadaki çoğu cihazda gyro olduğu için büyük bir sıkıntı olmamalı.

      • Ahmet Fatih AVCI dedi ki:

        malesef dediğiniz gibi değil. 280 kişi sayfaya girmiş 70i indirebilmiş. Androidmanifestten o kodları silmeyi denemem lazım. AndroidManifest nerde biliyo musunuz

      • yasirkula dedi ki:

        Gyro kullandığınız sürece o izin otomatik olarak eklenecek. Silmeniz ise maalesef mümkün değil zira projedeki AndroidManifest’ler build esnasında birleştiriliyor ve ondan sonra gyro izini manifest’e yazılıyor. Bu manifest ise direkt olarak APK’nın içine atılıyor, yani Unity içerisinden herhangi bir şekilde erişmeniz mümkün değil. Eğer APK dosyasını Winrar ile açarsanız AndroidManifest dosyasını orada görebilirsiniz ancak bir değişiklik yaparsanız oyunda beklenmedik hatalar alabilirsiniz.

  9. Roxose dedi ki:

    Hocam, ben kendi playerımın yol alırken ne kadar yol gittiğini ölçüp onu da oyunda bir istatistik olarak bulundurmak istiyorum. Update fonksiyonunu kullanarak her karede bir önceki kareyle olan mesafe farkını alıp bu her kare sonucu oluşan farkları toplayıp bunu başarmaya çalıştım fakat işler planladığım gibi gitmedi ve infinity değeri verdi. Bunu nasıl başarabilirim?

    • yasirkula dedi ki:

      Şunun gibi bir kod kullanabilirsiniz:

      float katedilenMesafe = 0f;
      private Vector3 eskiKonum;
      private bool hesaplamayaBasla = false;
      
      void Update()
      {
      	Vector3 yeniKonum = transform.position;
      	
      	if( hesaplamayaBasla )
      	{
      		katedilenMesafe += Vector3.Distance( eskiKonum, yeniKonum );
      	}
      	else
      	{
      		hesaplamayaBasla = true;
      	}
      	
      	eskiKonum = yeniKonum;
      }
      
  10. Erman Emre dedi ki:

    Merhaba,Hocam ben jiroskop sensörünü kullanarak oyunumdaki topu hareket ettirmeyi sağlamak istiyorum acaba yardımcı olabilir misiniz? Dönem projem olduğu için yardım ederseniz çok sevinirim.Teşekkür ederim.

Bir 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. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s