Azeroth’a Giderken
3 min read

Azeroth’a Giderken

Golang ile MMORPG sunucusu kodlasam nasil olur diye dusundugum anlarin sonuncusu, uyku tutmayan bir dogum izni sabahina denk gelince editoru actim ve gRPC ile ufak bir servis yazmaya basladim.

service RPG {
  rpc EventLoop (stream Event) returns (stream Event);
}

message Vector {
  float X = 1;
  float Y = 2;
  float Z = 3;
}

message Event {
  string From = 1;
  Timestamp When = 2;
  Vector Position = 3;
  Vector Destination = 4;
  string Prefab = 5;
}

Ilk halini iyi hatirlamiyorum, epey uykusuz gece ve gunduz onceydi, lakin yukaridaki gibi bir Protobuf schema olusturdum. Hedefim, istemciden gelen her mesaji ona X mesafedeki herkese bildirecek kadar basit bir servis yazmak ve keyfime gore yola devam etmekti.

DEFCON 19: Hacking MMORPGs for Fun and Mostly Profit konusmasinda, konusmaci MMO’lara nasil bot yazabildigini anlatirken “oyun gelistiricileri cok saf” dedigi bir kisim var. Servisi basit tutmak adina bir cok konuda istemciden gelen veriye guvenmek nelere yol aciyor, birinci agizdan dinledigim halde, yine birseyleri basit tutmak adina ayni yolu secerek devam ettim. Nasil olsa, her sey deneyseldi…

Golang ile yazilmis sunucu kismi yeterli olgunluga erisince (bkz. derdini anlatabilecek kadar), ayni Protobuf schema dosyasindan C# kodu ureterek bir de Unity icin istemci yazdim.

Unity’de ise basladigim ay, sevgili Ciro’dan oryantasyon sirasinda aldigimiz yarim saatlik Unity egitimi ve son bir kac ay metro yolculuklarini Unity videolari izleyerek gecirmenin verdigi birikim ile, asagidaki gibi bir sahne olusturup, bunu gRPC ile sunucuya baglamak cok zor olmadi.

Bunlar oyuncular. Rasgele bir konum secip hareket ediyorlar.

Sunucu iletisim testleri, bir sure sadece kupleri oynatarak gecti. Komutlarin sayisi artti, hareketin yanina bir de istenen koordinatlarda efektler gosterme eklendi derken Unity’de bunlari gorsellestirme isi, gRPC kismini kodlamaktan daha eglenceli bir hal alir oldu.

Duzlemin yerine yer sekilleri kullanayim, kupler yerine karakterler olsun, yavas gidiyorsa yurusun, hizli gidiyorsa kossun, efektler daha eglenceli olsun, agaclar olsun, kopruler olsun derken sonraki bir ay boyunca her gece birer saat Unity’de arazi ve bitki ortusu deneyleri, animasyon denemeleri, kamera acisi ayarlari ve kontrolleri ile gecti.

Ilk denememe ait video bu degildi, ancak ayni surumden aldigim bir kayit asagidaki gibi olmustu.

Gonul WoW turu bir kamera acisi kullanmak isterdi ancak bu konuda bir video cekmek gerek :) Ne kadar az alani gosterirsem o kadar performans elde edecegim icin onlarca deneme sonrasinda boyle, tepeden bir aci kullanmaya karar verdim. Performans ve kamera acilariyla ilgili sorunlar nedir merak ediyorsaniz, Witcher 3'e ait bolumlerden birinin nasil tasarlandigini anlatan Building Beauclair videosunu izleyebilirsiniz.

Klavye kontrolleri yerine, neden fare ile “tikla ve git” tercih ettigime gelince, o da tamamen iletisim protokolu ile alakali. Anlik hareketlerin sunucuya iletimi ve diger istemcilerde gosterimi, ancak bir yere kadar tutarli oluyor. Atlamali, kesintili hareketler bir sekilde duzeltiliyor ancak, tikla-ve-git mimarisinin “A karakteri (X, Y, Z) koordinatina V hizinda kosuyor” turundeki, diger kontrol sistemine kiyasla cok daha az bantgenisligi ve sac/sakal harcatan kolayligi, isimi cok kolaylastirdi.

Gorsellerin hicbirini kendim yapmadim, bunu da belirteyim bir kez daha. Unity Asset Store’dan, ozellikle de Synty modellerinden fazlasiyla faydalandim. Haftada en fazla birkac saat ayirabildigim hobi icin, Blender ya da Maya ile modelleme ve animasyon yapmak imkansiz olurdu…

Duzlem ve kuplerden, agaclarla dolu arazide oradan oraya kosturan karakterler haline gelen prototip, videosunu yayinladigim haliyle bile bilgisayar oyunu haline getirmeye cok uzakti. Onboard kartlarda calissin, frame-rate her zaman sabit olsun, takilmalar olmasin, arabirim anlasilir olsun derken, tahmin edilemeyecek kadar uzun surebiliyor oyunu istediginiz noktaya getirmek. Ama MVP tadinda bir surume evrilmede yaptiklarimi siz nasil yapabilirsiniz ogrenmek icin kullanabileceginiz video listesi ve arama terimleri soyle:

Ilk denemeyi, ikinci videoyu izleyerek yaptigimi ozellikle belirteyim.

Simdilik sadece bolum gecisleri ve hikaye anlatimi sirasinda kullanmayi planladigim ucuncu kisi acisi videosunu asagida gorebilirsiniz. Witcher 3 videosunun bir kisminda “bolumleri oyle dizayn edin ki, kameranin cok uzagi gostermesi gerekmesin” diyor. Burada tepelerin uzerindeyken kameranin cok uzagi gostermesi gerekiyor ki, ancak iyi bir ekran kartiyla mumkun oluyor takilmadan goruntu alabilmek. Dusuk poligonlu modeller kullanmanin da bir anlami olmuyor.

Bu tur tercihlerin altinda yatan sebepleri merak ediyorsaniz, eminim “fake it till you make it” diye ararsaniz bircok kaynak bulabilirsiniz :)

Unity ogrenmeye MMORPG yaparak baslamak pek tavsiye edilmiyor, hatta Brackeys’in 100 Unity Tips videosu “MMORPG yapmayin” diye bitiyor. Isin sunucu kismina daha yakin biri olarak aradigim “challenge”, yillardir bir MMORPG backendi uzerinde calismakti. Unity’de ise baslamak ve gezegenlerin ayni hizaya girmesi bahane oldu.

Oyunun gorunus ve oynanisi kisminda ogrenme surecim devam etse de, 2020'de mutlaka oynanabilir bir surum cikarma hedefim var. Nasil bir oyun olacak diye soran bir takipciye, “Nacizane MORPG olacak, MMORPG zor” dedikten sonra NMORPG.com adresini almaya ve gelistirmeye resmen baslamaya karar vermistim. Sessiz kaldigim zamanlarda Steam Store sayfasini hazirladim, rahatsiz oldugum birkac kismi elden gecirdim; simdi de temel oyun mekanikleri uzerinde calisiyorum.

Bu asamada early-access hesap dagitip, ilkel gorunum ve basitligi ile kimsenin hevesini kirmak istemedigim icin sadece video yayinlayacak ve vakit buldukca gelistirici gunlugu paylasacagim.

PS: Size tavsiyem, Unity’nin yeni ogrenim serisi ile kendinize bir sans vermeniz. Unity ucretsiz, egitimler de oyle. Bir deneyin derim.

Enjoying these posts? Subscribe for more