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://assetstore.unity.com/packages/tools/input-management/simple-input-system-113033
Alternatif Link: https://github.com/yasirkula/UnitySimpleInput/releases
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
- 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!