Soru Metin2 Hareket Sistemi

Herhangi bir konuda danışmak istediğiniz soru varsa bu öneki seçebilirsiniz.

DaRKLoRD

Üye
Üye
Mesaj
51
Çözümler
4
Beğeni
30
Puan
669
Ticaret Puanı
0
Merhaba, Metin2'nin hareket sistemi ile ilgili sorularım var. Öncesinde sizlere bir hikaye anlatmak istiyorum. Bu soruyu neden sorduğumu daha iyi anlamanız için hikaye size yardımcı olacaktır. Merak edenler spoiler kısmına bakabilir. Direkt konuya geçmek isteyenler ise spoiler ile uğraşmadan mesajın devamını okuyabilir.

Uzun süredir Metin2'yi tek kişilik hale getirme düşüncem var. Bunu yapmak için birçok denemem oldu fakat henüz hedefime ulaşabilmiş değilim. Hatta bu hedefimin bir kısmından vazgeçtim.

Paylaşılan sunucu/istemci dosyalarını (buradan sonra bunlara 'oyun dosyası' diyeceğim) indirip kuruyorum. Biraz oynadıktan sonra çeşit çeşit hata. Birçok eksik kod, eksik dosya. Bir eksiği kapatmak için farklı bir oyun dosyası indir, eksik kısım bu dosyalarda var mı kontrol et, varsa kullanacağın dosyaya ekle, yoksa başka bir oyun dosyası indir. Bu süreç çok fazla vaktimi aldığı gibi hevesimi de kaçırıyor. Niyetim şu oyunu tek başıma oynayabilmek. Sürekli "sorunsuz" diyerek dosya paylaşan insanların arkasından bolca hayır dua etmişimdir😅 Sorunsuz dedikleri dosyada koskoca bir olayın kodu eksik. Bunu bildirdiğim zaman "eksiksiz olmak zorunda mı?" gibi cevaplar verip kısa süreli sinir krizi geçirmeme sebep olabiliyorlar. Bu yüzden Metin2 dosyalarını tek kişilik hale getirmekten vazgeçtim. Tek isteğim 1-99 ya da 1-120 seviye aralığında, sistem barındırmayan, oyunun saf halini koruyan, hatasız ve eksiksiz dosyalar bulup test ederek tek kişinin oynayabileceği hale getirmek ve paylaşmaktı. Benim gibi tek başına oynamak isteyenlere (tabi varsa) bir eğlence çıkmış olurdu. Ayrıca bu süreçte "şöyle bir özellik olsa işimi kolaylaştırır" diyerek ekleyeceğim yenilikler belki sunucu sahiplerinin de işine yarayacaktı. Neyse. Sonuç olarak ben Metin2'nin ocak söndüren kodlarından vazgeçtim ama hayalimden, hedefimden vazgeçer miyim? Sormak bile yanlış😄 Bu sebeple oyunun Unity (C#) versiyonunu yapmaya karar verdim. "Şunu yaparım, bunu yaparım, şu da güzel olur" derken oyun kağıt üstünde büyüdü ve bambaşka bir noktaya geldi. Bu büyüyen projeyi yeni bir oyun olarak rafa kaldırdım ve tek kişilik Metin2 projeme geri döndüm.

İlk olarak Metin2'nin birebir yapısını oluşturacaktım. Sunucu kodu yazmama gerek yoktu çünkü oyun tek kişilik olacaktı. Modeller, haritalar, animasyonlar, sesler umurumda değildi. Onları istediğim zaman ekleyebilirdim. Aç yabani köpeğin gri bir kapsül olarak görünmesi ya da dolunay kılıcının dikdörtgen olması sistem oturana kadar sorun değildi. Fakat mekaniklerin orijinal oyundakilerle birebir aynı olması ya da yüksek oranda benzemesi gerekiyordu. İlk olarak hareket sisteminden başladım ve bir türlü ilerleyemediğim nokta bu oldu. Detaylara öylesine takıldım ki yaptığım hiçbir hareket sistemi beni tatmin etmiyordu. Bunu yapana kadar diğer hiçbir mekaniğe girişmeyeceğim dedim ve öyle de yaptım. Sonra uzun süre verilen bir ara ve nihayet günümüzde yeniden başlama kararı.

Kısacası Metin2 mekaniklerini "sunucu tarafı olmadan" birebir ya da çok benzer şekilde Unity oyun motoru ve C# diliyle yeniden oluşturmak istiyorum. Bunu da açık kaynak olarak paylaşma niyetindeyim. Verilecek tüm fikir ve önerilere de açığım. Konuyla ilgili bir topluluk oluşursa da benim için mutluluk verici bir gelişme olur.

@MT2Dev Metin2'nin işleyişinde birçok noktaya hakim olduğunuzu düşündüğüm için sizi etiketlemek istedim.

Metin2'de karakterlerin hareketleri nasıl çalışıyor? Oyuncular, yaratıklar ve oyun içindeki diğer tüm hareketli nesnelerin hareketleri nasıl bir sistemle işliyor bunu bilmek istiyorum. Bu sistemi Unity'de yeniden oluşturacağım.

Unity'de rigidbody ve velocity kullanmayı ve ışın atarak ilerletmeyi denedim fakat istediğim sonucu alamadım. Gayet oynanabilir hareket sistemleri oluşturdum fakat birebir işlediğini hissettirmiyor. Tahminimce hareket sistemi iki eksende çalışıyor. Hiçbir nesnenin yukarı-aşağı hareket ettiğini görmedim. Daha doğrusu zeminden koptuğunu görmedim. Ejderha uçarken bile aslında modeli uçuyor. Etkileşime girilen ana nesnesi zeminde duruyor. Bir de harita tasarlama programında biraz göz gezdirmiştim. Ulaşılamaz bölgeleri belirlerken haritanın boyanması gerektiğini hatırlıyorum. Bu yüzden hareket sisteminin bir map/koordinat verisi okuduğunu düşünüyorum. Yorumlarınızı ve yardımlarınızı bekliyorum. Şimdiden herkese teşekkürler.
 
yanılmıyosam bilgiler server_attr diye bir dosyaya kaydediliyor. dosyada nerde yürünmez, nerede kimse kimseye saldıramaz, nerde su var gibi bilgiler kaydoluyo. oradan okuyo. hareket x ve y eksenlerinde oluşuyo. metin2 tarzı oyun için unity üzerinde tıklayarak yol alınan bir hazır asset (asset mi diyim ne diyim bilemedim asset demek istedim) var onu kullanıp onun üzerine geliştirme yapabilirsin. sonradan tekrar mouse ile tıkladığın yere hareket etme zımbırtısı yapmamak için.
 
x y z eksenleri olarak haritalarda x ve y kordinatları kullanıyor. yükseklik olarak z ekseni kullanılmıyor ve haritalarda yürünebilir ve yürünemez olarak işaretleniyor bölgeler. merdivenden çıkma vb. durumlarda da aslında yok, karakter sadece yürüyor, altındaki nesnenin .mdatr uzantısı yerden yukarıya çıkıyor ama yukarda olması ve yerde olması aynı kordinata tekabül ediyor, bu yüzden de ekstra uğraş vermeden köprü gibi yapıların altından karakteri yürüttüğünüzde köprü hizasına geldiğinde birden karakter köprünün üzerine çıkıyor.

dediğiniz uçma animasyonlu binek de aynı ekstra düzenleme yapmadan sadece model üstte gözüküyor ama işleyişte zeminle temasta.

z ekseni eklenen oyunlardan görseller:
 
@hasanmacit dosya bilgisi verdiğin için teşekkür ederim. Uzun bir uğraştan kurtardın. Unity önerin için de teşekkürler fakat sol tık ile hareket olayını kendim yapmak istiyorum. Sadece yol bulma algoritmasını hazır kullanacağım. Onu da baştan yazacak halim yok 😅 Onun dışında her şeyi kendim geliştireceğim.

@Tengrist bilgiler için teşekkürler. Sistem düşündüğüm gibi çalışıyormuş bunu öğrenmiş oldum.

Yorumlarınız için teşekkürler. Bu mevzunun teknik olarak nasıl işlediğini de merak ediyorum. Örneğin yere ışın atarak mı koordinat hesaplanıyor? Diyelim ki karakterimi yürüyebileceği alanın sınırına kadar getirdim. Savaşçım hava kılıcını açmış, evinin camından içeriye bakıp eşinin yemek yapışını izliyor. O sırada +9 çeliğin parlayışını kıskanan komşusu gelip arkadan bir darbe indiriyor. Savaşçımın darbe etkisiyle öne doğru fırlaması gerekiyor ama bina olduğu için fırlamıyor. İşte buradaki hesap nasıl yapılıyor? Bunun teknik bilgisine sahip olan var mı? Işın atarak mı? Collisionla mı? Ya da en azından bunun kodlarını hangi dosyalarda bulabilirim bunu söylerseniz çok sevinirim.
 
@hasanmacit dosya bilgisi verdiğin için teşekkür ederim. Uzun bir uğraştan kurtardın. Unity önerin için de teşekkürler fakat sol tık ile hareket olayını kendim yapmak istiyorum. Sadece yol bulma algoritmasını hazır kullanacağım. Onu da baştan yazacak halim yok 😅 Onun dışında her şeyi kendim geliştireceğim.

@Tengrist bilgiler için teşekkürler. Sistem düşündüğüm gibi çalışıyormuş bunu öğrenmiş oldum.

Yorumlarınız için teşekkürler. Bu mevzunun teknik olarak nasıl işlediğini de merak ediyorum. Örneğin yere ışın atarak mı koordinat hesaplanıyor? Diyelim ki karakterimi yürüyebileceği alanın sınırına kadar getirdim. Savaşçım hava kılıcını açmış, evinin camından içeriye bakıp eşinin yemek yapışını izliyor. O sırada +9 çeliğin parlayışını kıskanan komşusu gelip arkadan bir darbe indiriyor. Savaşçımın darbe etkisiyle öne doğru fırlaması gerekiyor ama bina olduğu için fırlamıyor. İşte buradaki hesap nasıl yapılıyor? Bunun teknik bilgisine sahip olan var mı? Işın atarak mı? Collisionla mı? Ya da en azından bunun kodlarını hangi dosyalarda bulabilirim bunu söylerseniz çok sevinirim.
Oyun sahnesinde terrain hariç gördüğün her şey (karakterler, moblar, binalar, lambalar, objeler vs.) her biri ayrı ayrı bir sphere içerisinde hapistir ve o şekilde işlenir. Çarpışma konusunda ise evet dediğin gibi collision ile engelleniyor veya izin veriliyor.
InstanceBaseBattle.cpp içindeki CInstanceBase::CheckAdvancing() fonksiyonu referans alınabilir.

Koordinat hesaplama kısmı ise ışın atarak değil TPixelPosition vektörünün karekökünün hesaplanmasıyla gerçekleşiyor. (sqrtf)
Mouse ile terrain üzerine tıklanıldığında, eğer tıklanan nokta izin verilen distance içerisinde ise koordinatın(x,y) karekökü alınır ve oluşan değerler karakterin ilerleyeceği yeni koordinatlar olur. Bu yeni koordinata giderken de eğer collision engellerine takılmazsa ilerlemeye devam eder. Bunlarla beraber tabiki rotasyon hesabı da yapılıyor.
 
@Kaiser çok teşekkür ederim gayet açıklayıcı bir cevap. Verdiğiniz fonksiyon referansı da işime yarayacaktır. Sanırım Metin2 hareket sistemi tamamen vektör tabanlı çalışıyor. Collision kontrolü yapıldıktan sonra gidilecek yön yine vektörel olarak hesaplanıyor. Vakit buldukça araştırmaya ve geliştirmeye devam edeceğim. MMO Tutkunları kullanıcılarını da ara sıra rahatsız edeceğim gibi görünüyor 😁
 
Bu kadar abartılacak bi şey yok. Modern bir oyun motoru kullanıyorsun, karakter movement'tin nesinde zorlandın? Z ekseninin kullanılmamasının sebebi her karakterin uçamaması ve uzağa bir skill atamıyor olması. Engellerle temasta tabii ki collision kullanılacak. Mouse ile yürütmek için de bi yere tıklandığında oyuncu kamerasından trace atılır, çarpışma varsa kontrol edilir ve karakter o noktaya gönderilir. Basılı tuttuğunda da sürekli trace atmaz, mouse pozisyonunu dünya pozisyonuna çevirip yönlendirir. Sanırım biraz kafan karışık. Olay metin2'den çok unity ve c# kısmında gibi geldi bana.
 
Bu kadar abartılacak bi şey yok. Modern bir oyun motoru kullanıyorsun, karakter movement'tin nesinde zorlandın? Z ekseninin kullanılmamasının sebebi her karakterin uçamaması ve uzağa bir skill atamıyor olması. Engellerle temasta tabii ki collision kullanılacak. Mouse ile yürütmek için de bi yere tıklandığında oyuncu kamerasından trace atılır, çarpışma varsa kontrol edilir ve karakter o noktaya gönderilir. Basılı tuttuğunda da sürekli trace atmaz, mouse pozisyonunu dünya pozisyonuna çevirip yönlendirir. Sanırım biraz kafan karışık. Olay metin2'den çok unity ve c# kısmında gibi geldi bana.
Haklısın.
 
Etiketlediğin için bir yorum yazma ihtiyacı hissettim fakat zaten oldukça detaylı açıklamış arkadaşlar, üstüne eklenecek pek bir şey yok. Metin2 Unity veya benzeri bir oyun motoru kullanmadığı için oyunda gördüğün her şey eski usul yöntemler kullanır, bunu eski arabalarla yeni arabalar arasındaki fark gibi düşün, yeni araçlarda her şeyi beyinler ve elektrik yönlendirir, eski araçlarda her şey mekaniktir, burada da durum benzer. Bunu oyundaki her sistemin işleyişinden, client-server arası iletişimden vs. yorumlayabilirsin, Unity gibi yeni bir motorla çalışacaksan bazı şeyleri modern yöntemler kullanarak sıfırdan yapman gerekebilir yani eskisine tamamen sadık kalmak çok zordur, sevgiler.
 
Etiketlediğin için bir yorum yazma ihtiyacı hissettim fakat zaten oldukça detaylı açıklamış arkadaşlar, üstüne eklenecek pek bir şey yok. Metin2 Unity veya benzeri bir oyun motoru kullanmadığı için oyunda gördüğün her şey eski usul yöntemler kullanır, bunu eski arabalarla yeni arabalar arasındaki fark gibi düşün, yeni araçlarda her şeyi beyinler ve elektrik yönlendirir, eski araçlarda her şey mekaniktir, burada da durum benzer. Bunu oyundaki her sistemin işleyişinden, client-server arası iletişimden vs. yorumlayabilirsin, Unity gibi yeni bir motorla çalışacaksan bazı şeyleri modern yöntemler kullanarak sıfırdan yapman gerekebilir yani eskisine tamamen sadık kalmak çok zordur, sevgiler.
Yorumun için teşekkürler. Evet gayet iyi açıkladılar. Aslında bahsettiğin noktalarda çok az da olsa bilgi sahibiyim. Orijinal oyunun kodlarıyla uğraşmaktan vazgeçme sebebim de bu. Çok fazla eksik, çok fazla hata var. Bunları düzeltmek ve optimizasyon yapmak, bu esnada da oyunu bozmamak için iyi seviyede C++ bilmem gerektiğinin farkındayım. En azından bunu iyi şekilde yapmak istediğim için böyle düşünüyorum. Bu durum gözümü korkutuyor. Mevcut işim gereği de C++ öğrenmeye vakit ayıramıyorum. Yakında Türkçe yerine C# ile derdimi anlatmaya başlayacağım 😅

Değindiğin nokta çok güzel. Güncel sistemlerde eskileri birebir taklit etmek zor olabiliyor. Bazen öyle ya da böyle yeni sistemleri kullanmak gerekiyor. Evet Unity vb motorlar çok ciddi iş yükünden kurtarıyor ama kod üzerindeki hakimiyetim de bir o kadar azalıyor.

Yorumlarıyla foruma ve insanlara katkıda bulunan herkese teşekkürler.
 
Geri
Üst