omer.hatay

Yeni üye
2 May 2019
182
14
0
24
(34) İstanbul Avrupa
Malum c++ veya blueprintte saf object sınıfında getworld veya gettimermanager gibi şeyler çalışmadığı için bir çok şey kısıtlanmış oluyor. Ama bazı uobjectten türemiş sınıflar bunları kullanabiliyor. Neleri dahil ediyorlarda kullanabiliyorlar?
 
Şöyle anlatayım hocam, actor ve ondan türeyen sınıflarda UWorld nesnesine direkt referans olduğu için SpawnActor ve gettimermanager gibi şeylere erişebiliyorlar. Ama UObject bu yeteneklere sahip değil çünkü UWorld referansı yok. Ama UObject "Outer" gibi bir referansa sahip. Bunu kullanarak outerdan getworlde erişebildiğimiz bir durum yaratmam gerekiyor. Bunları yeni kavrıyorum. Örnek kod yaparsam buraya koyacağım.
 
Yapmaya çalıştığın şey yanlış. O tarz fonksiyonlarda "Context object" istemesinin sebebi bu nesnenin bir dünya ya koyulmuş olması gerekliliği (UWorld). Yani UObject ler herşeyin base sınıfı. Bunun GameSettings  falan bile dahil yani. Dolayısı ile UObject bu işler için değil. Bir şeyin oyun içerisinde olması onun Actor sınıfından olduğu ile anlaşılır. Outer fonksiyonu da içinde bulunduğu objeye gidip oradan World a referans sağlıyor. 
  Yani durum şu o fonksiyonlar engine içerisinde değil oyun içerisinde çalışmak için tasarlanmışlar. Bunun içinde bir leveli UWorld u referans gösterebilmeleri gerekir. Bir UObject in Outer ı yani ona sahip olan dış class bir actor olup bir levelin içinde bulunuyor olabilir. Bu durumlarda GetWorld Outer objectin GetWorld ünü çağıracağından sistem çalışacaktır. Ancak eğer böyle bir durum yoksa çalışmayacaktır. 
Yanlız TimerManager ı UGameInstance tan da çağırabiliyorduk yanlış hatırlamıyorsam. 
Uzun lafın kısası UE dizaynının dışına çıkmaya çalışıyor olabilirsin. Sadece yöntem değiştirmen gerekiyor.
 
Ekstra olarak UObject hakkinda bilgi vereyim, bunlar Unreal Engine replication sistemine uygun degil network oyun programlama acisindan bir yarar saglamiyo.

Multiplayer oyun yapiyorsaniz AActor ve UActorComponent replicate olabiliyor, aslinda degisik bir teknikle TheJamsh UObjectleri replicate edebilmis ama kotu tradeofflara sahip.

Yani aktor olusturmadiginiz sayede size replication saglamiyor UObject.

Kendisine ait tabi bir stack register olusturmus eleman, UNetDriver alip kendisi stack uzerinden fonksiyondan parametreleri tutturup yollatmis kendisi yeni bir UChannel acip.

Bahsettigim olay kendisine ait bir UChannel uzerinden override etmis.

Onun disinda UObject otomatik olarak constructorda sifirlaniyor, yani constructor olayi olmuyor, ya begin play yazacaksiniz ya da kendiniz bir method olusturup yapiyorsunuz.

UCLASS, UPROPERTY, UCLASS ile yarattiginiz nesneleri Unrealin reflection sistemine kayit ettirebiliyorsunuz.

Bahsettigim UObject replicate etme konusu:
https://jambax.co.uk/replicating-uobjects/