melandre

Yeni üye
25 Eki 2022
1
0
0
Belirtilmemiş
Selamlar..

Başlıkta belirttiğim 2 node ile de bir BP'ye başka bir BP'den referans actor getirebiliyoruz. Fakat aralarındaki fark nedir ? Hangi durumda hangisini kullanmak avantaj sağlar? Farkları nedir?

NOT: UE5'i, mimari görselleştirmede game mode için kullanıyorum...
 
İkisi tamamen alakasız şeyler: 
  Cast : Bir base class (ata sınıf) pointerı, child class ( türemiş sınıf) bir objeye pointer referansı yapıyorsa: bu pointerı, base class pointer dan child class pointer a çevirmek için kullanıyoruz. 
  Örneğin GetGameMode bize bir base class olan AGameModeBase pointer ı döndürür. Ama biz aslında onun gerçekte kendi gamemode umuz (Mesele AwesomeGameMode.BP vb. ) u gösterdiğini bildiğimizden, ve kendi gamemode umuza özgü olan tüm yenilik ve özelleştirmelere ulaşabilmek istediğimizden, onu kendi gamemodu muza "Cast" ederiz. Çünkü "base gamemode pointer" ından asla kendi gamemodumuza "özel" özellikleri kullanamayız. (Diğerlerini kullanırız bu arada)
   GetAllActorsOfClass. : Belirli bir Actor sınıfından türemiş olan tüm objeleri, o levelin içinden tek tek bulup toplayarak bir Array yani dizinin içine koyar. Böylece o Actor sınıfından olan herşeye, o level içerisinde ulaşmış oluruz. Yanlız sıralaması tam belli değildir. Mesela o level deki tüm Gold Actorlerine ulaşmak için AGoldActor sınıfını aratabilirsin. 
   Gold örneğinde eğer baştan direk GetAllActorsofClass ile GoldActor ü arattıysan direk listene gelen her şey gold actor olacaktır. Cast başarılı oluyorsa, o bir GoldActor dür. Başarılı değilse başka bir şeydir zaten. 
   Genel olarak oyun programlama yapıyorsan şu kuralı her zaman söylerim: "GetAllActorsofClass kullanıyorsan büyük ihtimalle yanlış bir dizayn uyguluyorsun. Çünkü normalde bir şeyleri sonradan toplamaman lazım". Ancak sen oyun dışı kullandığın için senin için bu sıkıntı değil.
 
Referans gösterip ulaşmak sıkıntı ama. Mesela değişken oluşturuyorsun isim veriyorsun örneğin : arabaRef daha sonra araba actorunu seçiyorsun sonra hooop Access non Read bilmem ne Instance Editable de açık Expose On Spawn da açık ama hata veriyor. Ben hiçbir zaman Unreal hayatımda değişken referansı ile başka bir actore ulaşamadım . Hep GetAllActorsOfClass kullanarak ulaştım ya da Cast ederek. Bazı şeyler bildiğinizi üzere Cast edilemiyor. Örneğin sıradan bir Blueprint actoru. Sizin deyiminizle GoldBP olsun hadi. CastToGoldBP yaptığınız zaman arka taraf boş kalıyor.
Buna ulaşmanın tek yolu Değişken oluşturmak ve referans vermek ama oda Access hatası veriyor.
Geriye kaldı tek yol o da GetAllActors


Sizin için video çektim 7 yıldır bir türlü beceremedim şunu neyi yanlış yapıyorum ? Variable oluşturup oradan actoru işaretliyorum ama referans almıyor.Başkası yapınca oluyor anlamadım bir türlü.



Bu içeriği görmek için üçüncü parti çerezlerine izin vermeniz gerekli.
Daha fazla detay için çerezler sayfasını ziyaret edin.
 
Referans göstermek sıkıntı değil aksine oyun geliştirmede çok önemli yeri var. Cast sistemi oyun geliştirme için nimet.

Sen direkt referans mantığını anlamamışsın. Referans değişkeni oluşturduğunda ve bunu "GoldBP" olarak seçtiğinde bu değişkenin bir nevi kategorisini veya filtresini ayarlamış oluyorsun. Yani bu GoldBP adlı değişken sadece GoldBP aktörünü tanısın demek oluyor. Ama senin yaptığın örnekte bu değişkene bir GoldBP tanıtmıyorsun yani içi boş. Eğer videoda yaptığın sistemde GoldBP aktörünü haritaya sürükleyip bırakır ve oluşturduğun değişkeni ve mesaj event'ini karakterinin içine oluşturup veya yine haritada aktif bulunan bir başka BP' nin içine oluşturup GoldBP değişkenini instance editibale yaparsın ve haritada Değişkeni oluşturduğun Aktöre tıklayıp sağda Detail penceresinde değişkeni görürsün. İçine haritandaki GoldBP aktörünü seçersin ve halledilir.



Not: Bu değişkenin içine aktör tanıtmanın bir çok yolu var, ben en basit şekilde olanını örnek verdim. TriggerBox, LineTrace veya Widget üzerinden falan bir çok farklı yöntem ile de tanıtabilirsin.
 
Bana sadece şunu söyleyin . İki adet BP olacak biri su biri ateş , ikisi de actor olsun ve harita üzerine bırakalım , su ateşten her saniye değer eksiltsin mesela. Nasıl iletişim kuracaklar ? Ama bu yaptığımız sistem her Levelde aynı çalışacak. GetAllActors olmadan nasıl ulaşacaklar birbirlerine ? BpInterface mi ?

Cast sistemi nimet falan değil çölde su bulan adamla aynı şey. Donanım yetmediği için aktörlerin hepsini getirmiyorsun belli sınıfa erişimi oluyor. Hepsi gelse PC çöker. Ondan yapmışlar. Donanımlar yetersiz şuan yıl 2023 Pc de görev yöneticisi bile açarken kasıyor.
 
Madem video çekecek kadar vakit harcamışsın vaktim olduğunda nasıl olması gerektiğini yazacağım. Gerçi NooXrii de anlatmış zaten ama bakalım.
  Cast ile GetAllActorsOfClass node larının birbirleri ile en ufak alakaları bile yok. İkisinin de gerektiği yerler olabilir, yanlızca biri gerekebilir ya da hiç birine gerek olmayabilir. Çünkü bir birleri ile aynı işi bile yapmıyorlar. İkisini yan yana düşünmeyi gerektirecek ikisinin de BP node u olması dışında en ufak alakaları yok.
 
Mesela Zombi öldürmece var ve ben tek tek hasar vererek öldürmeye çalışacağım. Get all actors kullanarak bunu yaparsam bütün zombilere tek atmış olurum ama bir Trace veya kurşun aktörüne bağlı bir trigger ile temas ettiği Zombiyi cast ederek sadece o zombiye hasar veririm.

Senin örneğine gelince bir Su ve Ateş olan;

Ayrı bir aktör oluşturursun ve adına GameManager dersin mesela. Bu aktörü Su ve Ateş'in bulunduğu her haritaya atarsın. GameManager aktörünün içine başta anlatmış olduğum referans değişkeni ile ateş ve suyu tanıtırsın. Sonra Kendi Control Player'ının içinden get all actors kullanarak Game manager içinden Su veya Ateş referansını çağırarak istediğin veri alışverişini gerçekleştirebilirsin. Ama bu sadece böyle basit bir geliştirme için geçerli bir düzeydir. Daha komplike işlerde getallactors ile iş yapmak donanım yetersizliği falan değil gereksiz bir iş, zaman ve emek yüküdür.
 
Sen de kullanmışsın yine NooXRii    :)  . Neyse aklıma kullanmanın mantıklı olabileceği yer geldi. Eğer levelinde spawn lokasyonları var ve buralarda item spawn etmek istiyorsan o zaman kullanmak mantıklı olabilir. O zaman bile sadece olabilir diyorum çünkü duruma göre değişir. Diğer tüm durumlarda eğer GetAllActorsOfClass kullanıyorsanız, muhtemelen sistem olarak yanlış ilerliyorsunuz demektir. Siz yine kullanmaya devam edebilirsiniz ve sorun da olmayabilir. Ama aklınızda bulunsun diye söylüyorum. %95 ihtimalle yanlış ilerliyorsunuz ve kendinize işleri daha da zorlaştırıyorsunuzdur.


Burada bir iki yöntem örnek verdim Leonscottkfm:

https://drive.google.com/file/d/1Upvyh8uwtyD7QPp89fxzW-8qM4xNimPS/view?usp=sharing

Sabahın köründe çektiğim için hatam varsa affola.
 
Meraklisina daha detayli bilgi vermek istiyorum;

Cast bir programlama terimidir, polymorphism dedigimiz object oriented programming uzerindeki parent-child classlara runtime(calisma zamani) uzerinden type conversion oldugunda gerceklesir.

Get All Actors ise oyun dunyasindaki bulunan aktorlerin o sinifa ait olan orneklerinin hepsini bize bir dizi olarak verir. Script yazarken Get All Actors kullanmaktan cekinin, butun yazilimlariniz event tabanli olursa daha iyi olur(Mesela OnOverlap..). 

Bunu ozellikle Tick icerisinde kullanmak biraz performans sorununa yol acabilir cunku linear zamanda yani O(N) de calisir. Bu da CPU yu baya yorar.

Siz bir mimar olarak eger performansi cok sorun etmiyorsaniz ki archviz yuksek grafik kartlarinda ve yuksek performans gosteren CPU larda devreye giriyor, cok optimizasyonu dert etmeyin derim.