mforge

Aktif üye
26 Kas 2018
275
2
53
28
Başlıkta belirttiğim BP ile kendi istediğimiz her fonksiyonu oluşturabilir miyiz? Örneğin, bir fonksiyon oluşturup her aktör veya karakterde çağırarak sadece ilgili parametreleri ve referansları vs. bağlayıp kullanmak işleri kolaylaştırır.
BP hazırlarken bazen benzer kodları farklı aktörlerde tekrar oluşturmam gerekebiliyor. Kopyala yapıştır yapmak yerine, belirli görevler için fonksiyonlar oluşturup ihtiyaca göre çağırmayı düşündüm. Hem kod kirliliği de azalır. Bu noktada Function Library kullanmak mantıklı mı? C++ ile de olusturuldugunu biliyorum ama tabi C++ bilmiyorum.

Performans açısından avantajları ve dezavantajları nelerdir? Basit ve karmaşık fonksiyonlar arasında bir fark olur mu? Hangi sistemlerde (sağlık, saldırı, animasyon vs.) tercih edilir, hangi durumlarda önerilmez? Daha önce kullanmadığım için merak ediyorum
 
Blueprint Function Library nin asıl amacı programcılar tarafından level/game designer veya programcı olmayan herkese BP lerde kullanabilecekleri fonksiyonları hazırlamak ve onlara kolaylık sağlamaktır. Normalde herhangi bir "instance" gerektirmeyen fonksiyonlar için kullanılır. Yani karakterin ile ilgili fonksiyonlar zaten karakter BP dedir. Player Controller ın ile ilgili fonksiyonlar da zaten PlayerController BP dedir. Ama birde böyle özel bir yere ait olmayan her yerde kullanman gerekebilecek fonksiyonlar olur. O tarz fonksiyonlar için tasarlanmıştır. Örneğin bir enum değer karşılığında ona uygun bir TEXT döndüren bir fonksiyona ihtiyacın var. Bunu bir den fazla yerde kullanman gerekebilir ve bu konu karakterden ya da PlayerController dan ya da her ne ise diğer BP lerden bağımsız bir iş. Onu BFL de yapıp istediğin tüm BP lerden çağırabilirsin. Ya da başka bir örnek vermek gerekirse sana faktöriyelin karakökünü hesaplayan bir fonksiyon lazım diyelim. Bu da hiç bir BP ile direk olarak ilişkili bir iş değil. Bunu da BFL de yapıp istediğin her yerden çağırabilirsin. Örnekleri çoğaltmak mümkün tabi ama oyununa, ihtiyaca göre değişir. Tabi bunlar olması gerekenler ve asıl maksadı. Sorularına gelecek olursak:
1. Kendi istediğin her fonksiyonu oluşturabilirsin ama diyelim Character ile ya da PlayerController ile ilgili bir şey yapmak istersen eğer bunları bir parametre olarak fonksiyonda input olarak kullanman gerekecek. Bu da fonksiyon içerisinde gereksiz "PlayerController" mı "Character" mi vb. gereksiz branch(if) ler yapmana ve kodun gereksiz yere karmaşıklaşmasına sebep olabilir. Yani cevap: teknik olarak mümkün ama mantıklı mı sorusu duruma göre değişebilir.
2. Benzer kodları tekrar oluşturmamak için kullanılır. Zaten işi biraz bu. Aynı kodu tekrar yazmamak için "Inheritence" mı kullanmak gerekir, "Macro" mu kullanmak gerekir ya da dediğin gibi BFL mi kullanmak mantıklı duruma göre değerlendirmek gerekir. Her durum her iş aynı değil.
3. Performans açısından bir zararı olmaz. Yani normal de olmaz. Eğer zaten çılgın işler yapıyorsan performance sorunu zaten yaşıyorsundur. BFL ile ilgili özel bir durum yok.
4. Basit ve karmaşık fonksiyonların BFL de olması onları özellikle performans konusunda sıkıntılı yapmaz.
5. Hangi durumlarda önerilir/önerilmez : Her hangi bir BP referansı gerektirmeyen her şeyde önerilebilir. Özellikle bu tip fonksiyonların gruplanmasında çok faydalıdır. Mesela şöyle BFL ler yapabilirsin.
a. VFX_Helper_BFL. Diyelim ki sürekli belli socket isimlerinde VFX spawn laman gerekiyor. Bunu bir FText parametresi alan bir fonksiyon ile bu BFL içinde yaparsın. Diyelim ki sık sık değişik yerlerde bir Float ile hem Niagara VFX parametresini aynı anda da Material parametresini değiştirmen gerekiyor. Bir float input, bir material ve bir VFX input u olan başka bir fonksiyon daha buraya koyabilirsin. vb vb.
b. SFX_Helper_BFL: Mesela sık sık belirli bir atenuation da patlama sesi spawnlaman gerekiyor randomize olarak. Buraya bir fonksiyon koyabilirsin. Bazı ses gruplarını sürekli kısıyor yükseltiyor olabilirsin. Bunun için de bir fonksiyon koyulabilir. vb. vb.
c. String_Helper_BFL: Mesela sürekli bazı string metinler düzenlemen gerekiyor olabilir. Mesela oyuncunun nickname ini alıp (örneğin falanca) onu " Falanca lobby ye giriş yaptı" vb. değişik bir string e çevirmen gerekiyor olabilir. Yada bir string içerisinden belli harfleri ayıklaman gerekiyor olabilir. Mesela nick name de noktalama işareti olmasın istiyorsun. Bunu ayıklayan bir fonksiyon buraya koyulabilir vb. vb.

Belirli bir class a ya da BP ye ait bir fonksiyonun BFL içine koyulmasını önermem. Mesel characterin "Jump" fonksiyonu ya da "Fire" gibi. Koyamayacağından değil. Teknik olarak yapabilirsin. Ama ben Jump fonksiyonunu karakterde olmasını beklerim. Fire fonksiyonunu silah ta ya da karakterde beklerim. BFL de olması kafa karışıtırıcı olur. Ayrıca orada bu fonksiyonlar çok daha kompleks hale gelirler olmaması gerektiği yerde yaptığın için.

Umarım faydalı olmuştur.
 
  • Beğen
Tepkiler: mforge