leonscottkfm

Unreal MVP
31 May 2015
1,536
5
218
63
28
(34) İstanbul Avrupa
store.steampowered.com
Replication üzerinde çalışabiliyorum Networking işleri ile yaklaşık 1.5-2 senedir uğraşmaktayım ve biraz tecrübe edindim. Fakat hala anlamadığım bazı noktalar var. Örneğin multiplayer oyunumun %90 seviyesine gelmiş bulunmaktayım. Yakında tam versiyona geçiş yapacak.

Oyunumdaki çoğu şey herkes tarafından görülebilir şeyler olduğu için. Genellikle Multicast içeren işlemler barındırıyor bu yüzden daha kolay çalışılıyor.

Mesela Sorularımdan bazıları şunlar :

1- Level Blueprint server tarafından mı yönetilir ? Level Blueprint içerisinde bir olay trigger olursa herkes mi etkilenir ? Level Blueprint içerisinde bir tuş atarsak ve basıldığında bir event gerçekleşirse bu Replicated midir yoksa Server tarafından mı yönetilir ?

2- Tüm oyuncuların özelliklerini değiştirmek istersek. Örneğin Can değeri 20 olan her oyuncuya 80 can eklemek gibi. Bu Gamemode içerisinde mi yapılmalı ?

3- Her oyuncunun bir banka hesabı var diyelim. Kendi para miktarlarını görebiliyorlar. Fakat karşıdaki oyunculara para yollayacaklar. Bu işlem sırası ile hangi replicationlar ile gerçekleşmeli ? Örneğin ben ATM_BP aktörüne gidip Triggera girersem benim hesabım ve para bilgilerimi gösteren bir WidgetBP açılıyor. Buraya kadar tamam. Para gönder tuşuna bastığımda ise tüm oyuncuların adı ve para miktarları gözüküyor. Ve bu oyunculardan birini seçip miktar yazıp yolladığımda. O miktar o oyuncuya ulaşamıyor. Ya oyuncu Server ise ona ulaşıyor. Ya da oyuncuya ulaşıyor fakat bende onun miktarı gözükmüyor. Fakat server her ikimizin miktarını da görebiliyor.

Yani burada detay beklemiyorum. Sadece kısa bir özetle siz bu sistemi yapacak olsaydınız, misal veriyorum.. Para bilgisini nerede tutardınız ? Her oyuncunun Pawnında mı tutardınız ? Bu saçma bir şey çünkü oyuncu pawnı değiştirebilir. PlayerControllerde tutmak ise Widget yaratma ve silme konusunda sıkıntı çıkarıyor. PlayerControllere rahatlıkla her yerden erişemiyoruz.
Ben bu bilgileri PlayerState denilen yerde tutmayı seçtim. Fakat buraya GameMode içerisinden eriştiğimizde GameMode içerisinde sadece Run On Server Eventlerini tetikleyebiliyoruz. Yani Multicast yaptıramıyoruz. Dolayısıyla GameMode de bir şey yapamıyoruz aslında. Yani GameMode de oyunun süresi değişti diyelim bunu herkes görebilir belki. Fakat herkes birbirinin bilgisini göremiyor. Dolayısıyla Multicastı desteklemiyor.

Fakat ben herkesin kendi para bilgisini ve karşıdakilerin para bilgisini görebilmesini istiyorum. Ayrıca para gönderdikten sonra iki tarafta da bu bilgi güncellenmeli. Fakat oyuncu Server değilse bu bilgi asla değişmiyor çünkü Run On Server kullanıyorsanız ve onun üzerinden bilgi dağıtıyorsanız, sadece Clientler arasında oyun oynatırsanız Server bu bilgileri iletmiyor. Dedicated Server kurarsanız çalışabilir. Fakat Steam üzerinden bir oyun yapacaksanız ve bunu deneyimleyeceksek mutlaka Server ve Client olarak test yapmamız gerekiyor. Mesela oyunculara hasar verme konusuna gelelim. Oyunculara hasar vermek için kullandığımız ApplyDamage tamamen bir Server RPC si. Dolayısıyla oyuna server olarak girmeyip iki Clienti baş başa bırakırsanız birbirlerine hasar veremiyorlar. Çünkü bunun Serverden geçmesi lazım. Yani Mutlaka Server oyuncusu barındırmalısınız. Test ederken de Clientler arasında bir test değil de Server ve Clientler olarak test etmelisiniz.


Sanırım aynı olay para gönderme işlemi için de geçerli oluyor. TAB basıldığında tüm oyuncular birbirlerinin ismini pingini falan görebiliyor kendileri de dahil. Fakat para gönderme işleminde bunu bir türlü başaramadım. Bana burada sadece yöntem sunmanızı rica etmekteyim. Yani bana şu tarz bir yöntem sunabilirsiniz.

1- İşte oyuncuların para bilgisini Pawnda ya da PlayerState içerisinde tut.
2- Para gönderme Eventi nerede olacak mesela ? Widget ile Parayı gönder dediğimizde o Eventin oyuncu ID numarasını o listeden alması ve girilen miktarı TextBoxtan çekmesi gerekiyor. Ve bu değerleri Replicate edecek. Bunu Server nerede yapmalı ? Ve Multicast ile herkese mi iletmeli yoksa herkesin OwnClientine mi iletmeli ? Yani herkes aslında OwningClientinde kendi değerini ve karşıdakinin değerini görecek şekilde mi tasarlanmalı ? Yoksa Multicast yapıp herkesin bilgisin herkese mi iletecek ? Ve Server kendi de bu olaya dahil olabilecek mi ?

Teşekkürler.

Kısaca PlayerController içerisinde ne tür RPC ler kurulur ve hangi türlerle iletişimde bulunabilir, GameMode sadece RunServer kullanıyor mesela. GameState veya PlayerState tamamen replicated yani bu durumda multicast işlevi mi görüyor ? Mesela GameState kullanıyorsanız Base olanı kullanmazsanız karakteriniz hareket edemiyor. Base oluşturmanız gerekiyor. GameStateyi alaka eden bir konu yok burada fakat yine de bunlardan hangileri birbirleri için ne amaçla RPC iletişimi kurabiliyor bunu özet geçebilirseniz sevinirim.
Çoğu sistem Pawn içerisine kurularak kolay yoldan çözüme ulaştırılıyor. Fakat Pawnlar değişebilir. Bu bana mantıklı gelmiyor. Can değerinin Pawn içerisinde olması mantıklı olabilir . Çünkü her Pawnın canı farklı olabilir. Mesela insan pawnı 100HP sahipken, robot Pawnı 500HP sahip olabilir. Ama ben oyuna genel bir para ekleyeceksem bu değişmeyecek bir şey olacak ve bu değerin her Pawna tek tek yazılması beni rahatsız eder. PlayerState içerisinde bulunmasını yeğlerim.
 
Ben olsam da parayı player state'de tutardım.

Para gönderme eventini şöyle kurgulardım: A -> B ye para gönderecek diyelim.

1. A -> Server'a para gönderme isteği atar.
2. Server A'nın parayı kontrol eder. (başka kontroller varsa onlara da bakar vs. güvenlik sağlanır)
3. Server üzerinde B'nin para update edilir. A'nın ki de update edilir.
4. Server üzerinden ilgili clientlar'a update geçilir.

Multicast işleri biraz kolaylaştırıyor ama performans problemi yaratabiliyor. Oyununun bütünlüğünü etkileyen bi şey varsa o şey server'da gerçekleşmeli. Sonrasında client'lara aktarılmalı diye düşünüyorum. Sistemde buna göre tasarlanmış zaten. Örneğin serverde gerçekleşen damage verme işlemi sonucunda, server'daki pawn'ın can değeri update edilir. O can değeri Replicated olduğu için otomatik clientlar'da da güncellenir.

Yani kısaca client'lar aslında hep Server'dan ricada bulunuyor lütfen B'nin parasını güncelle gibi. Ben böyle yorum katıyorum multiplayer işlerine.

Herkesin birbirinin parasını görmesini istiyorsan da GameState içinde halihazırda bütün PlayerState'ler tutuluyor. Oradan çekebilirsin.

Böyle anlatınca hava da kalıyor gibi hissediyorum, umarım doğru ifade edebilmişimdir bazı şeyleri.
 
  • Beğen
Tepkiler: Phyrexian
Ben olsam da parayı player state'de tutardım.

Para gönderme eventini şöyle kurgulardım: A -> B ye para gönderecek diyelim.

1. A -> Server'a para gönderme isteği atar.
2. Server A'nın parayı kontrol eder. (başka kontroller varsa onlara da bakar vs. güvenlik sağlanır)
3. Server üzerinde B'nin para update edilir. A'nın ki de update edilir.
4. Server üzerinden ilgili clientlar'a update geçilir.

Multicast işleri biraz kolaylaştırıyor ama performans problemi yaratabiliyor. Oyununun bütünlüğünü etkileyen bi şey varsa o şey server'da gerçekleşmeli. Sonrasında client'lara aktarılmalı diye düşünüyorum. Sistemde buna göre tasarlanmış zaten. Örneğin serverde gerçekleşen damage verme işlemi sonucunda, server'daki pawn'ın can değeri update edilir. O can değeri Replicated olduğu için otomatik clientlar'da da güncellenir.

Yani kısaca client'lar aslında hep Server'dan ricada bulunuyor lütfen B'nin parasını güncelle gibi. Ben böyle yorum katıyorum multiplayer işlerine.

Herkesin birbirinin parasını görmesini istiyorsan da GameState içinde halihazırda bütün PlayerState'ler tutuluyor. Oradan çekebilirsin.

Böyle anlatınca hava da kalıyor gibi hissediyorum, umarım doğru ifade edebilmişimdir bazı şeyleri.
Doğru fakat para gönderme işlemini nerede yapardın ? Parayı PlayerState ile tutardın. Fakat gönderme nerede gerçekleşirdi GameMode mi ?