omer.hatay

Üye
2 May 2019
182
14
18
26
(34) İstanbul Avrupa
h1m6s8f.png

Burda gördüğünüz üzere beginplayde serverda çalışıp, serverda S_SayHello eventini çalıştıran ardından Multicast ile bütün cihazlarda M_SayHello çalıştırıp ekrana Hello yazdıran bir durum oluşturdum.

d6aa4iu.png


İşin garip tarafı, clientte hello yazmıyor. Bir projemde bunları kullanarak bir envanter sistemi kurmaya çalıştım, nasıl bir kod yazdıysam bu seferde Multicast 2 defa ardı ardına çalışıyor. O durumda widgetı etkiliyor ve sanki iki tane aynı eşyadan yüklemişim gibi bir durum oluşuyor. Bu ilk attığım kodda switch has authority den sonra serverda çalışan event çağırmama gerek yok onu biliyorum ama Multicast in neden böyle çalıştığı hakkında bir fikrim yok. Ben multicasti anlayamamışım. Multicast kullanırkenki kurallar neler? Benim bildiğim sadece serverdan çağrılabildiği ve bütün oyuncularda çalıştığı.

Edit: Beginplaye delay verdiğim zaman doğru çalıştı. Multiplayerda client gecikmeli olarak bağlanıyor, bununla bağlantılı olarak bazı şeyler gecikmeli çalıştırılmalı sanırım. Muhtemelen oyunlarda her şeye "Yükleniyor" diye bir ekran koyuyorlar. Öncesinde her şeyin hazır olduğundan emin olup oyunu başlatıyorlar.
 
Omer merhaba,

Simdi soyle, levele hali hazirda koydugun actorun owneri "Server" oluyor, sen Event BeginPlay de oncelikle Switch Has Autorithory dugumunu kullanarak sen bu aktorun otoritesenin kim oldugunu sorguluyorsun. Otoritesi server oldugu icin, clientler icin gecerli olmayip begin playden cagirdigin "SayHello" sadece server uzerinde calisiyor.

 2 defa calismasinin sebebi ise muhtemelen listen server olarak kullanman. Burada hem client hem de server host oldugu icin.. ve o mantikta oldugu icin her ikisisine yollayip oradan yazdiriyorsun diye dusunuyorum. Yani server ve client oldugu icin iki defa gidiyor. Birincisi server uzerinde, ikincisi multicast ettigi server uzerindeki client uzerinde.

Simdi unrealin multiplayeri soyle, server apayri bir dunya, client apayri bir dunya. Serverden cagirilan multicast olayi butun clientlere yayilmasinin sebebi actorun ownership denilen olay ile alakali. Serverda cagirdigin event ile calismasiyla bir alakasi yok. 

Bu arada, olabildigi kadar mutlicast kullanmamani tavsiye ederim, bunun yerine RepNotify daha uygun oluyor. Cunku notify sayesinde sadece belirli alanlarda replicate oluyor ama multicast kullanirsan aktorun konumu, nasil bir replicate sistemine oldugu dahil edilmeden direkt olarak butun her seyi uyguluyor.

Widget konusunda ise, widget sadece owning cliente otoritesidir, yani yarattigin UMG widgetleri oyuncunun sadece kendi makinesinde var olur. Widget uzerinde bir butona tikladigi zaman GetOwningPlayer dugumunu kullanarak PlayerController referansin uzerinden GameState ya da PlayerState uzerinden bir event cagirarak RPC(Remote Procedure Call) yapabilirsin.

Sana bu kursu siddetle oneriyorum. 
https://www.udemy.com/course/unrealmultiplayer/