3D MMORPG Oyun Nasıl Yapılır?

Merhaba. Yine uzun süredir yoğunluktan dolayı blog yazamadım. Telafi babında bir blog yazmak istedim. Zaten bu konu hakkında epey istek vardı teker teker cevaplamaktan yorulmuştum 🙂

Bildiğiniz veya bilmediğiniz üzere biz (Emin Korkusuz, Hüseyin Güneş, Mustafa Yılmaz, Zafer Şekerci ve Dilek Karataş) Tübitak projesi kapsamında elektroGame3D adında 3 boyutlu MMORPG eğitsel bir oyun yapmaktayız. Yapmaktayız dediğime bakmayın; oyunun çekirdeğini Emin Korkusuz ve Mustafa Yılmaz götürmekte. Biz sadece gerekli ama core developer’ın vaktini çalacak taraftaki kısımları yazıyoruz. Yaklaşık 5-6 oldu başlayalı ama henüz yeni yeni playerların bir map üzerinde birbirini görebildiği seviyeye gelebildik. Sıfırdan multiplayer 3d oyun yapmak hiçte gözüktüğü gibi kolay bir olay değilmiş öğrenmiş olduk. Bu kadar reklam kokan hareket yeter, gelelim asıl gelmemiz gereken yere. Bu 6 aylık sürede hiçbirimizin daha önce bulaşmadığı, hiç kaynağı bulunmayan uçsuz bir dünya hakkında deli gibi araştırmalar yaptık. Bu araştırmaların sebebi ise daha evvelden bu tarz birşeyi kimsenin yapmamış olması. Yapmış ise adam akıllı blogunda yazmamış olması. Yazmış ise bile bizim bulamamış olmamız 🙂 Bende düşündüm bi akıllı biz değiliz. Elbet bu tarz oyun projesi olan genç developerlar vardır. Onlar da bizim gibi vakit kaybı yaşamasın kolayca izlemesi gereken yolu bilsinler diye bu blogu yazmaya karar verdim.

Nelerden Bahsedeceğiz? :

  • ManaPlus
    ManaPlus; açık kaynak olarak yayınlanmış 2 boyutlu mmorpg oyun geliştirebileceğiniz bir client.
  • Evol Online, TheManaWorld
    Evol Online ve TheManaWorld, ManaPlus ile geliştirilmiş 2 ayrı 2d mmorpg oyun.
  • eAthena Server
    eAthena Server, Ragnarok Online oyunu tarafından kullanılan server.
  • Hercules Server
    Hercules Server aynı eAthena gibi bir oyun sunucusu.
  • Unity Game Engine
    Unity; 3 boyutlu bir oyun motoru.
  • Forge Networking
    Forge Networking; Unity Assets Store’da 74 dolara satılan, Unity ile multiplayer bir oyun yapacağınız vakit networking işlerini halleden bir uygulama.

Hadi Başlayalım

Yukarıda verdiğim nesnelerin ne olduklarını zaten yazı içerisinde detaylıca göreceğiz. Ama yazı içerisinde ilk duyduğunuzda “hoayda buda nereden çıktı” dememeniz için en baştan yazı içerisinde nelerle tanışacağımızı belirttim. İsterseni adım adım başlıklar halinde gidelim. Yazının takibi daha kolay ve okunurluğu yüksek olur. Adım adım başlıklarımız ise aşağıdaki gibi olacaktır. Aynı zamanda aşağıdaki listeden istediğiniz başlığa tıklayarak direk o başlığa da gidebilirsiniz.

  1. Benzer Konseptteki Opensource Oyunların Tespiti
  2. “Madem 3D opensource bulamadık 2D’ye geçelim bari” Aşaması
  3. “Server bulduk birde buna client lazım” Aşaması
  4. “Herşey tamam ama 2d, bunu 3d yapmalıyız” Aşaması
  5. “2d’den 3d’ye geçirdik ama beklenmedik sıkıntılar çıktı yahu onu napcaz” Aşaması
  6. Sonuç

1. Benzer Konseptteki Opensource Oyunların Tespiti

elektroGame‘i 3D olarak tekrardan yazmaya fiziksel olarak tam anlamıyla başladığımız zaman doğal olarak yaptığımız ilk şey “daha evvelden bu tarz birşeyi birileri yapmıştır yea” demek olmuştu. Bu cümlede dikkat etmemiz gereken 2 nokta var.

1- “tekrardan yazamaya” dedim çünkü elektroGame bizden önceki kadrosu ile zaten yazılmış bir oyun. Ozamanın teknolojisi C/C++ kullanılarak yazılmış 2 boyutlu bir oyunmuş. Biz bunu sıfırdan 3D yazalım diye projeyi tekrardan hayata geçirdik.

2- “daha evvelden bu tarz birşeyi birileri yapmıştır yea” diyerek en büyük hatamızı yaptık. Çünkü daha evvelden yapan birileri yoktu. Varmış ise de “opensource” ruhundan uzak kişiler olduğundan herhangi bir kaynak paylaşımında bulunmaktan kaçınmışlar.

Şimdi aranızda bu laflara inanmayıp “3d mmorpg opensource” diye arama yapacak kişiler olacaktır ve biraz araştırma ile epeyce sonuç bulacaktır. Ama o sonuçların hiçbiri bizim kriterlerimizi karşılamıyordu. Aynı Devlet Bahçeli gibi bir takım kırmızı çizgilerimiz vardı ve o lanet olası sonuçlar bizim redline kriterlerimizi karşılamadığından kullanamıyorduk. Ya Unity desteği olmuyordu ya saçma sapan kodlanmış mmorpg den alakasız oyunlar oluyordu yada fake videolar oluyordu. Bu tarz epey sorun ile karşlaştık. Bu araştırlamar bizi büyük bir hayal kırıklığına uğratmıştı. Sonra düşündük ki bizim elimizde daha önceden yazılmış 2D oyunumuz var ama biraz eskide kalmıştı. Belki birileri 2 boyut alanında birşeyler yapmıştır diye 2d’ye yöneldik.

2. “Madem 3D opensource bulamadık 2D’ye geçelim bari” Aşaması

2D araştırlarına başlayınca en azından neyi araştıracağımızı biliyorduk. Önceden yapılmış bir oyunumuz vardı. Orada kullanılan teknolojilerin güncel versiyonlarını veya alternatiflerini araştırabilirdik. Öylede yaptık. elektroGame‘in 2d versiyonunda server olarak eAthena kullanılmış. Yine eAthena kullanalım istedik ama gördük ki eAthena desteği bitmiş. eAthena’nın github repo’undaki son commit taa 2014’e ait. Biraz araştırma ile eAthena çatısı üzerinden geliştirilmiş ve hala geliştirilmeye devam edilen Hercules Server‘a rastladık. Bir takım incelemeler yaptık ve çok hoşumuza gitti. Tam da bizim oyunun server ihtiyaçlarını karşılayacak türdeydi. Kendi içerisinde Map Server, Char Server ve Login Server’ı barındırıyor aynı zamanda bu 3 server arasındaki haberleşmeyi otomatik olarak kendi hallediyordu. Tek yapmamız gereken sunucuya kurduktan sonra konsoldan “./athena start” komutunu çalıştırmaktı. Bu komutu yazmışken aklıma geldi; Hercules’ün en güzel özelliklerinden biri de hem Linux hem Windows için yazılmış olmasıydı. Böylece sunucunuzun işletim sisteminine göre kurabiliyordunuz. Zaten Hercules’ün github repos’sunu incelerseniz Visual Studio .sln çıktılarını görebilirsiniz. Ve böylelikle sunucu tarafını halletmiş gibi duruyorduk. Şimdiki kısım ise bir client bulmak.

3. “Server bulduk birde buna client lazım” Aşaması

Geçen yine Hercules’ü kurcalıyoruz, Hercules dosyaları arasında bir takım MySQL veritabanı dosyaları olduğunu fark ettik. Hercules Server sadece dümdüz server ihtiyacını karşılamıyormuş meğer. ManaPlus ile uyumlu olarak yazılmış içinde veritabanını da barından bir servermış. Sunucuya Hercules’i kurup çalıştırıyorsunuz, veritabanına SQL dosyalarını aktarıyorsunuz ve client tarafında doğrudan ManaPlus veya ManaPlus ile yazılmış ManaWorld gibi clientler ile doğrudan oyuna giriş yapabiliyorduk.

4. “Herşey tamam ama 2d, bunu 3d yapmalıyız” Aşaması

2d olarak güncel teknolojiler ile herşey tamam. Sıra geldi bu oyunu 3d yapma kısmına. Burada aslında birden fazla seçenek vardı. Ancak ekite kimse daha önce hiç bu alanda birşeyler geliştirmemişti. Tek uğraşan Mustafa’ydı ve oda sadece Unity ile haşır neşirdi. Biz de Mustafa’ya güvendik ve 3d versiyonunu Unity ile yapmaya karar verdik. Unity gelişmiş güzel bir Game Engine. Scripting tarafında C# veya Javascript kullanabiliyorsunuz. Bu karşılaştırmada biz C#’ı seçtik. Sebebi ise yapacağımız iş ufak tefek birşey değildi. Gerek Unity’nin kendi sitesinde gerek diğer destek forumlarında genelde kullanılan dil C#’tı. Ayrıca 2d olarak oluşturduğumuz çatıda ManaPlus; C++ ile yazılmıştı. Geliştirme aşaması boyunca ManaPlus’ı referans alacağımızdan dolayı C++’ı C#’a daha rahat uydurabiliriz diye düşündük.

Kolları sıvayıp Unity ile bu işe giriştik. Ancak bazı sıkıntılar yaşadık. Örneğin client’in Hercules ile haberleşme aşamasında çok sıkıntılar yaşıyorduk. Çünkü “haberleşme” kısmı server ve client’in birbirlerine gönderdikleri bitlik bytelık paketler ile sağlanıyordu ve bu göründüğü kadar kolay birşey değil. Çok karmaşaya yol açıyor. Arada kaybolan paketler, gidip gelmeyen paketler, yanlış gelen paketler derken epey bir sorun yaşadık. Bu sorunu çözmek için Bearded Man Studio tarafından geliştirilmiş Unity Assets Store’da 75 dolara satılan Forge Networking adındaki networking işlerinde bize yardımcı olarak uygulamayı satın aldık. Gerçekten çok faydalı oldu bu uygulama.

5. “2d’den 3d’ye geçirdik ama beklenmedik sıkıntılar çıktı yahu onu napcaz” Aşaması

Unity ile yazmaya başlayıp belli bir süre paket gönder-al işlerini halletmeyi başardık. Başardık dediğime bakmayın o ara ben başka işler ile meşguldum herşeyi Mustafa halletti. (Hade yine iyisin mustafa bak fosforlu for attım sana buradan). Sonrasında nihayet Char’ın Map’e düştüğünü fiziksel olarak görebildik. Ogün çok mutluyduk kendimize adana felan ısmarlardık ^^. Bununla beraber benim taaa en başından beri aklımı kurcalayan ve Mustafa’nın “hallelderiz olum yia” dediği bir problem vardı : “2d’de olmayıp 3d’de olan 3. bir boyut; yükseklik”.

2d kısmında işler kolay; X ve Z kordinatlarını client ve server birbirlerine gönderiyorlar ve ona göre char map’te konumlanıyor. Ancak bizim map 3d olduğundan birde yükseklik işin içine girecek ve neredeyse tüm protokoller ile oynayıp 3. bir boyutu yani Y eksenini de göndermemiz gerekecekti. Zaten gönderip alınan paketler sinek yağını hesap eder gibi bit bit yollanırken böyle birşeyi nasıl yapacaz diye düşünedurdum. Ama sadece düşüne durdum birşey üretemedim. Hani Mustafa “hallelderiz olum yia” demişti ya; adam gerçekten halletmiş. Hiç Y ekseni bilgisini gönderip almadan sunucunun client tarafaının 3d olduğundan haberi bile olmadan charları map üzerinden dere tepe dolaştırmayı başarmış. Nasıl yaptığını bana anlatmıştı ama şuan hatırlamıyorum. Zaten böyle bir oyun yapmaya karar verip taaa bu aşamaya gelirseniz Mustafa yardımcı olacaktır. Böylelikle en önemli 3d sorunlarından birini de çözmüş olduk.

6. Sonuç

Gelgelelim sonuca. Herşeyi bağlayıp toparlayıp yazıyı bitirelim. Kısaca naptık;  Hercules ve ManaPlus kullanarak yapacağımız oyunun 2d olarak çatısını hazırladık. Oyun 3d olacağından client tarafında ManaPlus yerine Unity kullandık. Tabi Unity’de yazılan tüm classları ManaPlus’tan referans aldık. Sonrasında Hercules ile client’in birbirlerine gönderdikleri paketlerin analizini yapıp neyin ne olduğunu anlamaya çalıştık. En çok vakti de bu paket analizi aldı. Sürekli ağ trafiğini dinler vaziyette gönderilen paketin başlığına vakıp Hercules’ün wiki’sinden neyin ne olduğunu anlamaya çalıyorduk. Bu esnada edinmeden edemeyeceğim bir nokta var. Hercules’ün geliştiricilerinin şahane bir irc kanalları var. Adamlar resmen orayı sosyal medya gibi kullanıyorlar. Nezaman girsek kendi aralarında muhabbet sohbet ediyorlar. Birileri gelip 1-2 bug bildirse de çözsek diye bekliyorlar. Adamları taktir etmiştim.

Kısaca bizim izlediğimiz adımlar bu şekil oldu. Şuan sunucunun kapasitesine göre istediğimiz kadar kullanıcı açabiliyor, kullanıcılar char oluşturabiliyor ve o charlar ile map içinde birbimizi görüp gezinebiliyoruz. Şuan işin zor kısmını atlattığımızı düşünüyoruz. Yakın zamanda oyun bitince yine duyururuz buralardan.

 

Kullanılan Araçların Linkleri :

Ve bonus olarak elektroGame3D – https://www.elektrogame.net/

 

Comments on this post

  1. Ben 2d oyun yapıyorum fakat multiplayer hakkinda bilgim yok kaynak onerebilir misiniz?

  2. Çok güzel bir yazı olmuş peki 2d multiplayer oyun nasıl yapabiliriz ?

  3. Alper

    Merhaba,

    Öncelikle bu detaylı anlatımınız için çok teşekkür ederim, çok açıklayıcı olmuş.
    Şimdi sormak istediğim bir şey var, izninizle konuya geleyim hemencecik; herşeyi anladım da nedir bu mmorpg efendim onu çözemedim gibi gibi :/ bi de adam asmaca oyunu yapmak istiyorum işime yarar mı bu mmorpg dersiniz? 🙂

    Başarılarınızın devamını dilerim.
    Not : ekibe saygılar selamlar 🙂

    • Selam reis,

      Valla ben bugüne kadar oynadığı tek oyun cs olan biri olaraktan “MMORPG” terimini elektrogame ile duydum. Bizimkilere sordum “ya olum işte knight, lol felan bunlar mmorpg oyun” dediler. Ekipte bende seni özledik, bir ara gel yeni oyunumuzun demosu karşısında çay içelim ^^

      • Alper

        yakında gelcem kasım gibi oradayım bi aksilik çıkmazsa eğer. daha alacaklarım var memleketten 😀 bi netleşmedi benim işler o yüzden kesin konuşamıyorum bi türlü, gerçi ne zaman net oldu ki diye de söylemde bulunsam yanlış olmaz sanırım 🙂 ayran içelim; daha sert / dereceli olur belki.

        • sene hele bir gelde, ayranlar çaylar sana kurban olsun

  4. “<3 biz <3 kodladık<3 hepimiz<3 3d yaptık<3 çok<3 güzel<3 yaptık<3 3<3 boyutu<3 fena <3"
    tadında olan web sitesi yenilenirse , konsepte kafaya yatarsa ekşi tarzı bilimum platformları ayaga kaldırıcağım oyundur. beklemedeyiz başgan.

  5. fatmanur

    iyi günler yazı cok güzel, calısmanızda basarılar.
    ancak forge networkingi arastırırken bu sayfaya geldim. forge networkingin kullanımı konusunda bir türkçe kaynak bulamıyorum. ben de online karsılıklı oynanabilecek bir oyun yapmaya calısıyorum ancak forge networkingi satın almam yeterli mi. ayrıca hostin almam gerekecek mi? nerden alacağım birbirlerine nasıl bağlayacağım pek anlayamadım.

    port numarasını neye gore belirleyecegim, ip adresi ne olacak gibi şeyleri anlayamadım yardımcı olursan sevinirim

  6. Abdurrahim

    http://www.elektrogame.net sayfası üniversitemiz tarafından engellenmiştir erişimde ısrarcı olursanız yasal işlem falan başlatılacaktır falan diyor kimin serverını kullanıyorsunuz merak ettim.

  7. hande

    keyifli bir yazı. keşke mustafanın hallederiz ya diye yüksekliğe bulduğu çözümü sonradan ekleseydiniz 😀 umarım şuanki tecrübeleriniz ile yeni içerikler gelir

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Trackbacks and Pinbacks

No trackbacks.

TrackBack URL