Tanhu

Unreal MVP
22 Tem 2015
208
34
0
Belirtilmemiş
Araştırmalara ve uygulamalara devam ediyor ve bir şeyler yaparken de baya şey öğreniyorum.

nrJrDV.png


Kodda görüntüğü üzere Line Trace ile saldırı üzerine çalışıyorum ve kod gayet güzel çalışıyor. Weapon damage function'ı içerisinden silahları bölüyor ve oradan hasar bilgilerini "damage" adını verdiğim bir Blueprint pawn'a gönderiyorum. İşte sorunun başladığı yer de tam olarak burası arkadaşlar. :D

Şimdi Weapon damage için yaptığım şey, farklı silahların farklı hasar değerlerini göndermek ve bazı hatalardan ötürü bunu her birini ayrı ayrı girerek, ayrı değişkenler oluşturmak zorunda kalarak yapıyorum çözüm bulana kadar. Ancak her objeye de aynı olayı koyarsam o zaman işler baya can sıkıcı hal alacak.

İstediğim şey, bir yığılma oluşturmadan basit bir şekilde oyuna ekleyeceğim şeylere can vermek ve hasar almasını sağlamak, struct ile yapılıyor galiba ama tam anlayamadım emin de değilim. Bana bir yığılma yapma zorunluluğu oluşturmayan, basit bir biçimde objelere damage girebileceğim ve hasar almalarını sağlayacağım yöntemi açıklarsanız, ilgili kaynaklara yönlendirir ya da herhangi bir yardımda artık bulunursanız çok memnun olurum. :D

Teşekkürler.

Bu arada yukarıdaki kodu baya düzenleyeceğim, o explasion olayı sadece deneme amaçlı yoksa çok daha düzenli ve farklı hale getireceğim ancak şuan daha ciddi problemler üzerinde durmaya çalışıyorum.

Düzenleme:

Bunu nerelerde nasıl kullanacağıma yönelik bilgiler vereyim.

Mesela farklı tip ağaçlar olacak, bu ağaçları kesmek gerekecek. Botlar da damage olacak, mp'de oyuncular da. Yani bir çok şey damage alacak. 

Struct olayında bunu karakter blueprintinden nasıl bağlayacağım gibi durumlar da var ama structu da tam öğrenemedim gerçi.
 
Bu tür problemler genellikle Inheritance ve/veya Interface ile çözülür ama biraz daha açmanız lazım. Problemi tahmin edebiliyorum da örneğin WEAsocial nasıl bir sınıf. Her türden silahta sadece Damage değişkeni varsa hepsi için aynı şey çağrılır zaten ama örneğin aşağıdaki senaryoda OOP avantajları kullanılabilir.

Taslak Diagram

// Silah Blueprint yada C++ Sınıfı
Weapon : Actor    
_BaseDamage : float
_GetDamage() : float
(C++ için virtual)

// Yakın Dövüş Silahı Blueprint yada C++ Sınıfı
MeleeWeapon : Weapon
_CriticalRate : float
_GetDamage() : float
(Overriden)

Böyle bir tasarımda GetDamage() fonksiyonu Weapon sınıfında BaseDamage değerini döndürmeli, MeleeWeapon sınıfında override edilip Parent:GetDamage() * CriticalRate döndürmeli.

Kullanırken Weapon olduğunu bildiğimiz bir örnek ise sadece Weapona Cast edilip kullanılabilir. MeleeWeapon sınıfına Cast edilmek zorunda değil. Hit Actor çıkışı Weapona Cast edilir ve GetDamage() fonksiyonu çağrılarak hasar miktarı öğrenilir. Eğer HitActorün bu örneği Weapon ise GetDamage(), BaseDamage değerini, MeleeWeapon ise BaseDamage * CriticalRate değerini verir.

Eğer bu aynı biçimliliği kullanacağınız bütün yapılara uygulayabiliyorsanız, yani örneğin burada Weapon ana sınıfını kullandık ve belki de bir tarım aleti de olacak. Böyle bir durumda yapabiliyorsanız Weapondan önce bir üst sınıf daha(Item, Tool...vb) kullanmalısınız. Yok yapamıyorsanız (ki bazen yapılamaz), GetDamage() fonksiyonunu Interface ile bağlamalısınız. Birbiri ile hiç ilgisi bulunmayan sınıflar Interface kullanılarak bir fonksiyonu bulundurmaya zorunlu kılınabilir.
 
WU Asocial bir Karakter Blueprint, bu kod da o karakter blueprint içerisinden alınmış.

Daha iyi anlaşılsın diye görsellerle biraz açayım en iyisi. :D

4lGa54.png

Weapon Damage fonksiyonu içerisinden bir görüntü aldım burada. Karakter BP içerisinde şişmesin diye bir fonksiyon oluşturdum ve deneme amaçlı olarak bu şekilde bir bağlantı kurdum. Kuşanılan silah tanımlanıyor ve eğer o silaha sahipsen o silah için oluşturulmuş float Used Damage'e aktarılıyor. Used Damage ise Return Node'a bağlanıyor.

Fonksiyon da karakter blueprint'den (WU Asocial) hasar görecek obje için oluşturduğum blueprintin fonksiyonuna gönderiliyor.

Hasar gören objenin adı damage. Oradan da bir görüntü;

pPG6da.png


Bu arada ciddi bir isim karmaşası olduğunun farkındayım ve sistemi düzgün çalıştırdığım gibi değişkenleri ve diğer her şeyi ne görev görüyorsa onu ifade edecek şekilde yeniden adlandıracağım. Bazı şeyleri kısıtlı zamanda yaptığımdan çift elli için bow'un hasar veren değişkenini kullanmışım. :D


Mesela görsellerde silahlar için olan uzun yolu bir şekilde gizledim ve şimdilik o konuda bir şey yapmam gerekmiyor çünkü baya fazla çeşit olmayacak ancak etrafta hasar verilecek yığınla obje olacak. Onun için de bir fonksiyon oluşturup deyim yerindeyse halı altına atmak istemiyorum, basit bir şekilde örnek olarak objeler sahneye yerleşecek, her birinin kendine özgü bir canı olacak ancak ben her objeyi karakter blueprint'e sıralayıp Cast oluşturmak zorunda kalmayacağım. Daha özet bir kod ile vurduğumda objeye hasarı gönderecek.

Cevapladığın için teşekkürler. :) Anlatımında kullandığın terimlere pek hakim değilim bu arada. :D