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://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!

yorum
  1. Yusufhan dedi ki:

    @YasirKula size tşkrlerimi sunarım cevaplamanız için.
    burada konu açmak yok o yüzden buraya yazacağım aradığım sorunum kousunu da açılmamış. o yüzden buraya yazıyorum başkan benim bir sorunum var şimdi şöyle ki.
    Sahnemde AI Araba sistemi var oyunu başlatınca arabalar belirli bir koordinata gönderip sürüşüe geçiyor. araba sahnede olsa problem yok am prefab olduğu için atama yapamıyıorum. bir colliderin üzerine gelince değilde colliderden çıkınca O collider bir süreden sonra respawn olacak.

    • yasirkula dedi ki:

      Prefab’dan spawn ettiğiniz arabayı ya temas esnasında Tag’inden kontrol etmeniz lazım ya da referans gerekiyorsa, araba Instantiate olurken o esnada ilgili referansa spawn olan arabayı değer olarak vermeniz gerekiyor.

      • Yusufhan dedi ki:

        Merhaba Yasir bey ben amacıma ulaşamadım. Yukarda bahsettiğim gibi AI Controller var bu AI Controller Prefab olarak hem yaya hemde araçları belirli bir koordinata gönderiyor ve araçlar sürüşe başlıyor bu AI Controllerden sebeb istediğime erişemiyorum. Prefab arabaya bir fonksiyon yazdım. Transform ve Gameobjet ekledim araba respawn olması için transform koyuyorum. Arabaya collider ekliyorum Tag isme respawn Tag ile çarpışması için Gameobject’e Player koyuyorum. bu arabayı bu sefer prefab olarak alınca ekledigim transform ile player gidiyor yani sanki eklememişim gibi oluyor. Sorunum tam da burda

      • yasirkula dedi ki:

        Projenizde neyin ne olduğunu bilmediğim için bu anlattıklarınız bana maalesef karışık geldi 🙂

  2. rehberya dedi ki:

    Yazı için teşekkürler. Benim sorum biraz daha detay öğrenmem gerektiğinden. Şimdi Input.acceleration.x komutuyla yatayda bir fload değeri girmiş oluyoruz. Yani telefonu hareket ettirerek yatayda yavaş yavaş yükselen bir yatay raw değeri oluşturuyoruz. Acaba Input.GetTouch komutunda da TouchPhase.Stationary koduyla float bir değer mi vermiş oluyoruz.
    Yani dokunmaya devam ettiğimiz sürece bu değeri yükseltmeye devam mı ediyoru. Aynı şekilde Input.GetAxisRaw(“Horizontal”) dediğimizde ve tuşa basılı tuttuğumuzda da basılı tuttuğumuz süre boyunca gittikçe artan bir float değeri mi girmiş oluyoruz.

    Yoksa float değeri de girsek basılı tuttuğumuz da (Input.GetAxisRaw(“Horizontal”) veya TouchPhase.Stationary farketmez) aslında sadece bool gibi bir durum mu söz konusu. Yani sağ tuşa basınca +X yönünde bool aktif ve değeri 1, sol tuşa bastığımda -X yönünde bool akti ve değeri 1 gibi mi davranıyor.

    Kendi oyunlarında bu ayrıntılı bilmediğim için ayar yapmakta zorlanıyorum ve her biri için ayrı hassas ayar kodları girmek zorunda kalıyorum. Bu konuyu netleştirme bilirseniz sevinirim. Umarım derdimi anlatabilmişimdir. Şimdiden teşekkürler, iyi çalışmalar.

    • yasirkula dedi ki:

      Input.acceleration.x telefonu ne kadar eğdiğinizi tutuyor, biraz daha eğip sonra eski haline alırsanız float değer önce biraz artar sonra azalır. Telefonu sabit tuttukça değeri değişmez. TouchPhase herhangi bir float ile bağlantılı değil, Touch.position değeri var o da parmağın konumunu Vector2 olarak tutuyor, Touch’ta float diyebileceğim bir şey aklıma gelmiyor. GetAxisRaw örneğiniz dediğiniz gibi çalışıyor, tuşa basınca doğrudan -1 veya 1 olur yoksa 0 olur. GetAxis’te ise bu geçişler biraz daha yumuşak olur ama değer yine -1’e veya 1’e gider, bunun üzerine taşmaz. “Horizontal” harici bazı axis’lerde (“Mouse X” gibi), o input’un ne kadar değiştiğine bağlı olarak -1 ve 1’in üzerine de çıkabilir.

  3. lokman dedi ki:

    merhaba hocam. Joystick i arabanın dönmesi için kullandığımda arabanın dönüşü çok keskin oluyor. Mobilde oynamak(araba kontrolü için) neredeyse imkansız oluyor. Çok çabuk sağa sola hareket ediyor acaba bunun daha yavaş olması mümkün olabilir mi?(kontrolü daha iyi olabilir mi?)

  4. Serkan dedi ki:

    Merhaba hocam

    Mobil telefonda input fielde konunca klavye açılıyor. ama benim ui objeleri klavyenin altında kalıyor. bu objeleri klavyenin üstünde tutması için sabitleyebileceğimiz bir şey var mıdır?

    Şimdiden teşekkürler.

    • yasirkula dedi ki:

      Merhaba, klavyenin üzerinde Unity objelerini mi render almak istiyorsunuz yoksa klavye belirdiğinde UI objelerini klavyenin tepesinde kalacak şekilde yukarıya kaydırmak mı istiyorsunuz?

      • Serkan dedi ki:

        Hocam, input fielde tıklaynca bazı ui oblerini klavyenin üstüne taşınmasını istiyorum. tam klavyenin başladı yere ui objesi konumlanacak

      • yasirkula dedi ki:

        Bu tarz bir çalışmam olmamıştı. “TouchScreenKeyboard.area android” ve “unity mobile on screen keyboard move ui elements” şeklinde aramalar yapıp karşınıza gelen sonuçları incelemenizi öneririm.

      • Yusufhan Arslan dedi ki:

        Bunun için video çekip size göndere bileceğim bir sosyal medya varmı

      • yasirkula dedi ki:

        YouTube’a gizli video olarak yükleyip buradan veya e-posta ile yollayabilirsiniz. Profil resmime tıklayınca e-posta adresime erişebilirsiniz.

  5. Jonas dedi ki:

    Merhaba, direksiyona dokunup basılı tutunca değil de ekrandaki herhangi bir yere basılı tutup parmak hareketlerine göre direksiyonu döndürmeyi yani value’sunu değiştirmeyi nasıl yapabiliriz

    • yasirkula dedi ki:

      Tüm canvas’ı kaplayan bir RectTransform oluşturup SteeringWheel’i onun içine atabilir ve SteeringWheel component’ini SteeringWheel objesinden silip oluşturduğunuz RectTransform’a verebilirsiniz. SteeringWheel scriptindeki wheel = GetComponent<Graphic>();‘i de wheel = GetComponentInChildren<Graphic>(); yapmanız lazım.

      • Jonas dedi ki:

        çok teşekkür ederim

      • Jonas dedi ki:

        Merhaba tekrar , bu sefer de direksiyona dokununca hareket etmiyor direksiyon dışında bir yere dokunduktan sonra hareket ediyor sağa sola. Ben ekranda herhangi bir yere dokunup sağa sola çektiğimde direksiyon dönsün istiyorum nasıl yapabilirim

      • yasirkula dedi ki:

        Hmm evet direksiyona dokunmak nedense aklıma gelmedi 😀 wheel = GetComponentInChildren<Graphic>(); satırından sonra graphic.raycastTarget = false; yapabilirsiniz.

  6. Barış dedi ki:

    Hocam mobil fps oyunumda kullanıyorum gayet iyi çok teşekkürler fakat diyelim aşağıya bakmak istyorum ama karakter sanki eğiliyor, ben sadece cameranın rotation ı değişsin isterim ama camera öne doğru gidiyor. Bunun takmamın nedeni ise objelerin arkası görülebiliyor, bir nevi bug yani. Ben sadece kendi etrafında hareket etsin isterim öne gidince objelerin içine girmesi sonucunda arkasındaki nesneler gözüküyor. Player ın collider ını da büyültmek istemiyorum bunu nasıl çözebilirim?

    • Barış dedi ki:

      Mesela bir duvarın dibine kadar yaklaşıp aşağı bakmak isteyince oluyor. Maalesef otomatik arkası gözüküyor duvarın içine girince.

    • yasirkula dedi ki:

      Kamera kodunuz dediğiniz gibi öne doğru gidiyor olabilir. O koda müdahale etmek zorundasınız gibi duruyor. Belki dümdüz ileri bakarken durduğu noktadan, aşağı bakarken durması gereken noktaya raycast atıp, bu raycast bir duvara çarpıyorsa, kamerayı o noktanın ilerisine taşımayabilirsiniz. Veya kamera hiç öne doğru gitmeyecek şekilde kamera kodunuzu değiştirebilirsiniz.

  7. sfidan dedi ki:

    Selam Yasir hocam,

    Mouse X ve Mouse Y axisleri ile sorun yaşıyorum. Mouse X ve Y karakterin rotasyonunu ve kamera dönüşünü sağlıyor. Canvasın içini kaplayan rect transform ekledim ve buna Touchpad scriptini verdim. Mouse X ve Mouse Y atamalarını da yaptım. Test için apk alıp deniyorum ama mobilde direkt parmağımın dokunduğu noktayı alıyor ve oraya doğru karakter ve kamera dönüyor. PC de Unity Remote ile deneme yaparken sorun yaşamıyorum ama mobilde parmağımı ekranda daha sürüklemeden parmağımı koyduğum yere dönüş yapıyor. Bu sorunu nasıl çözebilirim ?

  8. lifegames52 dedi ki:

    Hocam merhaba ben ekrana dokunduğum zaman karakterim zıplasın istiyorum bir kod yazdım ama karakter zıplıyor geri gelmiyor çok uzağa zıplıyor sonsuz zıplama yani

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class playercontroller : MonoBehaviour
    {
    public float speed = 10f;
    Rigidbody rb;
    // Start is called before the first frame update
    void Start()
    {
    rb = GetComponent();
    }

    // Update is called once per frame
    void Update()
    {
    if (Input.GetMouseButtonDown(0))
    {
    rb.AddForce(new Vector3(0, speed, 0), ForceMode.Impulse);
    }
    }
    }

    • lifegames52 dedi ki:

      hocam birde karakter yani top zeminden yere düşüyor Rigidbody ekledim collider ekledim ama olmadı yerede düşüyor hem çok yüksek zıplıyor hemde zeminden aşağı düşüyor yardımcı olurmusun hocam şimdiden çok teşekkürler

      • yasirkula dedi ki:

        Zıplama speed’ini düşürün. Rigidbody’de Gravity açık değilse onu da açın. Eğer yerçekimi yetersiz kalıyorsa, yerçekimi gücünü Edit-Project Settings-Physics’ten artırabilirsiniz.

        Bir obje çok hızlı hareket ederken collider’ların içinden geçebilir. Kurşunlar için Rigidbody kullanan FPS oyunlarının sıklıkla karşılaştığı bir sorundur bu. Zeminin collider’ını daha kalın yaparak bu durumun biraz önüne geçebilirsiniz. Ayrıca birbiriyle temas etmesi gereken Collider’ların “Is Trigger”larının kapalı olduğundan emin olun.

  9. sfidan dedi ki:

    Hocam Karakterimi döndürmek istediğim için GetAxis(“Mouse X”) ve GetAxis(“Mouse Y”) inputlarını kullanıyorum. Scriptimi SimpleInput sistemine göre düzenledim, joystick prefabını da canvasa ekledim ve joystick scriptindeki axis değerlerine Mouse X ve Mouse Y yazdım. Test için apk çıktısı aldım joystick çalışıyor karakter dönüyor ama joystick haricinde ekrandaki başka yerlere dokunsam da karakter dönüş işlemi yapıyor. Böyle olunca da FPS oyunda crosshair sabit kalmıyor düşmanları vurmak imkansız oluyor 🙂

    Bir yerde hata mı yapıyorum acaba bu sorunu nasıl çözerim ?

    • yasirkula dedi ki:

      Sanırım “Mouse X” Android’de parmağı sağa sola kaydırdıkça otomatik olarak değer alan bir axis. Yani joystick olmasa bile parmağı ekranda kaydırdıkça değer alıyor. İsterseniz şu şekilde yapın: joystick’e bir de AxisInputMouse component’i verin. Hem bu component’in hem joystick’in axis değerini “Kamera X” ve “Kamera Y” yapın. Ardından kodunuzda SimpleInput.GetAxis(“Kamera X”) fonksiyonunu kullanın.

  10. Fatih dedi ki:

    Hocam Joystickteki mvalue değerini nasıl Vector 2 olarak alabilirim. X ve Y değerlerini vector 2 ye geçiremedim

    • yasirkula dedi ki:

      Eğer amacınız 2 kere SimpleInput.GetAxis çağırmaktan kaçınmak ise, Joystick’i public bir değişkende tutup ardından Value’sine erişebilirsiniz.

  11. gelistiriyoruz dedi ki:

    Hocam anlık olarak movement are radiusa nasıl erişebilirim?
    Mesela 75 ten fazla ise bir işlem yaptırmak istiyorum ne yapmam lazım

    • yasirkula dedi ki:

      movementAreaRadius değişkenini public yapıp ardından Joystick’i de public bir değişkene değer olarak verdikten sonra, joystick.movementAreaRadius şeklinde erişmekten başka yol görmüyorum.

    • gelistiriyoruz dedi ki:

      Yaptım!!
      Arkadaşlar eğer böyle bir durumdaysanız aldığınız inputların Mathf.Abs() metodu ile istediğniz değer aralığını ife sokun ve işlemleri gerçekleştirin.
      Örnek Kod
      float escapeRigth = SimpleInput.GetAxisRaw(“EscapeRigth”);
      float escapeLeft = SimpleInput.GetAxisRaw(“EscapeLeft”);
      if (Mathf.Abs(escapeRigth)>0.5f&& Mathf.Abs(escapeLeft) > 0.5f)

  12. Furkan dedi ki:

    if (throttleInput != “” && throttleInput != null)
    {
    throttle = GetInput(throttleInput) – GetInput(brakeInput);
    }

    Burada nasıl kullanabilirim hocam?

  13. Yekta dedi ki:

    Unity’e de yazıklar olsun yani sırf bir buton yoluyla tuş çağıracağız diye bu kadar uğraşıyoruz.
    Teşekkürler Yasir hocam.

  14. Emre dedi ki:

    Yasir Hocam Merhabalar ;

    ” 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. ”

    hocam bunu peki nasıl yapacağım.
    Kodlarım Şu Şekilde ;

    private void Update()
    {

    if (health <= 0)
    {
    spawner.SetActive(false);
    restartDisplay.SetActive(true);
    Destroy(gameObject);
    }

    healthDisplay.text = health.ToString();

    transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

    if (Input.GetKeyDown(KeyCode.UpArrow) && transform.position.y minY)
    {
    camAnim.SetTrigger(“shake”);
    Instantiate(moveEffect, transform.position, Quaternion.identity);
    targetPos = new Vector2(transform.position.x, transform.position.y – increment);
    }
    }
    }

    Bunu nasıl mobile cevirebilirim hocam, mesela karakteri telefondaki yukarı ve asagı kaydırma olarak ayarlamak istesem nasıl yaparım şimdiden teşekkürler

    • yasirkula dedi ki:

      Bunda sıkıntı yok, direkt Input’u SimpleInput yapabilirsiniz. Ardından diyelim ekrandaki bir UI elemanına basınca UpArrow’un çalışmasını istiyorsanız, o UI elemanına KeyInputUI component’i verip Key’ini UpArrow yapabilirsiniz. Swipe istiyorsanız, oyuncu ekranın neresinde swipe edebilecekse o alanı kaplayan boş bir obje oluşturun (Canvas’ın içerisinde) ve ona KeyInputSwipeGesture component’i verin. Swipe Amount’u istediğiniz gibi ayarlayıp Key’ini UpArrow yapın.

  15. Dorukhan dedi ki:

    Hocam selamlar, altta verdiğim kodları nasıl bu sistemle mobil platformlara entegre edebilirim
    //———-Karakter Kontolü————–

    Vector3 moveInputs = Input.GetAxis(“Horizontal”) * transform.right + Input.GetAxis(“Vertical”) * transform.forward;
    Vector3 moveVelocity = moveInputs * Time.deltaTime * speed;

    controller.Move(moveVelocity);

    //———–Camera/Mouse Kontrolü———–

    transform.Rotate(0, Input.GetAxis(“Mouse X”) * Time.deltaTime * sens,0);
    xRotation -= Input.GetAxis(“Mouse Y”) * Time.deltaTime * sens;

    xRotation = Mathf.Clamp(xRotation, -90, 90);

    Camera.main.transform.localRotation = Quaternion.Euler(xRotation, 0, 0);

    • yasirkula dedi ki:

      Plugin’le gelen örnek sahneye bakabilirsiniz. O sahnede joystick kullanılıyor ama siz kendi oyununuzda nasıl bir mobil input istiyorsanız, o input için olan prefab’ı veya component’i kullanmanız lazım.

      • Dorukhan dedi ki:

        discord veya benzer bir uygulumada müsait olduğunuz zaman bakabilir misiniz çünkü çok anlamadım da mesala projeme import ettiğim halde SimpleInput.GetAxis hata veriyor

      • yasirkula dedi ki:

        Yazılı olarak basit destek verebilirim sadece. Eğer Assembly Definition File kullanıyorsanız, SimpleInput.Runtime’ı kendi Assembly Definition File’ınızın referanslarına eklemeniz lazım. Aksi taktirde, Unity’nin konsolunda hata olmadığı sürece Visual Studio’nun gösterdiği hatalar önemli değil.

  16. rtahaeslik dedi ki:

    Hocam merhaba, bir cube roll scriptim var bu scripti ve assetinizi kullanarak ekranda sağ sol yukarı aşağı kaydırma işlemlerini yapmak istiyorum fakat bir türlü halledemedim.

    • yasirkula dedi ki:

      Anladığım kadarıyla Touchpad kullanmak istiyorsunuz. Canvas’ınızda tüm ekranı kaplayan bir RectTransform oluşturup ona Touchpad component’i verebilirsiniz. Ardından kodunuzda SimpleInput.GetAxis(“Horizontal”) ve SimpleInput.GetAxis(“Vertical”) kullanabilirsiniz.

      • rtahaeslik dedi ki:

        Öncelikle bu kadar hızlı cevap ve böyle güzel asset için çok teşekkür ederim. Yapmak istediğim ekranda hiçbir ui objesi olmadan sadece ekranın herhangi bir yerindeki parmak hareketlerini yakalamak istiyorum. Parmağın yönüne görede küpü yuvarlamak amacım.

      • yasirkula dedi ki:

        Touchpad component’i ile yapabilirsiniz. Touchpad UI sistemini kullanıyor ama ekranda görünmüyor. Eğer hiç UI kullanmadan bunu başarmak istiyorsanız, Input.GetMouseButtonDown ve Input.GetMouseButtonUp fonksiyonları ile Input.mousePosition değişkenini birlikte kullanarak bu kodu elle yazmanız lazım. Kod sadece dokunmatik ekranda çalışacaksa, Input.GetTouch da kullanabilirsiniz: https://yasirkula.com/2013/07/17/unity-ile-androide-uygulama-gelistirmek-1-dokunmatik-ekran-entegrasyonu/

  17. ibrahim gebiç dedi ki:

    Hocam karakter rotasyonunu yönettiğim bir joystick kullanıyorum. Kullandığım joystickin movement area raidusu 150 yaptım ve 75’ten yüksek olunca ateş etmeyi tetiklemesini istiyorum. Yardımcı olur musunuz?

  18. Muhammet dedi ki:

    Merhaba,
    Öncelikle bu değerli bilgileri paylaştığınız için teşekkürler,
    Ben bir butonun sadece tıklama özelliği olsun istiyorum, kullanıcının dokunmasını elini biraz olsun kaydırırsa tıklama olarak algılamıyor ve büyük sorun yaratıyor bana. dokunduğu anda OnClick yapsın istiyorum nasıl yapabilirim ?

  19. Can dedi ki:

    Yasir bey merhabalar. Size ufak bir sorum olacak.
    Park simülasyonu oyunumda cinemachine kamera sistemi mevcut. Ben freecamera eklediğim zaman ekrandaki Ui objelerle beraber kamerada dönüyor. Yani örneğin direksiyonu çevirince kamerada kafa sallıyor gibi oluyor. Birçok yöntemi denedim fakat çözemedim. Şöyleki cinemachine freecamera bir gameobject olarak çalışıyor. Canvasa buton gibi görünmez bir panel atadığım zaman ekranın belli bölgesinde kişi free kamera ile açıyı değiştiremez mi ? Birçok şey var fakat hiçbiri istediğim sonucu veremiyor. Oyuncu Ui’lar dışında ekranda bir yere bastığında kamerayı yönlendirsin fakat direksiyon veya gaz gibi objelere dokunduğunda free kamera dönmesin. Bunu nasıl yapabilirim? Şimdiden teşekkürler.

    • yasirkula dedi ki:

      Cinemachine kullanmadığımdan kesin konuşamıyorum ama FreeCamera input’u nereden alıyorsa, orada input’a değer verilmeden önce EventSystem.current.IsPointerOverGameObject fonksiyonunun çağrılması lazım. Bu fonksiyon true döndürdüğü zaman imleç bir UI objesinin üzerindedir, bu durumda input’un değeri sıfırlanmalı.

      • Fatih dedi ki:

        Merhaba Yasir Bey, sisteminiz çok güzel olmuş. Sağa sola gitmek için Arrows Horizontal ve zıplamak için Arrows Vertical’ın yukarı ok tuşunu kullanmak istiyorum fakat zıplamayı nasıl yapacağımı bilemedim bu kodu:

        private void Update()
        {

        if (isGrounded == true)
        {
        extraJumps = extraJumpsValue;
        }
        if (Input.GetKeyDown(KeyCode.UpArrow) && extraJumps > 0)
        {
        rb.velocity = Vector2.up * jumpForce;
        extraJumps–;
        }
        else if (Input.GetKeyDown(KeyCode.UpArrow) && extraJumps == 0 && isGrounded == true)
        {
        rb.velocity = Vector2.up * jumpForce;
        }
        }

        (UI’daki) yukarı ok tuşunda nasıl çalıştırabilirim?

      • yasirkula dedi ki:

        Input.GetKeyDown’ları SimpleInput.GetKeyDown yaptıktan sonra, UI’ınızdaki yukarı ok tuşuna Key Input UI component’i verip Key değişkenini UpArrow yapabilirsiniz.

      • Fatih dedi ki:

        Çok teşekkür ederim 1 haftadır bunu yapmaya çalışıyorum.

  20. Hakan dedi ki:

    Ekrana dokunulan yerde canvasın içinde joystickin pozisyonunu esnek hale getirebilirmiyiz

  21. SİDAR POLAT dedi ki:

    Tekrardan merhaba Yasir Bey .
    2 ye 1lik bir dikdörtgen küpüm var ve zemine bağlı da bir tuş var .
    2 ye 1 lik dikdörtgen küpümün sadece alt ve üst kısımları tuşa basınca aktif etmesini istiyorum yan şekilde bastığımda tuş aktif edilmesin ,nasıl yapabilirim. Collider trigger kısmına ne yazmam lazım.

    • yasirkula dedi ki:

      Bence bunu yapmanın en basit yolu, dikdörtgenler prizmanızın alt ve üst kısımlarına “DikdortgenYuzey” tag’ına sahip Box Collider’lar verip, butonun OnCollisionEnter’ında collision.collider.CompareTag(“DikdortgenYuzey”) sorgusu ile, bu tag’e sahip bir yüzeye temas edip etmediğinizi kontrol etmek. Daha karmaşık bir çözüm için şu linke göz atabilirsiniz: http://answers.unity.com/answers/1140230/view.html

  22. SİDAR POLAT dedi ki:

    Merhabalar
    Bir oyun yapımının sonuna geldim ama bir sorunu var.
    Sorun şu ki ;
    Butona basılı tuttukça cismin sadece 1 kere tek hareket etmesini istiyorum .
    Şu anda butona basılı tuttuğumda sürekli değeri 1f olarak devam ediyor ve bütün işi bozuyor. Butona sadece 1 kere tek basılması için ne yapabilirim.
    Aşağıya sağ tuşunun kodunu attım yardımcı olabilir misin?

    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;

    namespace SimpleInputNamespace
    {
    public class AxisInputUI : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
    {
    public SimpleInput.AxisInput axis = new SimpleInput.AxisInput();
    public float value = 1f;

    private void Awake()
    {
    Graphic graphic = GetComponent();
    if( graphic != null )
    graphic.raycastTarget = true;
    }

    private void OnEnable()
    {
    axis.StartTracking();
    }

    private void OnDisable()
    {
    axis.StopTracking();
    }

    public void OnPointerDown( PointerEventData eventData )
    {
    axis.value = value;
    }

    public void OnPointerUp( PointerEventData eventData )
    {
    axis.value = 0f;
    }
    }
    }

    • yasirkula dedi ki:

      AxisInputUI yerine ButtonInputUI kullanıp, yapmak istediğiniz eylemi SimpleInput.GetButtonDown fonksiyonu true ise yapın.

      • SİDAR POLAT dedi ki:

        Sorumu cevapladığın için çook teşekkür ederim ama cevabı tam olarak anlamadım.
        Yazmış olduğum kod üzerinde küçük bir şekilde gösterebilir misin?

      • SİDAR POLAT dedi ki:

        Çok teşekkür ederim tekrardan. Bool üzerinden hallettim ,desteğin için sonsuz teşekkürler.

      • yasirkula dedi ki:

        Elinize sağlık.

  23. Ahmet Yılmaz dedi ki:

    Merhaba Yasir Bey, Sayfanızı ilgiyle takip ediyorum. Bu anlattıklarınızdan tam olarak bişey anlamadım. daha doğrusu yarım yamalak.. Acaba anlattıklarınız video ile anlatabileceğiniz vaktiniz var mı.. Telefonlar için ufak bir projem var ve sona doğru geldim. sadece touchpad kısmı eksik kaldı

    • yasirkula dedi ki:

      Touchpad’in ekranın neresinde olmasını istiyorsanız, canvas’ınızın içerisinde o alanı kaplayan bir child obje (RectTransform) oluşturun ve ona Touchpad component’ini verin. Eğer Touchpad’in Inspector’daki axis’lerini Horizontal ve Vertical yaparsanız, touchpad input’una SimpleInput.GetAxis(“Horizontal”) ve Vertical ile erişebilirsiniz.

      • Ahmet Yılmaz dedi ki:

        Yeni bir canvas oluştursam bir problem olur mu?
        Alanı kaplayacak child objenin türü ne olmalı? (RectTransform şeklinde bir obje bulamadım.
        Saygılarımla

      • yasirkula dedi ki:

        Yeni canvas sıkıntı olmaz. Canvas’ın içinde oluşturduğunuz her objenin RectTransform component’i olur, onun vasıtasıyla objenin ebatlarını ayarlayabilirsiniz. Canvas’a sağ tıklayıp “Create Empty” seçeneğini seçerek RectTransform’lu child obje oluşturabilirsiniz.

  24. Emir dedi ki:

    Gerçekten inanılmaz birisiniz, sizi gerçekten tebrik ederim o kadar yerde takıldım ki sizin bu inputlarınız olmasa çok zorlanırdım sadece teşekkür etmek istedim üstad..

  25. Sibel Arslan dedi ki:

    Tekrar Merhabalar,

    Yorum yazmıştım ancak sanırım bir sorun oluştuğundan gelmedi.Tekrar yazıyorum..
    Ben sizin vermiş olduğunuz linkten import işlemini gerçekleştirdim ve butonlar için bahsettiğiniz prefab klasöründen bana lazım olan “ArrowsAllDirections” Canvas’ın içine attım.
    Normalde Update fonksiyonunda olan “w,a,s,d” ve yön tuşlarının olduğu yere değil de.Button fonksiyonu açıp oraya bu şekilde yazdım ve butonlara tag verdim ( update fonksiyoonuna attığğımda da çalışmadı zaten);

    public void Button()
    {

    if (SimpleInput.GetButton(“ButtonUp”))
    {
    if (nowDirection != “down”)
    {
    direction = “up”;

    }

    }

    Yalnız yine çalışmadı.Sizden ricam hiç anlamayan birine anlatır gibi bu olayı anlatabilir misiniz? 4 gündür sürekli bununla uğraşıyorum ama kod bilgim çok olmadığından yapamıyorum.Evde zaman geçirmek için yıllardır istediğim oyun proglamayla uğraşmak istiyorum.Ama bazı yerlerde takılıp kalıyorum.Kusura bakmayın sizi de çok rahatsız ediyorum.Yardımlarınız için çok teşekkür ederim.

    • yasirkula dedi ki:

      SimpleInput ile gelen kodları ellemenize gerek yok, onları oldukları gibi bırakın. Sahneye sürüklediğiniz ArrowsAllDirections, otomatik olarak SimpleInput.GetAxis(“Horizontal”) ve SimpleInput.GetAxis(“Vertical”)’a input sağlar. Tek yapmanız gereken, Update kodunuzda Input.GetAxis(“Horizontal”) kullanıyor idiyseniz, onu SimpleInput.GetAxis(“Horizontal”)’a çevirmeniz (aynı şeyi “Vertical” için de yapın). Takıldığınız yer olursa yasirkula@gmail.com‘a mail atabilirsiniz.

  26. ismail dedi ki:

    Hocam bir sorum daha olacaktı sizi rahatsız ettim. Şimdi Benim yaptığım top oyununda kamera topu güzelce takip ediyor. Simple inputta çalışıyor sorun yok. Ama kameranın topa bakış yönünü değiştirince mesela touch inputta sağa çektiğimde top farklı eksende gidiyor. Kameranın bakış yönüne göre gitmiyor. Bu değişkeni hangi kodu ekleyerek yapabilirim . Fotoğrafta kodlar var. teşekkürler

    https://i.hizliresim.com/PtB2OI.jpg

    • yasirkula dedi ki:

      Kameranın Transform’unu kameraTransform diye bir değişkende tuttuğunuzu varsayarsak:

      Vector3 ileri = kameraTransform.forward;
      Vector3 sag = kameraTransform.right;
      ileri.y = 0f;
      sag.y = 0f;

      Vector3 vec = ileri.normalized * dikey + sag.normalized * yatay;

  27. ismail dedi ki:

    üstad acil yardımıa ihtiyacım var. Bu paylaştığınız example dosyasına tıkladım bir ekran çıktı dont save dedim. Örnek sayfa çıktı sorun yok. Ama unityi kapatıp açtığımda kendi kayıtlı projeme ulaşamıyorum tıklayınca tekrar bu example görüntüsü geliyor. Kaydetmeme rağmen kayıtlı projem silindi mi ? ulaşmam mümkünmü teşekkürler

    • yasirkula dedi ki:

      Project panelinin arama kısmına t:Scene yazıp sahnenizi bulabilirsiniz. Eğer sahnenizi hiç kaydetmediyseniz, Don’t Save “kaydetme” demek olduğu için sahnenizi tekrar oluşturmanız gerekebilir.

      • ismail dedi ki:

        Hocam hallettim. open scene tıklayıp açılan ekranda asset klasöründeki scenes dosyasının içindekini seçince bütün hiyerarşi geri geldi.

  28. ali dedi ki:

    sağolun sayenizde hallettim. youtubede 10 tane video izlemiştim yapamamıştım . buraya bakarak şimdi 1 dakikada yaptım.

  29. sezer bulanık dedi ki:

    void Rotasyon()
    {
    kafakemarasi.transform.position = transform.position + kameraArasiMesafe;
    kafaRotUstAlt += SimpleInput.GetAxis(“Mouse Y”) * Time.fixedDeltaTime * -150;
    kafaRotSolSag += SimpleInput.GetAxis(“Mouse X”) * Time.fixedDeltaTime * 150;
    kafaRotUstAlt = Mathf.Clamp(kafaRotUstAlt, -20, 20);
    kafakemarasi.transform.rotation = Quaternion.Euler(kafaRotUstAlt, kafaRotSolSag, transform.eulerAngles.z);
    if (horizontal != 0 || vertical != 0)
    {
    Physics.Raycast(Vector3.zero, kafakemarasi.transform.GetChild(0).forward, out hit);
    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(new Vector3(hit.point.x, 0, hit.point.z)), 0.5f);
    }
    }
    hocam benim şöyle mause kamera kontrol kodum var ama ben bunu mause değilde dokunmatik yani toucpad ile nasık yaparım

    • yasirkula dedi ki:

      Canvas objenizde yeni bir RectTransform oluşturup tüm ekranı kaplamasını sağlayın ve buna Touchpad component’i verin. “Allowed Mouse Buttons”ın içini boşaltıp “X Axis”i “Mouse X”, “Y Axis”i “Mouse Y” yapın. Son olarak da RectTransform’un Hierarchy’de canvas’ın diğer child objelerinin yukarısında yer aldığından emin olun.

  30. Darqhawq dedi ki:

    Kardeş ben kodu buraya yapıştırıyorum bunu android tuşu yapmak için nasıl bir kod gerekiyor? Sen çevirip bana verir misin kaç gündür bulamadım da

    public void sola_btn()
    {
    if (Input.GetKey(KeyCode.LeftArrow))
    {
    transform.Translate(-hiz * Time.deltaTime, 0, 0);
    }
    }

    şimdi ben kontrol için buton yaptım bu butona bu değeri veriyorum ama sadece klavyeden basınca çalışıyor normal butona basınca çalışmıyor onu nasıl yaparız?

    • yasirkula dedi ki:

      Kontrol için yaptığınız butona KeyInputUI component’i verip Key’i LeftArrow yapın. Ardından Input.GetKey fonksiyonunuzu da SimpleInput.GetKey yapın.

      • Darqhawq dedi ki:

        Hocam çok sağol ya adamın dibisin sen ya o kadar kod denedim olmadı bu dediğin işe yaradı teşekkürler…

  31. Darqhawq dedi ki:

    if (Input.GetKey(KeyCode.LeftArrow))
    {

    transform.Translate(-hiz * Time.deltaTime, 0, 0);

    bu şekildeki bir kodu nasıl android uyumlu hale getirebilirim?

  32. Faruk dedi ki:

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

  33. 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.

  34. 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?

  35. 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.

Cevap Yazın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.