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:

Ö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!
Henüz kendi programımda denemedim ama kesinlikle bir bakış kazandırdı çok faydalı oldu çok teşekkür ediyorum 🙏🏻