Unreal Engine’da Bir Karakterin Parçaları Nelerdir?
Oyun Modu / Oyun Durumu bölümünde belirtildiği gibi, Unreal Engine oynanış altyapısı, Unreal Engine’da karakterlerin nasıl çalıştığını anlamanıza yardımcı olur. Kavramsal olarak bir oyuncu, oyun dünyasındaki fiziksel varlığı temsil eden bir piyondan ve davranışı belirleyen bir denetleyiciden oluşur. Bu ayrıştırma, yapay zekânın yanı sıra ağ çoğaltması için de faydalıdır. Referans olması açısından hiyerarşi şu şekilde görünür:
Öncelikle öğeleri içe aktaralım, piyonu oluşturalım ve böylece oyuncu denetleyicisine kadar ilerleyelim. Papağan’da, oyuncu tarafından kontrol edilen kahramanımız Kaptan Barbarossa olacak (Quaternius tarafından sağlanan Pirate Kit’i almak için Quaternius web sitesini ziyaret edin).
Sanat Öğelerini İçe Aktarma
Tercih ettiğiniz bir 3D modelleme aracında, örgünüzü/animasyonlarınızı motorla uyumlu bir formata aktarın. Bu örnekte geliştiriciler .fbx formatını kullandı. Barbarossa’nın öğeleri İçerik/Öğeler/Quaternius/PirateKit/Karakterler/Barbarossa dizini altındadır. .fbx dosyanızı, bağlam menüsüne sağ tıklayarak veya dosyayı sürükleyip İçerik Tarayıcısı’na bırakarak içe aktarabilirsiniz. .fbx içe aktarma ayarları penceresi ile karşılaşacaksınız. İçe aktarma için uygun seçenekleri seçin. Bu örnekte, mevcut bir iskeletin seçilmediğinden ve Animasyonları İçe Aktar seçeneğinin işaretli olduğundan emin olun. Ayrıca, örgünüz tarafından dizinlenebilecek yeni bir atlas materyali oluşturmanız da gereklidir. Bu materyal Pirate Kit’teki öğeler genelinde yeniden kullanılabilir. Artık .fbx dosyanızda bu 3 dosyaya ve dahil edilen tüm animasyonlara sahip olmalısınız.
Temizlik açısından, Animasyon Sekansı dosyaları, 3 dosyanın yanındaki Animasyonlar klasörünün altında yer alır:
İskelet, İskelet Örgü ve Fizik Öğeleri
İskelet, bir iskelet örgüde kemikleri (bazen eklemler olarak adlandırılır) tanımlamak için kullanılan bir hiyerarşidir. Bu kemikler 3D modelleme aracınızdaki donatımla (rig) uyumlu olmalıdır. İskeletler, donatımlar uyumlu olduğu sürece iskelet örgüler genelinde yeniden kullanılabilir. Bir fizik öğesi (physics asset) oluşturulduğunu da fark edeceksiniz. Fizik öğeleri, bir iskelet örgünün kullandığı fiziği ve çarpışmayı tanımlar. Simülasyon için katı (rijit) gövdeler ve kısıtlamalar içerirler. Her iskelet örgü için yalnızca bir fizik öğesine sahip olabilirsiniz ve bunlar koşullu olarak açılıp kapatılabilir. Fizik öğelerini, bunlar içe aktarılırken düzenleyebilir veya bir iskelet örgüden yeni öğeler oluşturabilirsiniz.
Animasyon Blueprint’i
Artık üzerinde çalışabileceğiniz bir iskelet örgü olduğuna göre onu Animasyon Blueprint’i ile animasyonlu hale getirmeye başlayabilirsiniz. Animasyon Blueprint’i, Unity’nin Mecanim Animation System’ine benzerdir. Animasyon Blueprint’leri içindeki Animasyon Grafiği size tanıdık görünecek ve benzer şekilde çalışacaktır. Her iki sistemde de animasyon durumlarını bir son çıktı pozuna geçirebilecek koşullu mantık akışı vardır. Klasörünüzde, bağlam menüsünden yeni bir Animasyon Blueprint’i oluşturun ve örgünüzü seçin. Animasyon Blueprint’imizin adı ABP_Captain_Barbarossa olacak ve bu blueprint, İçerik/Blueprint’ler/Oyuncu altında yer alacaktır.
Blueprint Denetçisi’nin sol tarafında Olay Grafiği ve Animasyon Grafiği olmak üzere iki grafik olduğunu göreceksiniz. Animasyon grafiği, son çıktı pozunuzu kontrol eden durum makinesidir. Olay grafiği ise animasyonla ilgili her türlü mantığı tanımlayabileceğiniz yerdir. Unity’de Mecanim bileşenine veri iletmeniz gerekirken, Animasyon Blueprint’leri belirli bir olayda ihtiyaç duydukları verileri çekebilir. Örneğin, karakterin hızını sorgulamak ve animasyonunuzu bu değere göre yönlendirmek isteyebilirsiniz. Bunu yapmanın temiz bir yolu, olay grafiğindeki Olay Blueprint’i Animasyonu Başlat Düğümü’nü ve Sahip Olan Aktörü Al’ı kullanmak ve karakterin hareket bileşenini bir değişkende önbelleğe almaktır. Sonrasında, BlueprintThreadSafeUpdateAnimation’ın her tikinde hızı doğrudan hareket bileşeninizden sorgulayabilirsiniz. Değişkenler, olay grafiği ve animasyon grafiği arasında da paylaşılabilir.
Barbarossa’nın yapılandırılmış Animasyon Blueprint’ini kendi başınıza daha fazla keşfetmeniz uygun olacaktır. Düğümlere çift tıklayarak durum makinelerinin, durumların ve durum kurallarının son çıktı pozu için nasıl yapılandırıldığını görebilirsiniz. Ayrıca, sekans oynatıcısı ve karışım alanı kullanımlarına dair örnekler de bulunur. Benzer şekilde, olay grafiği, animasyonun karakter verileri tarafından nasıl yönlendirildiğini gösterir. Bu ilişki bu makalenin devamında daha da netleşecektir.
Piyon
Artık animasyonlu hale gelebilecek bir iskelet örgü olduğuna göre Oyun Modu tarafından kullanılacak piyonunuzu oluşturmaya başlayabilirsiniz. Geliştiriciler bunu, varsayılan piyon C++ sınıfının bir alt sınıfı olan, Unreal Engine’in varsayılan karakteri üzerine inşa etmeyi tercih etti. Karakter sınıfının, bu oyun için özellikle kullanışlı olan ve üzerine yeni şeyler inşa edilebilecek başka bir sınıf olan Karakter Hareketi bileşeni vardır.
Hem oyuncu hem de düşman piyonları, can puanı, isabet alma ve ölüm gibi bazı ortak işlevlere sahiptir. Bu işlevler, ACharacter’dan devralan AParrotCharacterBase C++ sınıfı oluşturularak paylaşılır. Bu sınıf, düşman ve oyuncu piyonlarının davranışlarında farklılıklar olduğundan üzerine inşa edilebilecek iyi bir temel sağlar.
Sonraki adımda, oyuncuya özgü mantığı işlemek için AParrotPlayerCharacter C++’ını oluşturun. Son olarak, karakterinizin görsel temsilini işlemek üzere bir blueprint oluşturacaksınız. Papağan’ın blueprint’i, İçerik/Blueprint’ler/Oyuncu altındaki BP_ParrotPlayerCharacter’dır. Devralma hiyerarşisi şöyle görünür:
BP_ParrotPlayerCharacter’ı açtığınızda, editör penceresinin sol tarafındaki bileşen denetçisinin altında bazı bileşenler görmelisiniz. Örgü Bileşeni, İskelet Örgü Öğesi’ni ve Animasyon Sınıfı altındaki animasyon blueprint’ini ayarlayabileceğiniz yerdir. Örgü doğru konumlandırılmamışsa dönüştürme değerlerini kapsül bileşeninizle uyumlu olacak şekilde ayarlayabilirsiniz. Aşağıdaki gibi bir şey elde etmeniz gerekir:
Ardından, varsayılan piyon sınıfını oyun modu öğesindeki blueprint’e atayabilirsiniz.
Artık oyunda kullanabileceğiniz animasyonlu bir piyon var!
Oyuncu Denetleyicisi
Artık kullanılabilir bir piyona sahip olduğunuza göre oyuncu denetleyicisini oluşturabilirsiniz. Oyuncu denetleyicileri temelde insan oyuncunun iradesini temsil eder. Oyununuzu yaparken dikkat etmeniz gereken bir nokta da girdi olaylarını nereye tanımlayacağınızdır. Piyonların değişmediği basit oyunlarda bu iş için piyon uygundur. Ancak davranışlar karmaşıklaşmaya başladığında oyuncu denetleyicisi bunun için daha iyi bir seçenektir. Piyonlar geçicidir ve oyuncu denetleyicileri tarafından ele geçirilebilir veya elden çıkarılabilirler. Piyonlar çıkarılabilir veya yok edilebilirken, oyuncu denetleyicileri oyun boyunca kalıcıdır.
Oyuncu denetleyicisinde herhangi bir C++ mantığına ihtiyacınız olmayacaktır, bu yüzden ihtiyaç duyulan şeyi yapmak için bir blueprint oluşturmanız yeterlidir. BP_ParrotPlayerController, İçerik/Blueprint’ler/Oyuncu altında bulunur. Devralma hiyerarşisi şöyle görünür:
Blueprint’in içinde, temel bir oynanış mantığına yol açan girdi olay düğümlerinin olduğunu fark edeceksiniz. Bu girdiler özel olarak Gelişmiş Girdi ile ilgilidir. Bunun nasıl yapılandırıldığı konusunda daha fazla bilgiye Gelişmiş Girdi dokümantasyonunda erişebilirsiniz. Papağan Oyuncu Karakter Piyonu’nu, Oyunu Başlat’ta önbelleğe alarak onu daha sonra Hareket Girdisi Ekle, Zıpla ve StopJump gibi temel hareket fonksiyonlarını çağırmak için kullanabiliriz.
Şimdi test zamanı! Oyun Modu BP’de yeni oyuncu denetleyicisi sınıfını ayarlayın ve ardından denetleyiciyi oyunda kullanabildiğinizi doğrulayın:
Bölüm editöründeki bu açılır menüden doğru oyun modunun seçildiğini doğrulayın:
Son olarak, haritanızda bir PlayerStart aktörü ve görüntüleyebileceğiniz bir kamera olduğundan emin olun. Oynat düğmesine bastığınızda karakterinizin hareket ettiğini ve animasyonlu olduğunu görmelisiniz:
Papağan Karakter Hareketi Bileşeni
Temel ACharacter sınıfının yerleşik olarak pek çok harika işlevi vardır. Bunlara dair örneklerden biri de UCharacterMovement aktör bileşenidir. Karakter hareket bileşeni, bir karakterin dünyada nasıl hareket edeceğine dair tüm mantığı işler. Yürümeyi, koşmayı, düşmeyi, yüzmeyi, uçmayı ve özel hareket modlarını destekler. Temel karakter hareketlerinin nasıl çalıştığı ve aktör bileşenlerinin ne kadar güçlü olduğu hakkında bir fikir edinmek için bu bileşen, kendi başınıza keşfetmeye kesinlikle değerdir.
Papağan’da temel karakter hareketi bileşeni, geliştiricilerin başlangıçta aradığı oyun hissini vermedi. Ancak üzerine inşa edilebilecek sağlam bir temel sağladı. UParrotCharacterMovementComponent C++ sınıfı, UCharacterMovementComponent sınıfından türer. Dolayısıyla BP_ParrotPlayerCharacter içindeki CDO hareket bileşeninde yer alan hareket bileşenini şu şekilde ayarlayabiliriz:
Peki Papağan Hareketi Bileşeni aslında ne işe yarar? Bileşen, temel olarak, zıplamayla ilgili temel hareket bileşenindeki fonksiyonları geçersiz kılarak “platform oyunu tarzında” bir zıplama tanımlamanıza olanak tanır. Tasarımla ayarlanabilir bazı değerler kullanarak, bir zıplama gerçekleştiğinde oyuncu karakterinin yerçekimi ölçeğini ve zıplama hızını, sabit bir sürede bir tepe yüksekliğine ulaşacak şekilde değiştirebilirsiniz. Tepe noktasına ulaşıldığında, düşen bir yerçekimi ölçeği uygulamaya başlayabilirsiniz. Oyuncu zıplama girdisini erken serbest bırakırsa yerçekimi ölçeğini artırmak için bir çarpan uygulayabilirsiniz.
Sonuç olarak, yalnızca Z eksenine bir itiş uygulamak yerine bir platform oyunundan bekleyeceğiniz türden bir “his” veren bir zıplama elde edersiniz.
Temel karakter hareketi bileşeninin gücünden faydalanarak, Papağan hareket bileşeni mantığını yalnızca zıplamaya odaklayabilirsiniz. Hareket bileşenindeki BP_ParrotPlayerCharacter’a ilişkin denetçideki değerler de hareket bileşeninin tüm parçalarının nasıl birlikte çalıştığına dair tam bir fikir edinilmesi için bakılmaya değerdir. Hareket mantığı her türlü kullanım senaryosuna uyacak şekilde genişletilebilir.