kaandenizblkn

Yeni üye
15 May 2021
17
0
0
ABD
Hepinize merhabalar. Uzun yıllardır single player oyun ile uğraşmaktan sıkıldım ve multiplayer sistemlere girme kararı aldım. Bildiğiniz üzere mmorpg dedigimiz zaman akla gelen oyunlardan bir tanesi metin 2. Baya bir uğraş sonucu metin 2 remante yi bitirmeyi başardım ( köyler - efsun sistemi -silah giy çıkart - level sistemi - chat sistemi - kostüm sistemi - envanter sistemi - drop sistemi - boss ve metin -skiller - npc ler -  vb gibi ) ışınlanma yüzüğüne kadar yaptım anlayacağınız. Damage - healt vs vs mini metin 2 single olarak hazır diyebilirim.  Şuanda kafamda multiplayer a geçirmek olduğunu söylemiştim. Şuan istediğim şey hangi veritabanı ve sunucu tarafı nasıl olucak. Öncesinde web tasarım backend kısmı ile uğraştığım için My SQL konusunda bayağı bilgi sahibiyim. Yani takla attırırım. Metin 2 files indirim ve kurdum . metin 2 de mysql kullandıgını gördüm. TPC dedicated server denen bir illet ile multiplayer yapıldğını gördüm. 

Şuan kafamdaki sorular örnegin 2 kişi girdiği zaman oyuna nasıl birbirlerinin hareketini görüyor bunu nasıl yapıyoruz. Mysql ile login işlemleri itemler iste karakterler vs hepsi kafamda oturdu. basit user tablosuna giriş bilgileri
karakter tablosunda user_id karakter_id vs vs
sonra item tablosu karakter tablosundaki id ile eşleşip çalışıcak
yani db kısmı kafamada tamamen bitti. yazının başında da dediğim gibi  öncesinde web tasarım ile uğraştıgım için 
php ile web sitesi kurup register işlemlerini ordan yaptırıcam aynı metin 2 de ki gibi. 

Sunucu - client ilişkisi nasıl yapılıyor bunun için türkçe kaynak yok yani 0 ingilizcem yeterli degil. 

Sizden tutorial ve ya  şunu yaparsan daha ili olur diyeceginiz şeyleri bekliyorum.
 
Baya bir uğraş sonucu metin 2 remante yi bitirmeyi başardım ( köyler - efsun sistemi -silah giy çıkart - level sistemi - chat sistemi - kostüm sistemi - envanter sistemi - drop sistemi - boss ve metin -skiller - npc ler -  vb gibi ) ışınlanma yüzüğüne kadar yaptım anlayacağınız. Damage - healt vs vs mini metin 2 single olarak hazır diyebilirim.  

Umarım önce oyunun mekaniğini yapayım sonra server işini hallederim dememişssindir. Çünkü multiplayer kodlama ve single player kodlama birbirinden çok farklı. Eğer öyle yaptıysan tüm mekanikleri bir daha yapman gerekecek.

Oyuna bağlanan iki client birbirinin oyunuyla alakalı bilgileri direkt alamaz. Hatta client kendi oyununu dahi oynamaz. Client kendi açtığı oyunda başkalarının görüp etkileneceği her şeyi serverden talep eder. Server o işi her yerine getirir ve o hamleleri her clientte oynatır. Sen de kendin yaptın sanarsın. En en basit anlatımla durum böyle. Ama iş çok çok daha karmaşık. Çünkü oyunda yüzlerce binlerde kişi olursa herkesin her an yaptığı herşeyi birbirine transfer etmeye kalkarsa baya bir updload-download trafiği oluşur.

Bunu önlemek için network revelancy diye birşey var. Yani belli uzaklıklaki kişiler için bir eventi gerçekleştirir(Örneğin 50 metre). Diğerleri için gerçekleştirmez. Şimdi bir senaryo düşün. Bir sandık var ve içinde loot var. Birisi geldi ve kutuyu açıp bu loot u aldı. Diyelim ki sistemi doğru yaptın ve lootu aldı kutu boşaldı serverde ve 50 metre içindeki herkes bunu gördü. 100 metre ötedeki biri bu loota 5 dakika sonra gelince ne görür? Şöyle olur:

1-Kutunun replicated değişkenlerini 50 metre içine girer girmez günceller. Yani sorun yok.
2-Ama kutuyu kapalı olarak görür. 
3-Kutuyu daha önce açan kişi kutuyu hala açık görür ve oyun senkronizasyonu bozulur. Bu nokta kutuyu kapalı gören etkileşime girince kutuyu açar, ama kutu açık olan kişide tam tersi kapanır.

Bu gibi durumların önüne geçmek için şunları öğrenmelisin:

Run on server
Multicast
Replicated değişken
RepNotify değişken
Network relevancy
Ownership

Yaptığın işlemlerin başka herkeste görünmesi için O aktör, component ve değişkenin replicated olması ve Run On Server şeklinde çağırılması gerekir. Bu şekilde değişkenleri herkeste aynı yapabilirsin. Ama bir eventi Run On Server olarak çağırmak için o aktörün sahibinin sen olman gerekir. Aksi durumda Run On Server Eventi çalışmaz.

Animasyon, ses oynatma, efektler gibi şeyleri multicast ile anlık olarak herkeste oynatabilirsin. Ama multicast eveti çağırmak için de ilk önce eventi Run On Server Deyip sonra Multicast ile bir daha çağırman lazım. Silah takma, kıyafet değiştirme gibi şeyleri multicast ile yapabilirsin.

Anlayabileceğin gibi multiplayer bir oyunun mekanikleri kodlaması çok daha farklı ve zor. Ben bile hala tam kavrayamadım. İngilizcen yoksa türkçe kaynak bulman çok zor. Bulsan bile bugsuz ve büyük ölcekli yapımlardan ziyade basit eğlence türündeki bir iki kişilik oyunları yapmaya yetecek bilgileri verir.

Kolay gelsin multiplayer mantığını çözmen 1 ayı bulabilir..

Dedicated server olayı da şöyle oluyor. Oyunu package ederken Client ve Server olarak ayrı şekillderde package ediyorsun. Server buildini dedicated sunucuya atıp orda çalıştırıyorsun. Clientler bu sunucuya bağlanıp oyuna giriyorlar.

https://www.youtube.com/playlist?list=PLemTaQ_N519DocM4AqiK08GfsUSnxRPdv
izleyebileceğin en faydalı video serilerinden biri bu. Karşına çıkabilecek tüm bugları ve çözümlerini basit bir şekilde anlatıyor tabi ingilizce.
 
Proje gitti geçmiş olsun :D Arkadaşların dedikleri gibi baştan yapman gerekecek ama şöyle bir şey var. Mantık olarak aynı olacak sadece girdi çıktıyı ayarlayıp editlemen gerekecek.Ama bir başka sorun daha var işin içine Player controller , GameMode , GameInstance vs vs girecek . Senin iş çok karıştı böyle ilk olarak onları öğren.

GameInstance , GameMode , Player Controller , Session kavramları vs. Daha sonra da Replication olaylarını deneyerek öğren. İlk önce küçük bir multiplayer oyun dene mesela MySql den veri çekebilen online replicationları bulunan Gameınstance üzerinden veri çekip alarak map değişikliğinde bile değişken verilerini koruyabilen farklı player controller ile bilgi alışverişinde bulunabilen bir küçük oyun dene büyük bir sisteme girişmeden önce. 1 ay içerisinde bu oyunu yap ve başarılı olursan kavramları tam anlamışsan sonra da buna giriş. En azından yarı yolda tıkanıp tüm sistemi sil baştan yap olmaz.
 
Cevaplarınız için hepinize teşekkür ederim. Dediğiniz gibi single yapıyım sonra multiplayer yapayım olayı 0'dan yazmaktan daha zormuş.
Ama single player sistem yaptığım için de pişman değilim oyunun işleyiş mantığını item sürükleme giyme gibi olayı. animasyonları skilleri hepsini öğrenmiş oldum.

Bilgiler için teşekkür ederim