Gelişmiş Girdi (Enhanced Input)
Gelişmiş Girdi (Enhanced Input), Epic Games’in oluşturduğu ve Papağan’da kullandığımız birinci taraf bir eklentidir. Unreal Engine 5’in en son sürümünü kullanıyorsanız, varsayılan olarak etkinleştirilmiş gelir. Etkin olduğunu Düzenle > Eklentiler bölümüne gidip onay kutusunu seçerek doğrulayabilirsiniz.
Gelişmiş Girdi, Unreal Engine’in varsayılan girdi sisteminin yerini alır ve karmaşık girdi işleme veya çalışma zamanı kontrolü yeniden eşlemesi için standarttır. Epic Games’in resmi dokümantasyonu, sistem hakkında eksiksiz bir genel bakış sunar ve girdi öğelerinizi nasıl ayarlayacağınızı anlatır.
Temel Kavramlar
Resmi dokümantasyonu tekrarlamak gerekirse, Gelişmiş Girdi ile ilgili anlamanız gereken temel kavramlar şunlardır:
Girdi Eylemleri
Girdi Eşleştirme Bağlamları (IMC’ler)
Girdi Değiştiricileri
Girdi Tetikleyicileri
Unity’nin yeni girdi sistemini kullandıysanız bu kavramlara aşinasınızdır.
Girdi Eylemleri, en iyi şekilde, oyunun belirli bir bağlamında “oyunda gerçekleştirilecek eylemin ne yaptığı” olarak düşünülebilir. Örneğin karakteriniz bir arabanın içindeyse, “Hızlan” veya “Frenle” eylemlerine ihtiyacınız olacak.
Girdi Eşleştirme Bağlamları da bu örnekle çalışır. Oyuncu arabaya girer veya arabadan çıkarsa, belirli tuşların veya oyun kumandası düğmelerinin işlevlerini değiştirmeniz gerekebilir.
Girdi Tetikleyicileri, tüm tetikleyici koşullar karşılanmadıkça eylemlerin tetiklenmesini engeller. Örneğin bir eylemi tetiklemek için oyuncunun bir düğmeyi belirli bir süre basılı tutmasını isteyebilirsiniz.
Girdi Değiştiricileri girdinin kendi değerini değiştirir. Ölü Bölgeler, ham girdi değerlerini kolaylaştırmak için kullanılan yaygın bir girdi değiştiricisidir. Gelişmiş Girdi, bazı ayarlar sayesinde tüm bu sorunları sizin için çözer.
Papağan’daki bir örneğe bakalım. İçerik/Girdi/Oynanış altında bir Eylemler (Actions) klasörü ve bir IMC_Gameplay öğe dosyası bulacaksınız. Eylemler klasöründe IA_Jump öğesini bulun.
Buradaki değer türü Dijital (bool) olup bu eylemin çıktı türünü belirtir. Tetikleyiciler altında aşağıdaki türler yer alır:
Basılı
Serbest Bırakılan
Bu Girdi Eylemine baktığınızda, eşlenmiş tuş veya düğmenin basıldığında tetiklenmesi ve bool çıktı durumuna sahip olması gerektiğini anlayabilirsiniz. Düğmenin bırakılması eylemin sona ermesini tetikler. Buradaki bir diğer önemli ayrıntı ise hem tetikleyicilerin hem de değiştiricilerin bir girdi eşleştirme bağlamı tarafından geçersiz kılınabilmesidir. Değiştiricilerin geçersiz kılınmasını uygulamada görmek için oynanış girdi eşleştirme bağlamına bir göz atalım.
IA_MoveAxis üzerinde tetikleyici ayarlanmamıştır, bu yüzden bir değişiklik algılandığında Oyun Kumandası Sol Analog Çubuk X Eksenine ait değer hemen okunacaktır. Ham giriş değerlerini kolaylaştırmak için, üst ve alt girdi sınırlarını ayarlamak üzere bir ölü bölge değiştiricisi kullanıyoruz.
IMC’de geçersiz kılma sağlamadığımız bir örnek, zıplama eşleştirmesidir.
Burada, tetikleyicinin girdi eyleminin kendisinden geldiğini göreceksiniz, bu nedenle eşleştirmede bir tetikleyici tanımlamanız gerekmez. Ayarlar da eylemden devralınır ama bu konu yeniden eşleştirme kısmında ele alınacağı için şimdilik bunu yok sayabilirsiniz.
Gelişmiş Girdi Olay Dinleyicileri
Artık öğeleriniz ayarlandığına göre çalışma zamanı kullanımı için bazı ayarlamalar yapmanız gerekir. Papağan’da BP_ParrotPlayerController içinde olay dinleyicilerimizi ayarlamak için Gelişmiş Girdi Yerel Oyuncu Alt Sistemi’ne bağlanırız. BeginPlay düğümünün dışına IMC_Gameplay için eşleştirme bağlamı ekliyoruz.
Öncelik parametresi burada önem taşır. Girdi Eşleştirme Bağlamları önceliklerine göre değerlendirilir, bu yüzden bağlamları katmanlarken bunu göz önünde bulundurun. Şimdilik sadece oynanış bağlamını kullanacaksınız.
Burada Kullanıcı Ayarlarını Bildir parametresinin true olarak ayarlandığını unutmayın. Bu daha sonra Çalışma Zamanı Girdi Yeniden Eşleştirmesi için gereklidir.
Eşleştirme bağlamınız hazır olduğunda geriye sadece ilgilendiğiniz eylemlere Gelişmiş Girdi olay düğümlerini eklemek kalır. Zıplamanın bir örneği şöyledir:
Eylem, oyuncu düğmeye bastığında başlar ve oyuncu düğmeyi bıraktığında tamamlanır. Diğer girdi türlerinin nasıl işlendiğini görmek için BP_ParrotPlayerController içindeki girdi eylemlerinin geri kalanına göz atın. İsterseniz C++ içinde de girdi olaylarını bağlayabilirsiniz. Bu konu resmi dokümantasyonda ele alınmaktadır.
Çalışma Zamanı Girdi Yeniden Eşleştirmesi
Gelişmiş Girdi, çalışma zamanında girdi eylemlerine bağlı tuşları yeniden eşleştirme becerisine sahiptir. Bu özellik çalışıyor olsa da hâlâ deneysel olduğunu belirtmek gerekir, dolayısıyla bu özellik ile son ürün göndermeye çalışırken dikkatli olun. Papağan’da, oyuncunun tuşları yeniden eşleştirmesine olanak sağlayan Tuş Atamaları ekranı bulunur. Bunu başarmak için, Gelişmiş Girdi’yi Epic Games’in Yaygın Kullanıcı Arayüzü (Common UI) eklentisi ile birleştirerek ekranın widget’larına doğru meta verileri sağlıyoruz. Yaygın Kullanıcı Arayüzü ayarları Kullanıcı Arayüzü dökümantasyonunda ele alınmıştır ve devam etmeden önce bu bölümü okumalısınız. Bu eklenti kurulduğunda platforma özgü kullanıcı arayüzü elemanlarını da görüntüleyebilirsiniz.
Başlamak için proje ayarlarımızda Gelişmiş Girdi için Kullanıcı Ayarları bölümünü etkinleştirin. Bu, Düzenle > Proje Ayarları > Motor > Gelişmiş Girdi altında yer alır. Ayarlarınızı aşağıdaki gibi yapın:
Ardından bir Girdi Eylemi öğesine gidin ve Oyuncu Tarafından Eşleştirilebilen Tuş Ayarları’nı düzenleyin. Ad alanının tüm girdi eylemlerinizde benzersiz olması gerekir. Görünen Ad ve Kategori, Papağan’da yerelleştirilmiştir.
Oyuncu Tarafından Eşleştirilebilen Tuş Ayarları, IMC’de bir tuş tanımlanırken de geçersiz kılınabilir. Oynanış IMC’sindeki zıplama eylemi için bu ayarı “Ayarları Eylemden Devral” olarak bıraktık, böylece orada özel bir şey yapmamıza gerek kalmadı.
Girdi eşleştirme bağlamınızı oyuncu denetleyicisi blueprint’ine eklediğinizde Kullanıcı Ayarlarını Bildir parametresinin true olarak ayarlandığını doğrulayın.
Bir sonraki bölümde, Gelişmiş Girdi (Enhanced Input) eylemlerini Yaygın Kullanıcı Arayüzü (Common UI) ile nasıl bağlayabileceğimizi ele alacağız. Papağan’da Girdi Yeniden Eşleştirme için gerekenleri ele alacağız ancak bu dokümantasyon resmi Yaygın Kullanıcı Arayüzü Hızlı Başlangıç Kılavuzu’nu tamamlayıcı niteliktedir.
Sonraki adım için, İçerik/Girdi/Kullanıcı Arayüzü altında yeni bir IMC oluşturduk: IMC_UI_Generic.
Her girdi eyleminde Oyuncu Tarafından Eşleştirilebilen Tuş Ayarları alanını ayarlamalı ve uygun kullanıcı arayüzü meta verileri veri öğesine yönlendirmelisiniz. İşte genel “Kabul Et” girdi eylemi ve meta veri öğesinin bir örneği.
IMC ve girdi eylemleri; Yaygın Kullanıcı Arayüzü’nün, kullanıcı arayüzü navigasyonu tarafından çağrılan eylemler hakkında bilgi sahibi olması için gereklidir. Genel Kabul Et ve Geri Dön girdi eylemleri bunun başlıca örnekleridir çünkü oyuncu kullanıcı arayüzü ekranlarında gezinirken her zaman bunları çağırmak isteyecektir. Bu eşleştirmeleri, CommonUIInputData’dan alt sınıflar oluşturan CommonUI’a özgü bir veri blueprint’inde tanımlıyoruz.
Ardından Düzenle > Proje Ayarları > Yaygın Girdi Ayarları altında, girdi verilerini kendi genel girdi verileri blueprint’inize ayarlayın.
Önemli alanları ayarladıktan sonra widget ekranlarınızı ayarlamaya geçebilirsiniz. Statik ekranlar için temel bir Papağan Ekranı sınıfı ve diğerleri için ise etkinleştirilebilir bir sınıf ile başlarsınız. Statik ekranlar gösterge panellerine benzer, yani kullanıcı arayüzü navigasyonunu düşünmenize pek gerek yoktur. Etkinleştirilebilir bir örnek olarak duraklatma menüsünü verebiliriz çünkü geri düğmesine ne zaman basıldığını bilmesi gerekir ve oyun dizilimindeki Menü katmanında bulunur.
Ekran hiyerarşisi Kullanıcı Arayüzü dökümantasyonunda ele alınıyor ama referans olması için burada tekrarlanmıştır:
BP ekranlarının sınıf varsayılanlarında isteğe bağlı bir girdi eşleştirme bağlamı ayarlıyoruz. Bu, widget etkinleştirildiğinde/devre dışı bırakıldığında uygulanır ve bunu her sınıf için geçersiz kılabilirsiniz.
UParrotActivatableScreen, geri dön eylemlerini işlemek için bir uygulamaya sahiptir. IA_UI_GenericBack olay dinleyicisi, onu kullanan türetilmiş blueprint’lerin olay grafiğinde tanımlanır. Geri Dönme İşleyicisi onay kutusunu da Ayrıntılar panelinde etkinleştirmelisiniz.
Geri dönme örüntüsünün farklı ekran widget’larında nasıl kullanıldığını görmek için C++ sınıfındaki ve BP’deki yorumlara bakın.
Temel sınıflar tamamlandıktan sonra, tuş atamaları ekranınıza göz atın. WBP_KeyBindingsScreen, İçerik/Kullanıcı Arayüzü/Widget’lar/Ekranlar altında bulunur. Olay grafiğini kendi başınıza gözden geçirerek, Gelişmiş Girdi’den Oyuncu Tuş Eşleştirmesi türlerini çekmek için Kullanıcı Ayarları ve Tuş Profili’nin nasıl sorgulandığını görebilirsiniz. Veriler WBP_InputSelectorBox widget’larını eklemek ve doldurmak için kullanılır. WBP_InputSelectorBox widget’ı içinde iki W_ParrotInputSelector widget’ı bulacaksınız.
Bir tanesi oyun kumandası girdileri, diğeri ise klavye girdileri için kullanılır. Papağan Girdi Seçicisi, yerleşik Girdi Seçici (Input Selector) widget’ından esinlenen özel bir widget’tır. Bu widget’ların her ikisi de bir seçim durumuna girer, bir girdi bekler ve ardından ekranı günceller:
Fare ve klavye için, Gelişmiş Girdi alt sisteminden dönen metinle çalışıp ekranı güncelleriz.
Oyun kumandası uygulaması, kumandaya/kontrol cihazına özgü görselleri sorgulamak için Yaygın Kullanıcı Arayüzü’ne bel bağlar. Bu örnekte, Xbox görüntüleri için
İçerik/Girdi/Kullanıcı Arayüzü/PlatformaltındaCommonInput_Gamepad_Xboxadında bir tane oluşturduk. Bu sınıfUCommonInputBaseControllerData’tan türetilir.
Bu sınıftan türetilerek, girdi tuşlarını görseller içeren fırçalara eşleştirebilirsiniz. Sonraki adım olarak, Düzenle > Proje Ayarları > Yaygın Girdi Ayarları altında oyun kumandası verilerini ayarlayın ve ardından platforma gidin.
Bu veriler bağlandığında, işin geri kalanı widget’larda gerçekleşir. UParrotInputSelector ve WBP_InputSelectorBox içindeki kod ve yorumları, Gelişmiş Girdi ve Yaygın Kullanıcı Arayüzü alt sistemlerini kullanarak yeniden eşleştirme özelliğinin tam olarak nasıl çalıştığını görmek için inceleyebilirsiniz.
Vurgulanması gereken son önemli işlev de eşleştirilen tuşların nasıl kaydedildiğidir. Bu işlem, WBP_KeyBindingsScreen içindeki SaveKeyMappings’te gerçekleşir. Bu fonksiyon, tüm seçici kutu widget’larını yineler ve ardından kullanıcı ayarlarının yerleşik Ayarları Uygula ve Ayarları Kaydet fonksiyonlarını kullanır. Ayarları Kaydet diske bir oyun kayıt dosyası olan EnhancedInputUserSettings.sav’ı yazar. Proje Dizini > Parrot > Saved-SaveGames altında bulunur.
Her şey doğru ayarlandıysa çalışan bir tuş atamaları ekranınız olur!
Sağ alt köşede, tuş yeniden eşleştiğinde güncellenen bir eylem widget’ı olduğunu görürsünüz. Bu widget WBP_ParrotGamepadActionWidget’tır ve İçerik/Kullanıcı Arayüzü/Widget’lar/Yaygın altında yer alır. Daha önce oluşturduğumuz ortak girdi verilerini kullanarak, girdi eylemine göre platforma özgü simgeler göstermek için oluşturulan Yaygın Kullanıcı Arayüzü’nün UCommonActionWidget sınıfını yoğun olarak kullanır. Yaygın Kullanıcı Arayüzü’nden yararlanarak rahatlıkla oyununuzun Gelişmiş Girdi eylemlerine referans veren yeni widget’lar oluşturabilirsiniz.