(03-10-2020, Saat: 22:34)mrtcnaslnts Adlı Kullanıcıdan Alıntı: Başlıktaki sistemi yaptım ve iki sorum olcak.
Ekstradan bi soru sorayım: Online oyunlarda Hasar defans vs. sisteminde nasıl bi algoritma işliyo?
Tahmin yürüterek ben şöyle bir yol Düşündüm:
1. Şimdi Attack örn. 500-700 vs. Bu değerin Yüzdesini (örn.%20) alıp hasar olarak vermek istiyorum
Ama bu kısma bi akıl yürütemedim
2. Bi karakterin Defans değerinin oranına göre, Verilen hasar sayısını etkilemesi için nasıl bi yol izlemeliyim.
Merhabalar çok güzel soru. Öncelikle Gameplay Ability System (GAS) plug ini tam bu iş (ve daha üstüne bir çok daha fazla şeyle beraber) yapılmış birşey. Normal de Epic games Pubg gibi tüm oyunlarında bu sistemi kullanıyor. Bize de plugin şeklinde sunulmuş vaziyette. Bende kendi projemde bunu kullanıyorum. Ancak uygulaması ve sistemi kurması baya baya zor. Sonra bir şeyler eklemesi modifiye etmesi ise son derece kolay. O yüzden sadece bu yönünü sorduğun için GAS plugin ini tamamen geçiyorum. İhtiyacın olan kadar sistemini sen de kurabilirsin. Şöyleki :
1. Unreal de zaten hali hazır da başkasına "Damage" yani zarar uygulamak için "ApplyDamage" fonksiyonları, kendine uygulamak içinde "Take Damage" fonksiyonu var. Bunları kullanacağız.
2. Her karakterine Hit point (Can), Defense ( Korunma), Attack (Saldırı) vb. değişkenleri zaten veriyorsundur. Bunlardan başka yeni bir kaç özellik daha tanımlayacağız. Bunlar AttackRatio (Saldırı kesiri) ve DefenseRatio olacak.
3. Mesela birisi diğer bir karaktere kılıcıyla vurdu diyelim. Burda zaten OnComponentOverlap falan ya da bunun gibi bir yere kod eklemen gerekiyor. Diyelim ki kılıç dokunduğu zaman OnComponentOverlap çalışacak. Oraya hemen ardına kendi hazırladığın bir fonksiyon olacak. Adına "CustomApplyDamage" diyelim. Bu fonksiyonda önce vuran karakteri attack değeri AttackRatio ile çarpılacak. Ancak AttackRatio değeri çarpılmadan önce diğer değerlere göre bulunacak. Mesela kılıcın verdiği ekstra oran, üzerinde bir büyü bir yüzük vb giyim malzemesinin verdiği ekstra oran toplamı AttackRatio yu oluşturacak. Sonra Attack ile AttackRatio çarpılarak ApplyDamage in BaseDamage pinine verilerek bu fonksiyon bitirilecek. Yani aşağı yukarı şöyle bir şey olacak formül
AttackRatio = 1 +( (WeaponAttack+EquipmentAttack+SpellAttack ) /100);
BaseDamage = Attack * AttackRatio;
BaseDamage -> ApplyDamage noduna girecek.
4. Karşı karakterde bu apply damage , "OnAnyDamage" (ya da diğer varyasyonları) nın çalışmasına sebep olacak. Dolayısı ile oraya da hemen artına bir fonksiyon yapağız. Adı "CustomTakeDamage" olacak.
5. Bu fonksiyonda bize "OnAnyDamage" nodundan gelen yani karşı karakterden gelen BaseDamage değerini parametre olarak alacağız. Burda da gelen damage den FinalDefenseValue gibi bir değişken yapıp onu çıkartacağız ve fonksiyonun en sonunda kendi HitPoint (Can) ımızdan düşüreceğiz. Peki bu FinalDefenseValue nasıl hesaplanacak. Buda bizim yani vurulan karakterin Defense* DefenseRatio su olacak. yani formüller şöyle bir şey olabilir.
DefenseRatio = (ArmorDefense+SpellDefense+EquipmentDefense ) / 100;
FinalDefenseValue = Defense * DefenseRatio;
HitPoint = BaseDamage - FinalDefenseValue; //BaseDamage bize diğer karakterden gelen değer.
6. Ben formülleri şu an kafamdan kaba taslak sallıyorum. Senin bunları yani formülleri değerlerin nasıl değerler alabileceğini, nasıl etkileyeceklerini iyi hesab ederek bu şekilde bir sistem kurman gerekir.
7. Sistemi kurduktan sonra her karaktere kendine göre bir attack değeri defense değeri ayrıca her malzemeye kılıca bir ekstra attack ve defense değeri vererek sistemi kurman gerekiyor.
Umarım açıklayıcı olmuştur.
kolay gelsin.
Not: Kötü gözüküyor dediğin ui bumu?