TornadoTT

Yeni üye
24 Kas 2015
280
13
0
31
(6) Ankara
Merhabalar, 

Aklımda basit bir örnek var ve bunun en iyi yolunu arıyorum.  

Örneğin karakterimiz bir eylem gerçekleştirdi ve bunun HUD ile oyuncuya gösterilmesi gerekiyor. Hasar aldı ve ekranda hasar göstergesi çıkması gerekiyor. 
Normalde karakter hasar aldığı an interface(message) yoluyla bu bilgiyi HUD classına gönderirim ve o gerekli düzenlemeleri yapar. 

Böyle bir durumun en iyi yolu unreal engine içinde bu şekilde midir?  Yani sonuçta karakter classı içerisinden HUD classına müdahale etmiş bulunuyoruz. Tabi ki sonuçta HUD classında interface implement edilmemişse hiç bir etki gerçekleşmiyor fakat bu şekilde karakter classı Solid prensiplerinden Single Responsibility(Tek işi, tek sorumlulukta yapma)  prensibine uymadığını düşünüyorum. 

Sizin de düşüncelerinizi almak isterim. Daha iyi bir yolu var mıdır veya farklı metotlar neler olabilir?
 
HUD örneği SOLID kuralları için çok iyi bir örnek değil aslında. Anlattığın durumlar için "delegates" kullanmak çok daha uygun bence. Interface lere girecek bir durum yok orada. (Giremezsiniz demiyorum, gerek yok diyorum)
 SOLID prensiplerini UE4 te uygulamak istiyorsan girmen ve kavraman gereken konu "TScriptInterface". Sadece düz C++ interfaceler değil TScriptInterface leri kullanabiliyor olmalısın.
 ( Bu arada burada böyle prensiplerin sorulmasından büyük mutluluk duydum.)

 Konuyu bilmeyenler için ya da extra açıklama isteyenler için: Diyelim ki oyununuzda kurcalayabileceğiniz bir sürü şey var. Örneğin karakter dolabı açabiliyor, musluğu açabiliyor, ışığı açıp kapatabiliyor, yerden silah alabiliyor, merdivene tırmana biliyor yada bir makineli tüfeği kullanabiliyor. Hepsi değişik animasyonlar değişik durumlar değişik sonuçlar gerektiriyor. Ayrıca tüm bunları sadece F tuşuna basarak yapabilmesini istiyoruz ancak SOLID kurallarına göre kodlama yapmayı da kendimize amaç edindik. Bunun için bir ScriptInterface (Unreal interface) yöntemi ile bir "Interactable"  sınıfı yapıyoruz. Bu tür tüm malzemeleri bu sınıftan türetmemiz artık yeterli olacaktır. F tuşuna basıldığında tek satırla yani
  if (Interactable)
     {
        Interactable->Interact();
     }

gibi bir kodla tek satırda problemi çözüyorsunuz. Bunun yanında bir bonus olarak istediğiniz kadar yeni malzeme yeni interact çeşitleri ekleyebilirsiniz. Hatta olanları çıkartabilirsiniz ve ana koda bakmanız bile gerekmez. Herşey direk çalışır.
 
erginegider' Alıntı:
HUD örneği SOLID kuralları için çok iyi bir örnek değil aslında. Anlattığın durumlar için "delegates" kullanmak çok daha uygun bence. Interface lere girecek bir durum yok orada. (Giremezsiniz demiyorum, gerek yok diyorum)
 SOLID prensiplerini UE4 te uygulamak istiyorsan girmen ve kavraman gereken konu "TScriptInterface". Sadece düz C++ interfaceler değil TScriptInterface leri kullanabiliyor olmalısın.
 ( Bu arada burada böyle prensiplerin sorulmasından büyük mutluluk duydum.)

 Konuyu bilmeyenler için ya da extra açıklama isteyenler için: Diyelim ki oyununuzda kurcalayabileceğiniz bir sürü şey var. Örneğin karakter dolabı açabiliyor, musluğu açabiliyor, ışığı açıp kapatabiliyor, yerden silah alabiliyor, merdivene tırmana biliyor yada bir makineli tüfeği kullanabiliyor. Hepsi değişik animasyonlar değişik durumlar değişik sonuçlar gerektiriyor. Ayrıca tüm bunları sadece F tuşuna basarak yapabilmesini istiyoruz ancak SOLID kurallarına göre kodlama yapmayı da kendimize amaç edindik. Bunun için bir ScriptInterface (Unreal interface) yöntemi ile bir "Interactable"  sınıfı yapıyoruz. Bu tür tüm malzemeleri bu sınıftan türetmemiz artık yeterli olacaktır. F tuşuna basıldığında tek satırla yani
  if (Interactable)
     {
        Interactable->Interact();
     }

gibi bir kodla tek satırda problemi çözüyorsunuz. Bunun yanında bir bonus olarak istediğiniz kadar yeni malzeme yeni interact çeşitleri ekleyebilirsiniz. Hatta olanları çıkartabilirsiniz ve ana koda bakmanız bile gerekmez. Herşey direk çalışır.


Evet normal Actor classlarda bende o şekilde gerçekleştiriyorum işlemleri. Interact classı örneği gibi yani. Fakat GameMode altındaki classlarda biraz kafam karışıyor. 

Delegates daha iyi bir yöntem evet haklısınız. Yanlış anlamadıysam şu tarz bir örnekten bahsediyorsunuz sanırım. Hasar aldığımız zaman karakter classı içerisinden Call OnHit event dispatcher çağıracağız. Ardından HUD classında Bind OnHit ile gerekli işlemleri gerçekleştireceğiz. Bu sayede Karakter classı içinde hiç bir şekilde HUD ile ilgili bir işlem olmayacak. 

TScriptInterface konusunu araştırayım. Sanırım bu c++ gerektiriyor. Blueprint ile gerçekleştirilebilir mi?

Teşekkürler cevabınız için.
 
Blueprint ten bahsediyorsak TScriptInterface kullanılamaz benim bildiğim kadarı ile. Ben C++ tan bahsediyoruz sanmıştım.

OnHit ya da OnOverlap sizin event i alacağınız yani başlayacağınız yer. Bunun için "event dispactcher" ları öğrenmeniz lazım. Bir Event Dispatcher yaratacaksınız ve adına diyelim "OnHealthChanged" diyeceksiniz. Yani kendi event imizi oluşturuyoruz burda aslında. Karaktere bir şey dokunduğunda mesela OnHit event çalıştı diyelim, burada SFX VFX ne varsa çalıştırdıktan sonra kendi yarattığımız "OnHealthChanged" eventi ateşleyeceğiz. Bunun için BP de Broadcast (isim sanırım buydu)  metoduyla dispatcher ı ateşleyeceksiniz. Bu da ona bağlı olan tüm fonksiyonları otomatik çalıştırır. Yeni eğer UI ınızı bu dispatcher a bağladıysanız (bind) UI daki o fonksiyon otomatik çalışacaktır. Aynı zamanda başka şeyler de bağlamış olabilirsiniz bu event e. Mesela ekranın kararması gibi, ya da karşı da ki karakterin "haha" diye gülmesi vb. Bu forumda dispatcherları uzun uzun anlattığım bir yazım olacaktı geçmişte.
   
   SOLID prensiplerinden tam olarak  bahsetmek için C++ a inmek gerekir maalesef.
 
erginegider' Alıntı:
Blueprint ten bahsediyorsak TScriptInterface kullanılamaz benim bildiğim kadarı ile. Ben C++ tan bahsediyoruz sanmıştım.

OnHit ya da OnOverlap sizin event i alacağınız yani başlayacağınız yer. Bunun için "event dispactcher" ları öğrenmeniz lazım. Bir Event Dispatcher yaratacaksınız ve adına diyelim "OnHealthChanged" diyeceksiniz. Yani kendi event imizi oluşturuyoruz burda aslında. Karaktere bir şey dokunduğunda mesela OnHit event çalıştı diyelim, burada SFX VFX ne varsa çalıştırdıktan sonra kendi yarattığımız "OnHealthChanged" eventi ateşleyeceğiz. Bunun için BP de Broadcast (isim sanırım buydu)  metoduyla dispatcher ı ateşleyeceksiniz. Bu da ona bağlı olan tüm fonksiyonları otomatik çalıştırır. Yeni eğer UI ınızı bu dispatcher a bağladıysanız (bind) UI daki o fonksiyon otomatik çalışacaktır. Aynı zamanda başka şeyler de bağlamış olabilirsiniz bu event e. Mesela ekranın kararması gibi, ya da karşı da ki karakterin "haha" diye gülmesi vb. Bu forumda dispatcherları uzun uzun anlattığım bir yazım olacaktı geçmişte.
   
   SOLID prensiplerinden tam olarak  bahsetmek için C++ a inmek gerekir maalesef.


Evet evet event dispactcher konusunu biliyorum. Kullanıyorum ama daha yaygın kullanmam gerekiyor. On Hit derken zaten kendi yarattığım eventi kastettim aslında. OnHitten sonra çalışacak olan yani. İsmi karıştırdı tabi olayı. 

SOLID konusunda blueprintin eksik kaldığı yerleri neler mesela aklınıza gelenler?
 
Blueprint i hiç bu açıdan düşünmemiştim ama bilebildiklerimi buraya yazayım:
 1. TScriptInterface sistemi çalışmaz. Normal BP interface ler ile devam etmek zorundasın. Bunda herhangi bir problem olmayabilir de. Ama bugüne kadarki tecrübelerim olabileceği yönünde.
 2. Solid in O sunda hep bir problem var.  Aslında BP de de private public durumları var ancak ben kimsenin kullandığını görmedim. Ama bu biraz kişiler ile ilgili
 3. L de de problem var. Virtual fonksiyonlar yok mesela BP de. Yani direk base sınıfının fonksiyonunu kullanarak derived class larda iş yapamıyoruz. Ya da yapabiliyor muyuz ? Ben hatırlamıyorum şu an. Yani örneğin bütün insanlar yürüsün dediğimizde öğrenciler,  işçiler, yöneticiler hepsi yürümeli. Böyle bir sistem varmıydı BP de. Engine i açıp bakmak istemiyorum şimdi :)
 4. D de problem var. Gerçek dünyada BP compile olayından dolayı bile dependency problemi olacaktır.
 Ama genel olarak bir dereceye kadar uygulanabilir tabi. Ama gerçekten BP de SOLID daha önce hiç düşünmediğimden de olabilir.
 
İşçiler öğrenciler vs hepsi yürümeli diye bir sistem en fazla Event Dispatcherle yapılabilir diye düşünüyorum.
Ya da Master Classa benziyor bu durum ama herkes kendi classındaysa yapabilecek bir şey yok. Senin dediğin olay bir class yada bir olay oluşturup aynı etiketten diğer tüm classların çağırmak.Bu nasıl yapılıyor ben de bilmiyorum.
GetAllActorsOfClass kullanılarak yapılır heralde