omer.hatay

Üye
2 May 2019
182
14
18
26
(34) İstanbul Avrupa
Levelda bir sandık olsun ve bir oyuncu bu sandığı açmış olsun. 2. oyuncu eğer alanın içinde değilse, sandığın açıldığını göremez. Ama sonradan alanın içine girdiğinde de görmüyor. Yani yeterince yaklaşmışsa, sandık açık olduğu için sandık açık görünmesi gerekmiyor mu? Diğer türlü, 1. oyuncu sandığı açmış olsun, ikinci oyuncu gelip kasayı açmaya çalıştığı zaman 2. oyuncuda açılıyor bu sefer 1. oyuncuda kapanıyor.
 
Vallaha ben daha o tür şeylere girmedim. Temelden böyle bir problem olduğunu gördüm. Baktım internette bir çözümü yok. Bir sorayım dedim. Yoksa bende de bir envanter ekipman sistemi var. Bunları nasıl yapacağım uzun uzun düşüneceğim.
 
https://docs.unrealengine.com/4.27/en-US/Resources/ContentExamples/Networking/2_1/

Bu linkte 2.1 den 2.4  e kadar çok dikkatlice okuyun. Tam olarak üzerinde düşündüğünüz konuyu adım adım anlatıyor. Ama kısaca şöyle bilgi vereyim:
1. Her türlü durumu Gameplay ve Cosmetic olarak iki duruma ayırın. Mesela sandığın açık ya da kapalı olması durumu Gameplay tarafında. Ancak bu sandığın açılırken kullanılan  SFX, VFX her türlü şey ( aslında sadece görsel şov olduğu ve gameplay e katkısı olmadığı için ) Cosmetic tir. Fonksiyonları bu şekilde ikiye ayırmanız lazım.
2. Her türlü "Gameplay" olayı gerçekte "Server" da olmalı. Üstüne tekrar basıyorum "Server" da olmalı. Buna sandığın açılması olayı dahil. Server da olmayan hiç bir şeyi "replicate" edemezsiniz. UE de client tan client a replication diye bir şey yok. Serverdan Client a var.
3. "Ama ben client ım ve sandığı açıyorum ne olacak ?" diyorsanız: Client açma hamlesini yaptığında (tuşa basmak, üstüne gelmek etc. neyse işte) "Server"  a diyecek ki "Hey ben bu sandığı açtım". Bunun haricinde client, "Gameplay" tarafında hiç bir şey yapamaz. Bunu nasıl yapacak: "RPC RunOnServer functions".
   Server bu çağrıyı aldıktan sonra meseleyi iki boyutta ele alması lazım. Bu bir gameplay olayı ancak buna bağlı SFX, VFX gibi "Cosmetic" olaylarda var. Gameplay tarafını mutlaka "Replicated Variables" ve "RepNotify" lar ile halletmek zorunda. Cosmetic tarafını ise "NetMultiCast" ile halledebilir. Bu sandık durumunda Gameplay olayı sandığın açık ya da kapalı olma durumu. Cosmetic olay ise SFX, VFX, UI vb şeyler. Mesela sandık açılma sesi ya da VFXi bu kategoriye girer.
   Dolayısı ile her türlü Cosmetic olay bir NetMulticast ile halledilebilir. Zaten "server" dayız unutmayın. Böyle yapınca "Network relevancy" ye sahip olanlar direk bu NetMulticast fonksiyonu alacaklar ve gerekli VFX, SFX oynatılacak. Yani yakında görme imkanı olanlar bunu müşahade edecekler. Fakat Gameplay olayı olan açılmış ya da kapanmış olması durumu ne olacak. Çok kolay: Bir variable yapacaksınız "IsOpen" gibi. RepNotify ile replicated olacak. Network Relevancy alanı dışında olanlar alan içine girdiklerinde bu değişkeni serverdan almaya başlayacaklarından RepNotify fonksiyonu hemen çalışacak ve daha kişi alan içine girdiği anda sandık açılacak. Bu yüzden Network Relevancy alanı oyuncu içeri girdiğinde herşeyi anında göremeyecek kadar büyük ama mümkün olduğunca da küçük olmalı.
 
Çok sağolun hocam, ben de multiplayer a ilk giriş yaptığım zamanlar aynı şekilde gameplay ve cosmetic olaylarının farlı ele alınması gerektiğini çözdüm fakat bunu unreal da nasıl uygulayacağımı çözemedim.