Düşman Karakterler
Unreal Engine’da NPC’ler ve düşmanlar genellikle, düşmanın da bir denetleyicisi ve bir piyonu olması bakımından oyuncuya çok benzer bir şekilde kurulmuştur. Hatta düşmanlar ile oyuncu, AParrotCharacterBase adlı ortak temel sınıfta bazı paylaşımlı işlevlere sahiptir. Papağan oyununda düşman davranışlarını kontrol etmek için davranış ağaçları kullanılır, bu yüzden düşman denetleyicilerimizi oluşturmak için Yapay Zekâ Denetleyici sınıfı kullanılmaktadır. Animasyon blueprint’i kurulumu düşmanlar genelinde paylaşıldığından öncelikle animasyon blueprint’iyle ilgileneceğiz.
Düşman Animasyon Blueprint’leri
Animasyon Blueprint’i Şablonları
Animasyon için aynı ihtiyaçları paylaşan birden fazla iskelet örgünüzün olduğu durumlarda, “animasyon blueprint’i şablonu” adı verilen bir şablon oluşturabilirsiniz (bkz. Animation Blueprint Linking). Bu örnekte, başsız iskelet, iskelet, köpekbalığı ve boss köpekbalığı olmak üzere dört farklı düşman türü vardır. Hepsi aynı iskeleti ve animasyon yapılandırmasını paylaştığı için animasyon grafiğini ve olay grafiğini uygulayan tek bir şablon hepsi için yeniden kullanılabilir. Bu şablonun nasıl kurulduğunu şurada görebilirsiniz: Blueprint’ler > Düşman > EnemyBase > ABT_EnemyBase. Şablon, oyuncunun animasyon blueprint’ine çok benzerdir çünkü o animasyon blueprint’iyle hemen hemen aynı şekilde kurulmuştur.
Animasyon Blueprint’leri
Bu örnekte uygulamanın tamamı şablonda iken animasyonların kendisi mevcut değildir, çünkü şablon belirli bir iskelete referans vermemektedir. Düşmanların her birinin, şablondan türetilmiş olan kendi animasyon blueprint’i vardır ve her birinin animasyon grafiği geçersiz kılmalarında o iskeletin animasyonları yuvalara yerleştirilmiş durumdadır. Bunun bir örneğini şurada görebilirsiniz: Blueprint’ler > Düşman > HeadlessSkeleton > ABP_Enemy_HeadlessSkeleton.
Aşağıda, her animasyon durumu için başsız iskeletin iskelet örgüsüne uygun olacak şekilde seçtiğimiz animasyonları görebilirsiniz.
Düşman Piyonu
Papağan’ın düşman karakterleri oyuncuyla pek çok ortak işlevselliğe sahiptir (özellikle can puanları ve ölüm gibi). Bu ortak uygulama, AParrotCharacterBase’de görülebilir. Düşmana özgü uygulama için, AParrotEnemyCharacterBase adında bir alt sınıfımız vardır. Devriye sisteminin ve çatışmanın çalışma biçimleri ve daha fazlası ile ilgili tüm uygulamaları bu alt sınıf yönetir. Papağan’da Çatışma dokümantasyonunda, çatışmanın nasıl çalıştığı konusunda daha fazla bilgi edinebilirsiniz.
Bu kurulumda, çatışma isabet ve hasar kontrolleri düşman üzerinde, aşağıda yer alan blueprint temel sınıfında bölgelerin/etki aktörlerinin nasıl tetikleneceğine dair bir uygulama ile yapılır: Blueprint’ler > Düşman > EnemyBase > BP_EnemyCharacter_Base.
Bu uygulama, yerel C++ sınıfında işlenmek yerine burada yapılır, çünkü tetikleme bölgeleri, düşmanlara dair farklı şekiller, boyutlar ve bunların örgülerinin karmaşıklıkları nedeniyle her düşman için farklı olmak zorundadır. Bu gereklidir, çünkü devralınan bir tetikleme bölgesi türetilen sınıfta değiştirilemez.
Düşman Yapay Zekâ Denetleyicisi
Daha önce belirtildiği gibi, düşmanlar davranış ağaçları ile kontrol edilir, dolayısıyla AParrotEnemyAIControllerBase’deki AIController’dan türetilmiş bir temel sınıf vardır. Burada, davranış ağaçları tarafından kullanılacak verilerin karatahtaya gönderilmesi için kullanılan çeşitli BlueprintImplementableEvent’ler göreceksiniz.
Yapay Zekâ Denetleyici’nin davranış ağacına verileri nasıl ilettiğini ve oyuncu varlığı tespitini nasıl işlediğini Blueprint’ler > Yapay Zekâ > EnemyBase > BP_EnemyController_Base kısmında görebilirsiniz.
Davranış Ağaçlarıyla Yapay Zekâ Oluşturma
Unreal Engine, davranış ağaçlarını kullanarak yapay zekâ oluşturmak için güçlü ve esnek bir altyapı sunar. Bazı davranışları içeren temel standart yapının kurulumuna yönelik başlangıç adımlarını Behavior Tree Quick Start Guide’nda bulabilirsiniz. Bu kılavuzdan elde edilen sonuçlar düşman yapay zekâsının temeli olarak ve ihtiyaç duyulan davranışları ayarlamak üzere değişiklikler yapmak için kullanılır.
Oyuncu etrafında devriye gezmek ve ona saldırmak için gereken temel işlevselliği sağlayacak olan iki davranış ağacı görevimiz vardır: Blueprint’ler > Yapay Zekâ > EnemyBase > BTT_FindNextPatrol ve Blueprint’ler > Yapay Zekâ > EnemyBase > BTT_AttackPlayer. Tüm özellikleri destekleyecek olan altyapı her düşmanda mevcut olduğundan bir tane paylaşımlı karatahta vardır: Blueprint’ler > Yapay Zekâ > EnemyBase > BB_Enemy_Base. Düşman davranışlarını özelleştirmek için hangi işlevselliğin kullanılacağına karar vermek davranış ağacı uygulamasına kalmıştır.
Düşmanların her birinin farklı bir davranış ağacı yapılandırması vardır; böylece her biri farklı şekilde davranır. Aşağıdaki konumlarda bunların dördünü de inceleyebilirsiniz:
Blueprint’ler > Yapay Zekâ > HeadlessSkeleton > BT_HeadlessSkeleton
Blueprint’ler > Yapay Zekâ/İskelet > BT_Skeleton
Blueprint’ler > Yapay Zekâ > Köpekbalığı > BT_Sharky
Blueprint’ler > Yapay Zekâ > BossShark > BT_Boss_Shark
Düzenlenebilir Bir Devriye Ara Noktası Sistemi Oluşturma
Papağan, düşmanlar için, davranış ağacı kılavuzunun gösterdiği devriye işlevselliğinin (düşman yapay zekâsının bir yarıçap içinde her 4 saniyede bir rastgele bir şekilde gezilebilir bir nokta seçtiği) aynısını istemez. İstenen şey, diğer birçok platform oyununda olduğu gibi, düşmanların bir devriye rotasını, bir ileri bir geri giderek aktif bir şekilde izlemesidir.
Bunun için Papağan ihtiyaç duyulan işlevselliği sağlayan kendi sistemini oluşturmuştur. Bu sistem, bir devriyeyi düzenlemek için sahneye yerleştirilebilecek olan UParrotEnemyPatrolRigComponent’tan oluşur. Bir eğriyi örneklemek için sınıfın varsayılan alt objelerini kullanır. Eğri, devriye ara noktalarını, iki tetikleme bölgesini (yapay zekâ davranışını tetiklemek için kullanılan) ve ara noktaların sıralamasını çizen, editöre özel bir görselleştiriciyi düzenlemek için kullanılır. Ara noktalarının sıralanması, devriye yolunun yönünün düzenleme zamanında görülmesini sağlar. C++ uygulamasının ayrıntılarını UParrotEnemyPatrolRigComponent’ta görebilirsiniz.
Bu uygulama, bir devriye donatımının (rig) bir sahnedeki herhangi bir aktöre bağlanabilmesini sağlayan bir bileşendir. Bu şekilde, bir donatım, hareketli bir objenin üzerine yerleştirilebilir ve devriye yerel alanda her zaman doğru şekilde yerleştirilmiş olarak kalır. Bir sahnedeki mevcut bir aktöre bağlı olmayan bir devriye donatımı yerleştirmek için, bir sahnede herhangi bir yere yerleştirebileceğiniz ve kendi üzerinde varsayılan bir alt obje olarak bir UParrotEnemyPatrolRigComponent çıkaran bir aktör olan AParrotEnemyPatrolRigActor’ımız vardır.
Bu uygulama, çalışma zamanında devriye yolunu takip edecek şekilde çıkarılmak üzere bir düşman seçilmesine olanak tanır. Bu işlem, ertelenmiş aktör ortaya çıkarma adlı bir Unreal Engine özelliğini kullanır. Bu özellik, bir aktörün iki aşamada çıkarılabilmesini sağlar. İlk aşama, BeginPlay gibi herhangi bir AActor başlatması gerçekleştirmeden aktör objesini oluşturur. Bu size, aktörün başlatılmadan önce sahip olması gereken herhangi bir yapılandırmayı veya kurulumu gerçekleştirme fırsatını verir. Bu kurulumu yaptıktan sonra çıkarmayı sonlandırmak ve aktörü başlatmak için ikinci aşamayı çağırırsınız. Bu, devriye donatımı için yapılır; böylece düşman aktörü ortaya çıkarıldığında devriye eğrisi ve tetikleme bölgeleri aktöre aktarılarak bunlar aktör başlatma sırasında işlenebilir ve devriye sekansı otomatik olarak başlayabilir.
Ertelenmiş aktör ortaya çıkarma işlemini gerçekleştiren kodu UParrotEnemyPatrolRigComponent içinde görüntüleyebilirsiniz. Özellikleri, aktörün başlatılması gerçekleşmeden önce ayarlanan bağımsız değişkenleri çıkarma blueprint düğümüne iletmenize olanak tanıyacak şekilde bir blueprint aktöründe Doğduğunda Kullanıma Aç olarak etiketleyebileceğiniz benzer bir özellik blueprint’te de mevcuttur.
Aşağıda, bu devriye donatımlarından birinin Haritalar > Level_1 > Level_1 kısmında sağdaki 0 noktasından başlayarak iki noktalı bir devriye donatımıyla nasıl kurulduğuna dair bir örnek görebilirsiniz. Devriye donatımı, bir BP_EnemyCharacter_Skeleton çıkaracak şekilde ayarlanmıştır.
Aşağıda, düzenleme zamanında kolay tanımlama için devriye donatımı ara noktalarını tanımlamak üzere Gösterim İşareti açma/kapatma menüsü bulunmaktadır. Çoğu gösterim işareti onay kutusu seçilmiştir. Bunun nasıl uygulandığına dair ayrıntıları editöre özel bir görselleştirici bileşeni olan UParrotPatrolRigDebugVisualizer’da görebilirsiniz.