axiomverge

Unity’den Monogame’e Yolculuk – 1

Bu yazı “ıdı ile bıdı” karşılaştırma yazısı değil. Aradığınız şey oyun motorları karşılaştırması ya da incelemesi ise yanlış yerdesiniz.

Önceki yazımda, neden Unity’den Monogame’e doğru bir sürece ihtiyaç duyduğumu anlatmaya çalışmıştım. Bu yazıda, kısaca incelediğim frameworklerden ve Monogame’den bahsedeceğim.

Seçeceğim framework’ün açık kaynaklı olmasını istiyorum. Unity’de ki sorunlardan şikayetçi olsanızda, yeni framework’te daha fazlasıyla karşılaşacağınıza emin olabilirsiniz. Açık kaynaklı bir yapıda karşılaşacağınız sorunların bir kısmını framework’ün kaynak kodundan düzeltme/iyileştirme şansınız olur. Açık kaynak güzel şey, küçük bir sorunu bile düzeltip-değiştirseniz, “bir faydanız dokunmuş” gibi hissedersiniz. Açık kaynak prensiplerinin küçük bir balıkçı kasabasını donanımın Silikon Vadisi haline nasıl getirdiğini -sonuç tartışılır olsa bile- izlemenizi tavsiye ederim.

 

 

İş ve kişisel hayatımda Swift, Java(Android SDK), Php, C# gibi pek çok dili kendime yetecek kadar kullanıyorum. Objective C dışında hemen her dil ile bir dönem mutlaka ufak tefek birşeyler geliştirdim. İtiraf etmeliyim, Microsoft’u sevimli bir firma olarak görmüyor olsam bile, developerlar için ürettikleri en iyi şeyin C# olduğunu düşünüyorum. Microsoft son dönemde çok hızlı evrilmeye ve günümüz trendlerini takip etmeye başladı. Eskiden Windows->Linux veya Açık Kaynak prensipleri yanyana gelemezdi. Günümüzde neredeyse Mono Project’i destekler hale geldiler. Xamarini satın almaları ve geliştirme araçları ile iOS-Android kütüphanelerini ücretsiz dağıtmaya başlamaları, Mono lisanslarını MIT yapmaları büyük yenilik. C#’ı seviyorum ve mümkünse onunla devam etmek istiyorum.

Bir oyun motoru ya da framework’ten beklenebilecek diğer kriterler malum; performans, mobil, topluluk ve 2D araçları…

 

libgdxlogo

 libGDX‘in Java olduğunu öğrendiğimde “hade len” diye içimden geçirdim. Java ve görsel performans. Test etmedim ama okuduğum her yorumda masaüstü performansının çok çok iyi olduğu yazılmış. Çok geniş bir kullanıcı kitlesi ve üretilmiş pek çok oyun var. Kaynak kod’u çok sık güncelleniyor. GitHub’da onlarca eklenti ve hayatınızı kolaylaştıracak araç bulmak mümkün. Youtube eğitim videoları ile dolu. libGDX, temel bir 2D oyunun ihtiyaç duyacağı hemen herşeyi low-level OpenGL yardımcıları ile destekliyor.

libGDX, iOS için RoboVM kullanıyor. Günümüzde sanal makinelerin performansları ilerlemiş olsa bile özellikle mobilde, üstelik oyun söz konusu olunca ciddi kaygılar oluşuyor. RoboVM ile ilgili diğer sorun ise geleceğinin olmaması. RoboVM ekibi, sanal makinenin geliştirmesine 15 Nisan 2016 itibari ile son verdi. libGDX geliştiricileri, iOS için alternatif çözüm olarak Intel’in Multi-OS Engine‘ine güveniyorlar.

Ancak ister Multi-OS Engine ister RoboVM’in fork’larından birini kullanın pek çok sorun ve ciddi eksiklikle karşılaşmanız olası. libGDX ekibi, RoboVM lisansına sahip olanların 17 Nisan 2017’ye kadar kullanmaya devam etmelerini öneriyorlar. Yeni Multi-OS’da beklenmedik sorunlar olacağı açık. Öncelikli platform hedefiniz iOS ise dikkatli olmanızı ve mutlaka kendi testlerinizi yapmanızı tavsiye ederim. Onun dışında Java seviyorsanız tüm masaüstü oyunlarınız için libGDX güzel bir seçim. Her oyun geliştiricinin en azından kurcalaması şart.

libGDX’i kurcalamaktan uzak durmamın tek sebebi Java. Java ve Java IDE’lerinden hiç zevk almıyorum.

 

sdl_logo

Büyük patron!

SDL’e burada yer vermemin tek nedeni bilmeyenler için kısa bir tanıtım yapmak. Oyun geliştirmenin temeline en çok yaklaşacağınız araç olduğu için değinmeden geçmek istemedim.

O oyun motoru mu hızlı, bu oyun motoru mu hızlı diye kapışıyorlar ya! Performans mı istiyorsun? Al kardeşim, otur SDL ile kendi oyununu, kendi oyun motorunu yaz.

SDL aslında bir oyun motoru ya da oyun geliştirme framework’ü değil. SDL, C ile yazılmış C++ ile geliştirilebilen, low-level OpenGL ve Direct3D katmanı. Kabaca; OpenGL ve Direct3D tarafından sağlanan ses, klavye, mouse, joystick, ve grafik veri ve donanımlarına doğrudan erişim sunan bir katman. Onlarla ne yapacağınız size kalmış. Bir mühendislik projesi olabileceği gibi görsel, işitsel performans gerektiren her türlü amaç için kullanıma uygun.

Dota 2, Trine 1-2, Don’t Starve gibi oyunlar SDL ile geliştirilenlerin sadece küçük bir kısmı. Valve kendi oyun motoru ile ürettiği oyunlarının farklı platformlara aktarılmasında SDL’den faydalanıyor. CryEngine’in de SDL kullandığı biliniyor.

SDL neredeyse derlenebildiği tüm cihazlarda çalışıyor. SDL’i, C++ dışında kullanmak karizmayı bozsada, farklı diller için mevcut olan bağları (bindings) kullanılabiliyor. Phyton, Lua ve C# ile geliştirme yapmak mümkün. Ancak bu bağların bazı sınırları var ve hepsinde SDL’in tüm özelliklerinden faydalanamıyorsunuz. Bu bağlar, oyun yapımında pek çok framework tarafından kullanılıyor (Monogame ve FNA gibi). SDL 15 yıldır geliştirildiği için çok stabil olduğu söyleniyor. Derdim performans diyorsanız, buyrun bakalım 🙂

SDL’i kurcaladıkça günümüz oyun motor ya da framework’lerinde neyi neden yaptığınızı çok daha iyi anlayacaksınız. Oyun geliştiriciliği konusunda profesyonel kariyer hedefliyorsanız, mutlaka SDL hakkında bilgi sahibi olmalısınız.

 

cocoslogo

Nedense hiç sevemediğim framework. Sanırım tuhaf API’sinden dolayı, bilemiyorum… Pek çoğunuz için harika bir seçim olacaktır. Tonla yazılı tutorial ve video bulmanız mümkün. Büyük, aktif bir topluluğu, üretilmiş binlerce oyun var. Cocos2D-XNA ve CocosSharp gibi C# için uyarlaması da mevcut. Ancak Cocos2D’yi C# uyarlamaları ile kullanmaya kalkışmak pek doğru bir yol olmaz sanırım. Sadece öğrenmek için bir seçenek olabilir. Cocos ile uğraşmak beni mutlu etmediği için pas geçiyorum.

 

godotlogo

Godot ismini duymuş ve belki kurcalamışsınızdır. Kısaca bahsetmek istiyorum; Godot, Unity’nin küçük, açık kaynaklı kardeşi. Godot, Unity’e benzer bir yol izliyor. Kendi editörü var. Unreal’ın Blueprint‘ini andıran görsel programlama (Visual Scripting) eklentisi geliştiriyorlar. Godot’un performansını bilmiyorum ama geliştirme konusunda çok güzel ilerliyorlar. Mutlaka incelenmesi ve takip edilmesi gerekiyor.

Godot’un bence tek olumsuz tarafı GDScript (Godot script) adında, Phyton benzeri kendisine özgü bir dil kullanıyor olması. Gerçekten yeni bir dil ile uğraşmaya ihtiyacım yok. Henüz C# desteği olmadığı için pas geçtim ama takip etmek istiyorum. Çünkü yukarıda bahsettiğim, Microsoft’un Mono lisansında yaptığı değişiklikten sonra Godot geliştiricileri sonraki sürümde(3.6) C# destekleyeceklerini duyurdular. O zaman performansını görmek için test etmeye değer. Mevcut sürümde (3.5) iOS export biraz uğraş gerektiriyor. Hızla gelişen bir topluluğu var, geliştiricileri aktif.

“Yıl olmuş 2016, sen hala editörü olmayan oyun motoru diyorsun” diyen, oyun geliştirmeye yeni başlamış ya da biraz ilerlemiş arkadaşlara Godot’u tavsiye ederim.

  • Zorlanacaksınız. Mutlaka bir yerde takılacak ve çözmek için uğraşmanız, uğraşırken daha fazla şey öğrenmeniz gerekecek -ki bu güzel-
  • Ülkemizde, başlangıç ve orta seviyede geliştiricilerin Unity ile geliştirdikleri, “bence çöp” olan oyunların büyük kısmı Godot ile geliştirmeye uygun.
  • Karşılaşacağınız sorunların çözümüne yardımcı olarak topluluğa fayda sağlayabilirsiniz.

Kendi emeğiniz ile bulacağınız çözümlerinizi başkaları ile paylaşarak koyun sürüsünden ayrışmaya başlayabilirsiniz. Biraz olsun tüketmek yerine katkı sağlamak emin olun size iyi gelecek.

###

Açıkcası aklıma gelen, zamanında kurcaladığım diğer oyun motorları ya da framework’leri yeni birşey sunmadıklarını gördüğüm için es geçtim.

###

 

monogamelogo

Baştan söyleyeyim; Monogame mucizevi bir araç değil. Bu yola girmeye karar verirseniz, en basit konularda bile sorunlarla mücadele etmeye hazır olmalısınız.

Monogame, zamanında üretilen XNA oyunlarını diğer platformlara aktarabilmek için ortaya çıkmış bir proje. Monogame’in ilk temellerini atan arkadaşların işi mevcut XNA oyunlarını farklı platformlara aktarmakmış. Evet, oyunları farklı platformlara aktarma işi çoğunlukla başkaları tarafından yapılıyor ve bu işi yapıp tonla para kazanan insanlar var. Böyle bir kültür var. Bu insanlar genelde freelance çalışıyorlar. Maalesef pek çok oyunda isimlerini görmüyoruz. Bu da sektörün bir parçası.

XNA, Microsoft’un 2004 yılında, Windows, Windows Phone ve Xbox 360 platformuna oyun geliştirmeyi kolaylaştırmak için geliştirdiği bir framework ve araçlar bütünü. XNA framewok döneminde ücretsiz sunuluyor. XNA içeriklerini oluşturmak için ücretli ve topluluk sürümleri bulunan XNA Game Studio kullanılıyor. 2004 yılında duyrulan XNA, 2013 yılında Microsoft tarafından sonlandırılıyor. Aktif olduğu dönemde tonla oyun geliştirmesinde kullanılıyor.

XNA’in popüler olmasının en önemli nedenlerinden birisi API’si. Gerçekten çok güzel derlenmiş bu API’nin bugün Unity’de bile yansımalarını görmek mümkün. İlgilenenler XNA Game Studio 4.0 (Refresh)’ın dökümantasyonuna buradan ulaşabilirler.

 

 

Monogame ve kardeşi FNA‘in geliştiricileri temelde aktarma(port etme) işinde çalışan abiler. Bu abiler XNA’in API’sini (aynen) OpenGL ve DirectX üzerinde çalışacak şekilde aktarıyor ve paketleme araçlarını yazıyorlar. Arkada Mono Project bulunuyor. Monogame, XNA 4’ün üzerine yol kat etmiş ve bulundukları yeri XNA 5 olarak adlandırıyorlar. Monogame Fez, Bastion gibi oyunların masaüstüne, konsollara ve mobil platformlara başarı ile geliştirmesinde ve/veya port edilmesinde kullanılmış. Hatta Bastion’u geliştiren Supergiant, iOS uyarlaması için kullandıkları yapıyı GitHub üzerinde yayınlamışlar. Fez’in geliştiricisi Renaud Bédard’ın yorumlarını kendi blog’unda okuyabilirsiniz.

 

 

Monogame Windows, MacOS, Linux, PS4, XboxOne ve Xamarin.iOS ile Xamarin.Android üzerinden mobil desteklerken, FNA sadece Windows, MacOS ve Linux destekliyor. Performans farkları konusunda bilgim yok. PS4 geliştirme için Sony izni gerekirken, Xbox için UWP ile geliştirme yapmak için izne ihtiyacınız bulunmuyor. Kendi Xbox One’ınızı geliştirme makinesi olarak tanımlayarak kullanabiliyorsunuz. Ancak UWP’nin oyunlar için çok uygun olmadığı belirtmek gerekir. Kompleks oyunlarda ciddi performans problemleri çıkacaktır. Xbox One için, XDK ile geliştirme yapmanızda mümkün ancak id@Xbox‘a kayıtlı olmanız gerekiyor.

 

 

Monogame uzun süre (mevcut 3.5 sürümü) OpenGL wrapper’ı olarak OpenTK, FNA ise baştan beri SDL kullanıyor. Ancak OpenTK’nın güncellemelerinden tatmin olmayan Monogame ekibi yayınlacak olan 3.6 sürümünde SDL’e geçiş yapıyor.  Monogame, yeni sürümde yer alacak SDL için aslında FNA’in geliştiricisi tarafından yazılmış(yukarıda bahsettiğim) SDL2-CS bağlantısını(binding) kullanıyor.

Monogame’de mobil desteği, Xamarin’in iOS ve Android eklentileri ile sağlanıyor. Microsoft’un Xamarin’i satın almasından sonra bu eklentiler ücretsiz hale geldi. Xamarin, mevcut sürümde iOS ve Android üzerinde OpenTK kullanıyorlar. Monogame ekibi, Xamarin’in SDL’e geçip geçmeyeceği görmek için şimdilik beklemede. İleride mobil içinde SDL kullanmayı planlıyor.

Monogame ve FNA , tüm XNA API’sini yani namespace’leri barındırıyor. Bu nedenle XNA için yıllar içersinde yazılmış tüm örnekleri, kütüphaneleri kullanma şansınız var. GitHub bunlarla dolu. Ancak Monogame DirectX12, Vulkan, Metal gibi yenilikleri henüz desteklemiyor. Tüm bunlar planlar arasında ve çalışmalar devam ediyor görünüyor. Monogame bu noktadan sonra XNA API’sinden uzaklaşmak ve kendi yolunu çizmek durumunda kalacak. Neler olacağını bekleyip görmemiz gerekiyor.

Monogame’in temel güncellemelerini Sickhead Games yapıyor. Küçük bir ekip, geniş bir topluluk ile işleri yürütüyor. Monogame’in Axiom Verge‘ü Xbox One’a aktararak Microsoft’a kendisini kanıtlaması ile Xbox One’ın kapıları açılmış oldu. Xbox One’a gelecek diğer oyun ise Flint Hook.

 

 

 

Monogame’i geliştiren ve kullanan ekibin başındaki Tom Spilman ile yapılmış röportajda Sony, Microsoft ilişkilerini, kendi konumlarını ve Monogame’in geleceği hakkındaki görüşlerini öğrenebilirsiniz.

 

Neden Monogame?

C# ve Mono ile geliştirilebiliyor olması, Unity ile oyun geliştirme kariyerine başlamış olanlar için güzel bir alternatif. Tüm araç ve editörler ücretsiz olarak sunuluyor. Açık kaynak kodlu ve yıllar içersinde birikmiş çok fazla örnek mevcut. İster 2D ister 3D olsun, oyun geliştirmenin temellerini öğrenme konusunda modern ve esnek bir ortam sunuyor.

XNA eski, hatta artık Microsoft tarafından geliştirilmiyor olsa bile çok güzel bir API. Pek çok detayı öğrenmeye başlamak için oldukça uygun. Yapısı itibari ile temel unsurlar hariç hemen herşeyi geliştiriciye bırakıyor. Özellikle masaüstü ve konsol oyunları için performansı çok uygun. Xamarin’in lisanslarında değişiklik yapması ile birlikte tamamen ücretsiz olarak mobil’e oyun yayınlayabiliyorsunuz. GitHub’da XNA ve Monogame için yazılmış tonla içeriğe ulaşmanız mümkün. Hatta Monogame üzerine geliştirilmiş pek çok bireysel oyun motorunu GitHub’da bulabilirsiniz. Monogame ile hayatı kolaylaştırmak için NEZ benzeri frameworkler bulmak mümkün. Ancak yeni başlayan geliştiricilere Monogame’i olduğu gibi kullanmayı öğrenmeye çalışmalarını tavsiye ederim. Emin olun ileride Unity ile devam edecek olsanız bile neyin neden yapıldığı ile ilgili çok daha sağlam bir temele sahip olacaksınız.

Monogame’in Youtube kanalında eğitim videolarını bulabilirsiniz.

###

Gündelik hayat ve işlerden fırsat buldukça Monogame ile uğraşmak bana keyif veriyor. İçinizde Monogame’i tecrübe etmiş olan varsa ve deneyimlerini paylaşırsa çok sevinirim. Sonraki yazımda Monogame kurulumu ve temel yapısını anlatmaya çalışacağım.

 

Selim Anaç

Selim Anaç

More than 20 years of working experience at digital products as games/advergames, mobile & desktop apps and online software production. Multi-discipline software developer, team leader. A video game addict.