Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
106 lines (83 sloc) 7.55 KB
ID post_title author post_excerpt layout permalink published post_date
9984
Unity Gelişmiş Input Sistemi (Mobil Destekli)
Süleyman Yasir KULA
post
true
2017-08-12 05:43:46 -0700

Hepinize yeniden merhabalar,

Son zamanlarda Input.GetAxis 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 bir sistem çıktı.

SimpleInput sistemi ile UI butonlarına dokunarak, dokunmatik ekranda parmağınızı sürükleyerek, joystick kullanarak veya klavye tuşlarını kullanarak Input.GetAxis’i simüle edebiliyorsunuz. Dilerseniz de biraz kod yardımıyla kendi input yöntemlerinizi de sisteme tanıtabiliyorsunuz.

Unitypackage linki: https://www.dropbox.com/s/wopvkfsuenw8wus/SimpleInput.unitypackage?dl=0 (Alternatif link)

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

Sistemin işleyişi Input.GetAxis’e çok benziyor. Öyle ki çoğu zaman kodlarınızdaki Input.GetAxis’leri SimpleInput.GetAxis‘e ve Input.GetAxisRaw’ları da SimpleInput.GetAxisRaw‘a çevirmek yeterli olacaktır. Bunun dışında tek yapmanız gereken, bu fonksiyonlara parametre olarak girdiğiniz axis’lerin (“Horizontal”, “Vertical”, “Mouse X” vs.) değerlerini nasıl alacaklarını belirlemek olacak: ekrandaki butonlarla mı, joystick’le mi yoksa dokunmatik ekranla mı gibi…

Paketle birlikte 4 tane hazır input scripti gelmekte: SimpleInputButon, SimpleInputDokunmatikEkran, SimpleInputKlavye ve SimpleInputRealAxis.

SimpleInputButon

Herhangi bir UI elemanına verebilirsiniz. Butona basılı tutulduğu sürece, girilen Axis‘in değeri Deger olur. Örneğin Input.GetAxis(“Vertical”)’ı ekrandaki yukarı-aşağı butonlarıyla simüle etmek istiyorsanız önce Input.GetAxis(“Vertical”)’ı SimpleInput.GetAxis(“Vertical”)‘a çevirmeli, ardından yukarı yön butonuna SimpleInputButon component’i verip Axis’ini “Vertical” (tırnaksız), Deger’ini 1 yapmalı ve son olarak aşağı yön butonuna da SimpleInputButon component’i verip Axis’ini “Vertical“, Deger’ini -1 yapmalısınız.

SimpleInputDokunmatikEkran

Dokunmatik ekranda parmak sürükleyerek input almaya yarar. Örneğin “Mouse X” ve “Mouse Y” axis’lerini simüle etmek için idealdir. Bu durumda sahnenizdeki herhangi bir objeye SimpleInputDokunmatikEkran component’i verip “X Axis“ini “Mouse X” ve “Y Axis“ini de “Mouse Y” yapmanız yeterlidir. Eğer “Ui Yoksay” seçeneğini işaretlerseniz ekrana dokunan herhangi bir parmak input verebilirken işaretlemezseniz de o zaman sadece ekrandaki boş bir yere tıklayan (bir UI elemanının üzerine tıklamayan) parmaklar input verebilir.

SimpleInputKlavye

Klavye tuşları ile input alabilmeye yarar. Tus‘ta belirlenen klavye tuşuna basılı tutulduğu sürece Axis‘in değeri Deger olur.

SimpleInputRealAxis

Input.GetAxis ile kullandığınız axis’leri direkt SimpleInput’ta da kullanabilmenizi sağlar. Örneğin normalde klavyenin sol-sağ tuşları ve A-D tuşları Input.GetAxis(“Horizontal”)’a etki eder; eğer siz bu klavye input’una SimpleInput’tan da erişebilmek istiyorsanız bu component'in Axisler'ine "Horizontal"ı (tırnaksız) ekleyebilirsiniz.

SimpleInputJoystick (Bonus)

Bu component yukarıda paylaştığım unitypackage ile otomatik olarak gelmiyor çünkü bu kodun compile olabilmesi için projede, daha önceki bir dersimde paylaştığım JoystickUI component’inin olması gerekiyor. Joystick’in Vector2 türündeki sonuc değişkeninin x ve y değerleri sırasıyla “X Axis” ve “Y Axis“e değer olarak gitmekte.

Bu script unitypackage ile gelmediği için, eğer kullanacaksanız projeye elle eklemeniz lazım:

using UnityEngine;
 
public class SimpleInputJoystick : MonoBehaviour
{
    public JoystickUI joystick;
 
    [SerializeField]
    private string xAxis = "Mouse X";
    [SerializeField]
    private string yAxis = "Mouse Y";
 
    private SimpleInputAxis xInput = null;
    private SimpleInputAxis yInput = null;
 
    void Awake()
    {
        if( xAxis != null && xAxis.Length > 0 )
            xInput = new SimpleInputAxis( xAxis );
 
        if( yAxis != null && yAxis.Length > 0 )
            yInput = new SimpleInputAxis( yAxis );
    }
 
    void OnEnable()
    {
        if( xInput != null )
            xInput.AxisEkle();
 
        if( yInput != null )
            yInput.AxisEkle();
    }
 
    void OnDisable()
    {
        if( xInput != null )
            xInput.AxisCikar();
 
        if( yInput != null )
            yInput.AxisCikar();
    }
 
    void Update()
    {
        Vector2 joystickSonuc = joystick.sonuc;
 
        xInput.deger = joystickSonuc.x;
        yInput.deger = joystickSonuc.y;
    }
}

Bu kod vasıtasıyla aslında nasıl kendi input metotlarınızı sisteme tanıtabileceğinizi de görmüş oluyorsunuz. Yapmanız gerekenler kabaca şöyle:

  • SimpleInputAxis türünde bir değişken oluşturmak
  • Awake fonksiyonunda bu değişkeni new SimpleInputAxis(“axis ismi”); şeklinde initialize etmek
  • OnEnable fonksiyonunda değişkenin AxisEkle fonksiyonunu çağırmak
  • OnDisable fonksiyonunda değişkenin AxisCikar fonksiyonunu çağırmak
  • Gerektiği zaman (Update fonksiyonunda veya uygun gördüğünüz başka bir yerde) değişkenin deger‘ini güncellemek
Örneğin SimpleInputJoystick scripti, “Mouse X” axis’ine joystick.sonuc.x‘i ve “Mouse Y” axis’ine de joystick.sonuc.y‘yi değer olarak atmakta.

Umarım faydalı olur. Çok sıkıntı yaşarsanız belki çok basit bir örnek proje de paylaşabilirim. Daha sonra görüşmek dileğiyle!