Unity Gelişmiş Input Sistemi (Mobil Destekli)

Yayınlandı: 19 Temmuz 2017 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME (20.03.2018): Asset Store linki eklendi.

Hepinize yeniden merhabalar,

Son zamanlarda Input.GetAxis, Input.GetButton veya Input.GetKey kullanan kodların Android cihazlarda nasıl çalıştırılabileceği ile ilgili çeşitli sorular alıyordum. Ben de bu konuda basit bir çözüm üretmeye çalıştım ve ortaya SimpleInput adını verdiğim sistem çıktı.

SimpleInput sistemi ile UI butonlarına dokunarak, dokunmatik ekranda parmağınızı sürükleyerek, joystick kullanarak, direksiyon çevirerek, belirlediğiniz klavye tuşlarına dokunarak vb. Input fonksiyonlarını simüle edebiliyorsunuz.

Asset Store: https://www.assetstore.unity3d.com/en/#!/content/113033

Alternatif Link: https://github.com/yasirkula/UnitySimpleInput/raw/master/SimpleInput.unitypackage

Detaylar için yazının devamını okuyabilirsiniz…

Sistemin işleyişi çok basit: öncelikle üstteki unitypackage‘ı projenize import ediyorsunuz. Ardından kodlarınızdaki multi-platform olmasını istediğiniz Input fonksiyonlarını aşağıdaki gibi SimpleInput versiyonu ile değiştiriyorsunuz:

  • Input.GetAxis -> SimpleInput.GetAxis
  • Input.GetAxisRaw -> SimpleInput.GetAxisRaw
  • Input.GetButtonDown -> SimpleInput.GetButtonDown
  • Input.GetButton -> SimpleInput.GetButton
  • Input.GetButtonUp -> SimpleInput.GetButtonUp
  • Input.GetMouseButtonDown -> SimpleInput.GetMouseButtonDown
  • Input.GetMouseButton -> SimpleInput.GetMouseButton
  • Input.GetMouseButtonUp -> SimpleInput.GetMouseButtonUp
  • Input.GetKeyDown -> SimpleInput.GetKeyDown
  • Input.GetKey -> SimpleInput.GetKey
  • Input.GetKeyUp -> SimpleInput.GetKeyUp

SimpleInput’ta karşılığı olmayan tek Input fonksiyonu Input.GetKey(string) fonksiyonu. Kodlarınızda bu fonksiyonu kullanıyorsanız o zaman fonksiyonun aldığı string parametreyi, KeyCode türündeki karşılığı ile değiştirmeniz lazım.

Artık geriye, bu input’lara değerlerini verecek olan component’leri/objeleri oyuna eklemek kalıyor. Mesela SimpleInput.GetAxis(“Horizontal”) ve SimpleInput.GetAxis(“Vertical”) fonksiyonlarına değerlerini vermesi için oyuna bir joystick veya d-pad ekleyebilirsiniz.

Paketle birlikte gelen Prefabs klasörünün içerisinde bazı hazır input objeleri bulunmakta: joystick, direksiyon (SteeringWheel), d-pad, yatay yön tuşları (ArrowsHorizontal), dikey yön tuşları (ArrowsVertical) ve 4 yöne yön tuşları (ArrowsAllDirections). Bu objeleri rahatça kişiselleştirebilmeniz için de Sprites klasöründe bir takım hazır görseller bulunmakta. Tabi eğer dilerseniz kendi görsellerinizi de kullanabilirsiniz. Paketle gelen hazır görsellerin hepsinin lisansı CC0 Creative Commons, yani istediğiniz sprite’ları herhangi bir credit vermeden istediğiniz gibi kullanabilirsiniz.

Diyelim ki oyuna joystick eklemek istiyorsunuz. Bu durumda yapmanız gereken şey, Prefabs klasöründeki Joystick prefab’ını sahnenizdeki canvas‘ın içerisine sürükleyip (canvas yoksa oluşturun) ardından joystick’i istediğiniz gibi konumlandırmak. Bundan sonra tek yapmanız gereken, joystick hareket ettikçe hangi axis’lerin değerlerinin değişeceğini belirlemek:

X Axis“e atanmış axis, joystick’i yatayda hareket ettirdikçe değer alırken “Y Axis“e atanmış axis ise joystick’i dikeyde hareket ettirdikçe değerini alır. “Movement Axes” değişkeni joystick’in hangi eksenlerde hareket edebileceğini belirtirken “Movement Area Radius” değişkeni ise joystick’in hareket alanı yarıçapını belirler. “Is Dynamic Joystick” seçeneği seçilirse joystick normalde ekranda gözükmez ancak sadece ekrana bir parmak dokununca, parmağın olduğu noktada belirir; yani konumu dinamik olur. “Dynamic Joystick Movement Area” ise, joystick eğer ki dinamik ise bu joystick’in nerelerde oluşabileceğini belirler. Bu alanın dışına dokunulursa orada joystick oluşmaz. Eğer değeri verilmezse joystick ekranın herhangi bir yerine dokununca oluşabilir.

2 boyutlu bir oyun yapıyorsunuz ve karakterinizin ekrandaki sol ve sağ ok tuşlarına dokundukça hareket etmesini istiyorsunuz diyelim. Bu durumda Prefabs klasöründeki ArrowsHorizontal prefab’ını canvas’ınıza sürükleyebilirsiniz. Bu objenin içerisinde Left (sol) ve Right (sağ) adında iki obje, bu objelerde de “Axis Input UI” isminde bir component bulunmakta. Bu component’i bir UI elemanına atarsanız, o UI elemanına basılı tutulduğu sürece “Axis” değişkeninde belirlenen axis input’unun değeri “Value” olur:

Eğer anlattıklarım birazcık kafanızı karıştırdıysa Example klasöründeki örnek sahneyi açıp oradaki sistemi inceleyebilirsiniz:

Bu örnekte hareket edebilen ve zıplayabilen 2 player var ve ilk player hareket etmek için Horizontal ve Vertical axis’lerini kullanırken ikinci player ise Horizontal2 ve Vertical2 axis’lerini kullanıyor. Zıplamak için ise Jump ve Jump2 button’larını kullanıyorlar. Yani SimpleInput ile, normalde Unity’de var olmayan axis’leri ve button’ları da kullanabiliyorsunuz.

Üstte bahsettiğim component’ler de dahil olmak üzere, plugin ile beraber gelen tüm component’lerden kısaca bahsedecek olursam:

SimpleInput.GetAxis İçin Component’ler

  • AxisInputKeyboard: klavyedeki bir tuşa basılı tuttuğunuz sürece axis’in değerini değiştirir
  • AxisInputMouse: “Mouse X” ve “Mouse Y” input’larını başka axis’lere taşımaya yarar (bkz. neden?)
  • AxisInputUI: bir UI elemanına (mesela Button, Image, Text vs.) basılı tuttuğunuz sürece axis’in değerini değiştirir
  • Dpad: genellikle joystick’lerin solunda gördüğümüz d-pad’leri simüle eder. D-pad’lerde input ya tamamen vardır (-1 veya 1 değerini alır) ya da hiç yoktur (0 değerini alır). Yani 0.5 gibi bir ara değer döndürülmez
  • Joystick: alışageldiğimiz joystick input’u
  • SteeringWheel: ekrandaki bir direksiyonu simüle eder. Direksiyonu sola veya sağa çevirdikçe axis’in değeri değişir
  • Touchpad: atandığı RectTransform‘un üzerinde parmak sürüklenirse, bu sürükleme miktarı kadar axis’in değerini değiştirir; yani ekranda parmağı sürükledikçe axis’e değer verir. Eğer tüm ekranda parmağı sürükleyebilmek istiyorsanız Canvas objesinin kendisine bu component’i verebilirsiniz. Component’teki “Allow Touch Input” değişkeni, touchpad’in dokunmatik ekran desteklemesini sağlarken  “Allowed Mouse Buttons” ise, hangi mouse butonlarının touchpad’de işe yarayacağını belirler.

SimpleInput.GetButton İçin Component’ler

  • ButtonInputKeyboard: klavyedeki bir tuşa basılı tuttuğunuz sürece button’un değerini değiştirir
  • ButtonInputUI: bir UI elemanına basılı tuttuğunuz sürece button’un değerini değiştirir

SimpleInput.GetMouseButton İçin Component’ler

  • MouseButtonInputKeyboard: klavyedeki bir tuşa basılı tuttuğunuz sürece mouse button’un değerini değiştirir
  • MouseButtonInputUI: bir UI elemanına basılı tuttuğunuz sürece mouse button’un değerini değiştirir

SimpleInput.GetKey İçin Component’ler

  • KeyInputKeyboard: klavyedeki bir tuşa basılı tuttuğunuz sürece key’in değerini değiştirir
  • KeyInputUI: bir UI elemanına basılı tuttuğunuz sürece key’in değerini değiştirir

Bu component’ler arasından ButtonInputKeyboard gibilerini oyununuzdaki herhangi bir objeye component olarak verebilirken KeyInputUI gibilerini ise sadece UI objelerine component olarak verebilirsiniz. Joystick, SteeringWheel veya Dpad için ise Prefabs’taki hazır prefab’ları kullanmanızı öneririm.

Eğer ki SimpleInput ile bir klavye tuşuna tıklayınca değil de bir mouse tuşuna tıklayınca bir axis’i simüle etmek gibi bir niyetiniz olursa da o zaman sahnedeki bir objeye AxisInputKeyboard component’i verebilir ve “Key” olarak sol mouse tuşu için Mouse0, sağ mouse tuşu için Mouse1 ve orta mouse tuşu için de Mouse2 değerini verebilirsiniz.

Umarım faydalı olur. Daha sonra görüşmek dileğiyle!

yorum
  1. Faruk dedi ki:

    hocam merhaba mobil için keycode nasıl kullanılıyor

  2. Uğur dedi ki:

    Yasir bey. Unity ile geliştirmeye yeni başladım. arrowshorizontal öğesini projeye ekliyorum fakat ne ekranda görünüyor ne de bir işlevi var yardım edebilir misiniz?

    • yasirkula dedi ki:

      Sahnenizde bir UI-Canvas objesi oluşturup Arrows Horizontal’ı onun üzerine sürükle-bırak yapmanız lazım.

      • Uğur dedi ki:

        canvas zaten ekli tasarım ekranında normal bir şekilde gözüküyor ancak başlattığımda yok oluyor nedeni ne olabilir?

      • yasirkula dedi ki:

        Canvas’ınız “Screen Space – Overlay” modunu kullanmıyorsa o moda geçiş yapmayı deneyin. Oyun esnasında butonların canvas’taki konumlarını Scene panelinden değiştirerek belli bir noktada butonlarınız oyunda gözükmeye başlıyor mu ona da bakın. Belki butonlar canvas’ın dışında kalıyordur ve o yüzden gözükmüyordur.

  3. Ahmet dedi ki:

    Yasir abi merhabalar ben kuş bakışı bir araba oyunu yapmaya çalışıyorum ve arabamın direksiyon yardımı ile dönmesini istiyorum ama sınırlı olarak.Arabam 360 derece dönüyor, bunu kısıtlamak istiyorum.Birde arabamı döndüğü yön doğrultusunda nasıl hareket ettirebilirim acaba senin verdiğin yön tuşlarını canvas ‘ a attım ama hareket ettirmeyi başaramadım yardımcı olur musun ?

    • yasirkula dedi ki:

      Diyelim objenin eğiminin Y değerini -45 ile 45 arasında kısıtlamak için:

      Vector3 egim = transform.localEulerAngles;
      if( egim.y > 180 )
      egim.y -= 360;
      else if( egim.y < -180 )
      egim.y += 360;

      egim.y = Mathf.Clamp( egim.y, -45, 45 );
      transform.localEulerAngles = egim;

      Arabayı yön doğrultusunda hareket ettirmek için transform.position += transform.up * Time.deltaTime; veya transform.position += transform.forward * Time.deltaTime; kodlarını deneyebilirsiniz. Ekrandaki yön tuşlarından, klavyedeki yön tuşları gibi input alabilmek için SimpleInput.GetAxis(“Horizontal”) kodunu kullanabilirsiniz.

      • Ahmet dedi ki:

        Abi ben arabayı z ekseninde -40 ile 40 arasında sınırlamak istiyorum. egim.z yapıp ayarlıyorum ama sabit bir şekilde -5 ile 5 arasında sınırlıyor bunu değiştirmenin bir yolu var mı ? Birde araba direksiyon ile çevrilen yöne değilde tek bir yönde bağımsız ilerliyor.Yardımların için teşekkürler.

      • yasirkula dedi ki:

        Araba kodunuzu nasıl yazdığınızı bilmiyorum o yüzden direksiyon mevzusunu cevaplayamayacağım. -40 ile 40 arasında sınırlama kodunuzu görebilir miyim? Inspector’dan bakınca Rotation Z değeri -5 ile 5 arasında kalıyor, değil mi?

  4. Levent dedi ki:

    Yasir bey
    Joytick e karakterin animasyonunu verebilirmiyiz .Mesela uçağı sağa veya sola yatırıp bu animasyonu jostickle oynatabilirmiyiz veya koşma animasyonu dönme animasyonu tırmanma animasyonu vs.
    Kolay gelsin .

    • yasirkula dedi ki:

      Joystick varsayılan olarak “Horizontal” ve “Vertical” axis’lerini kullanmakta. Yani sahnenize joystick koyduktan sonra SimpleInput.GetAxis(“Horizontal”) kodu ile, -1 ile 1 arasında bir sayı elde edebilir ve bu sayıyı kullanarak uçağı döndürebilirsiniz.

Anonim 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 )

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.