- Ticari oyun motorları olmadan da oyun geliştirmek yeterince kolay ve keyifli olabilir
- Büyük motorların sunduğu özelliklerin çoğuna gerek yoktur; araçları kendiniz yazdığınızda esneklik ve geliştirme verimliliği artar
- Modern C# ve açık kaynak kütüphaneler kullanıldığında, ekip büyüklüğünden bağımsız olarak yeterli bir geliştirme ortamı sağlanabilir
- FMOD, SDL3, Dear ImGui gibi kütüphaneler ile kendi araçlarınızı birleştirerek ihtiyaçlara uygun bir pipeline kurulabilir
- Çapraz platform geliştirme, bakım ve taşınabilirlik açısından, doğrudan inşa edilmiş hafif bir framework oldukça avantajlıdır
Önsöz: 20 yıllık bir oyun geliştiricisinin düşünceleri
- 2025'te de hâlâ ticari oyun motorları olmadan video oyunu geliştiriyorum
- Çevremdekiler, ticari motor kullanmıyor olmama sık sık şaşırıyor
- Unity veya Unreal gibi büyük motorların temel işlevleri, bunları doğrudan kendim uygulamaya kıyasla tatmin edici gelmiyor ve sonuçta birçok kısmı yeniden yapmak gerekiyor
- Ticari motor kullanırken, sık değişen iş politikaları veya güncellemelerin yol açtığı sorunlara maruz kalınıyor
- Her projeye tam uyan küçük araçları doğrudan yazmak daha verimli ve uzun vadede de bakımı daha kolay
Oyun geliştirme için programlama dili seçimi
- Uzun yıllardır ana dil olarak C# kullanıyorum
- Modern C#, geçmişe göre performans, sözdizimi ve geliştirme deneyimi açısından büyük ölçüde iyileşti
- dotnet watch gibi hot reload özellikleri sayesinde, kodu gerçek zamanlı değiştirip test etmek çok pratik
- Geliştirici olmayan kişilerin de daha kolay yaklaşabilmesi, ekip içinde rol paylaşımını ve iş birliği verimliliğini artırıyor
- Yerleşik reflection özelliği, editör ve araç geliştirmede güçlü avantajlar sunuyor
Çapraz platform kütüphaneleri ile render/girdi uygulaması
- SDL3 kullanarak pencere, render, kontrolcü ve çapraz platform desteği dâhil tüm temel işlevleri uyguluyorum
- SDL3'ün GPU abstraction yapısı sayesinde DirectX, Vulkan, Metal gibi farklı ortamlara destek vermek kolaylaşıyor
- SDL üzerine doğrudan yazdığım C# katmanını (ör. Foster) ortak bir yardımcı araç seti olarak kullanıyorum
- Geriye kalan son ticari ses aracı olarak FMOD kullanılıyor; bunun dışında pipeline açık kaynak temelli kurulmuş durumda
- Geçmişte OpenGL/DirectX'i doğrudan uygulama deneyimim de oldu; bu açıdan SDL'nin sunduğu kararlılık önemli bir avantaj
Asset işleme yöntemi
- Kendi motorunuzu kullandığınızda, oyunun ihtiyaç duyduğu dosyaları yalnızca basitçe yüklemeniz yeterlidir
- Piksel art oyunları gibi küçük ölçekli asset'lerde, tüm dosyalar başlatma sırasında tek seferde yüklenir
- Büyük projelerde ise yalnızca gereken asset'ler istek üzerine yüklenir ve sahne geçişlerinde bellekten çıkarılır
- Dönüştürme gerekiyorsa, derleme sırasında otomatik çalışan bir script yazmak çoğu zaman yeterlidir
Seviye editörü ve UI araçları
- LDtk, Tiled, Trenchbroom gibi açık kaynak seviye editörleriyle veri entegrasyonu kolaydır
- Genelde her proje için özelleştirilmiş editörler doğrudan geliştiriyorum
- UI'ın ana gövdesini sıfırdan yazmak yerine, Dear ImGui'nin immediate mode GUI yaklaşımından yoğun biçimde yararlanıyorum
- C# reflection ile ImGui birleştiğinde, oyun nesnelerinin durumunu gerçek zamanlı görselleştirmek mümkün oluyor
- Gerektiğinde amaca uygun harici araçlarla kendi araçlarımı birlikte kullanıyorum
Çapraz platform ve konsola taşıma
- Geçmişte konsola taşıma sorunları yüzünden C++ seçmek neredeyse zorunluydu; ancak C# Native-AOT ile bu sorun büyük ölçüde çözüldü
- FNA gibi açık kaynak framework'lerde konsol desteği aktif biçimde genişletiliyor
- SDL3'ün sunduğu genel amaçlı abstraction katmanı kullanıldığında, çoğu sistemde aynı kod tabanı işletilebiliyor
Geliştirme ortamı: Linux merkezli açık ekosistem
- Ana geliştirme platformumu Linux'a taşıdım; açık kaynak toolchain ile uyumu çok iyi
- Hâlâ belirli ticari yazılımlarla bağlantılar var (ör. vscode, github), ancak açık kaynak ekosistemi büyüdükçe destek de genişliyor
- Kişisel olarak Steam Deck gibi çeşitli Linux tabanlı platformlarda aynı çalışma ortamını kuruyorum
Ek Soru-Cevap ve örnekler
- Godot kullanımı sorusu: Geliştirme ihtiyacı açık kaynak motor odaklıysa Godot öneriliyor; bunun dışında tercih özel araçlardan yana
- 3D çalışma: Büyük motorların avantajları var, ancak küçük ve özel odaklı projelerde özelleştirilmiş framework yeterli olabilir
- Yüksek performans gerektiren teknoloji ihtiyaçları: Gereksinim düzeyine göre Unreal gibi büyük motorları kullanmak da gayet uygun
- Ekip olarak motor değiştirme: Küçük ekipler veya tek kişilik geliştirme için uygun; ayrıca orta ve büyük stüdyolarda da uzun vadeli riskten kaçınma nedeniyle özel motora geçiş örnekleri artıyor
- Asset workflow: Aseprite dosyaları, yerleşik tag'ler ve zamanlama kullanılarak otomatik olarak animasyona dönüştürülebilir
Sonuç
- Ticari oyun motoru olmadan oyun yapmak, tercih ve çalışma biçimine bağlı bir seçimdir
- İhtiyaçlarınızı ve eğlenceyi önceliklendirerek size en uygun yöntemi seçebilirsiniz
5 yorum
Güzel bir çalışma.
Ben birinci nesil oyun geliştiricilerindendim.
Unreal çıkmadan önce elbette geliştirici şirketler için
engine geliştirmek olağandı
ve bu aynı zamanda rekabet gücüydü.
Engine geliştirmede çekirdek, kernel, rendering ve diğer girdi/çıktılar
temelinde araç geliştirme işin büyük kısmını oluşturuyordu.
Ben o zamanlar particle, sound, layer ve object araçlarından
sorumluydum; ekip 7 kişiydi ama kabaca toplandığında sayının 20'yi rahatça geçtiğini sanıyorum.
Bir noktadan sonra Unreal çıkıp seri üretim oyunlar
ortaya dökülünce artık engine geliştirmeye yatırım yapmadılar.
Sanırım o dönemde birçok kişi bağımsızlaşıp kendi şirketini kurdu.
Meğer bunun üzerinden 27 yıl geçmiş.
Ben de yaş aldım ve artık oyun değil başka işlerle uğraşıyorum.
Ekran kartına göre directx ve opengl modları için
çekirdek işleri yaptığım o buruk günler aklıma geliyor.
Gambare...
Son zamanlarda strateji oyunu yapmak için uzun süre bir motor arıyordum; böyle olacaksa birini doğrudan kendim yapmanın daha iyi olacağını düşünmüştüm. Bunu gerçekten uygulayıp başarılı olan bir örnek görünce insanın içine cesaret doluyor.
Hacker News görüşleri
5 yıl boyunca tek başıma 2D bir oyun motoru geliştirip bununla ilgili ücretli işler yaparken, insanların pek bilmediği önemli bir noktayı anlatmak istiyorum
Motor işin kolay kısmı
Asıl önemli olan, motorun etrafındaki araçlar, içerik ve asset pipeline
Farklı veri kaynakları ve formatlardan texture, ses, model dosyaları (
gltf,fbx, animasyon vb.) içe aktarmaEditör uygulamasında kesme, kopyalama, yapıştırma, geri alma, yineleme, kaydetme, silme gibi temel düzenleme işlevleri
Geliştiricinin editörle gerçek veriyi oluşturup değiştirebilmesini sağlayan görselleştirmeler ve özellikler (entity, animasyon, scene, audio graph, scripting desteği vb.)
Statik geometri baking, shader derleme, texture/ses yeniden örnekleme ve paketleme, oyun içeriği asset pack oluşturma gibi veri paketleme ve ön işleme süreçleri
Bütün bunlar bittikten sonra, gerçek runtime kısmı (yani oyunun main loop'u ve alt sistemleri) tüm sistemin küçük bir bölümünü oluşturuyor
Bu yüzden oyun stüdyolarında motorla ilgilenenlerin sayısı az, araç geliştiren programcıların sayısı ise çoktur
detonator motoru: https://github.com/ensisoft/detonator
Genel amaçlı olmaktan ziyade kendi oyunuma uygun bir motor yapmaya odaklanmanın önemli olduğunu düşünüyorum
UI, sıkıştırma gibi şeyler kütüphane ve framework'lerle çözülebilir
OP'nin imGUI gibi küçük kütüphaneler kullanması da buna iyi bir örnek
Tüm oyunlar için bir motor yapmadığınız için, aslında yapmanıza gerek olmayan çok şey ortadan kalkıyor
Motor, asset pipeline'a bağlı küçük bir runtime eklentisi gibi
Bugünlerde shader derleyiciler bile 3D API'lerden giderek daha önemli hale geliyor
İlginç kısım shader derleyicide yoğunlaşıyor; 3D API ise shader çalıştırma ve veri taşıma rolüne indirgeniyor
İnsanlar "motor" derken çoğu zaman asset pipeline'ı ve editörü de bunun içine katıyor
Günümüzün motorları sadece main loop + 3D API fonksiyonlarından ibaret değil
Unity gibi bir motor kullandığında yalnızca render kodu yazan geliştirici sayısı çok az
Elbette Unity/Unreal kullanmak, hiç asset aracı kullanmayacağınız anlamına da gelmiyor
Yakın zamanda devam oyunu için motoru baştan yazarken buna çok katıldım
Postmortem'de de yazdığım gibi, çoğu insan motor denince oyunun çalıştırılabilir dosyasına giren kodu düşünüyor ama pratikte oyunun kendisiyle birlikte dağıtılmayan kodun — seviye editörü, içerik pipeline'ı, hata ayıklama/profiling, geliştirme iş akışı gibi — payı çok daha büyük
Araç geliştirme, motor geliştirmeden daha sıkıcı ve daha kolay yıpratıcı bir iş
Bu yüzden birçok özel oyun motoru projesi yarıda kalıyor
Postmortem: https://ruoyusun.com/2025/04/18/game-sequel-lessons.html
En baştan editör yapmak oldukça büyük bir iş
Mümkünse mevcut editörleri kullanıyorum
Örneğin TrenchBroom (Quake editörü) + func_godot kombinasyonu, 2D tarafında ise Tiled
Oyun verisi yönetimi için CastleDB de vardı ama artık Hide (tam teşekküllü bir 3D editör) ile entegre durumda
Araçları yaptıktan sonra oyunu tasarlamak ve içerik üretmek de başlı başına önemli bir aşama
Birkaç yıl önce SDL2 ve biraz C++ ile basit bir "sprite" sınıfı yapıp collision gibi birkaç temel özellik eklemiştim
Buna illa motor diyeceksek, daha çok elektrikli bisiklet desteği gibi bir şeydi
"Motor"un sık sık projeyi/oyunun tamamını yönlendiren şeye dönüşmesi önemli bir nokta
Oyunları motorlara uydurmak zorunda kalmamak için Unity gibi büyük motorlardan hep kaçınıyorum
Bunlar sonunda hep aynı oyun yapısını üretiyor, değişen sadece varlıklar oluyor
Bence motor öğrenmeye zaman harcamaktansa, SDL ile çok daha kısa bir öğrenme eğrisiyle başlanabiliyor ve SDL oyun dışındaki çapraz platform projelerde de işe yarıyor
Benim oyunum: https://store.steampowered.com/app/2318420/Glypha_Vintage/
Kendi motorunu yapmanın uzun sürdüğü söyleniyor ama Unreal ya da Unity'yi fikirleri doğrudan oyuna çevirebilecek kadar iyi öğrenmek de ne kadar sürüyor diye sormak lazım
Sonuçta kendi motorumu tamamladığımda tam da o seviyede uzmanlığa sahip oluyorum, yani uzun vadede zaman kazandırıyor
Mühendislik kariyeriniz ilerledikçe, zamanı düşününce kendiniz yapmanın avantajı artıyor
Oyun ne kadar sıra dışı ya da nişse, kendiniz yapmanız o kadar mantıklı
Unreal'in karmaşık arayüzünde aylar kaybedip en başta istediğiniz şeyin genel amaçlı bir motorda neredeyse imkansız olduğunu anlamak verimsiz bir deneyim
Öte yandan, sürrealist bir open-world RPG yapıyorsanız her şeyi kendiniz üretmek iyi bir tercih değil
Özel motorların kısıtları bazen yaratıcılığı tetikliyor ve en üst düzeyde olmasa bile daha özgün oyunlar ortaya çıkıyor
Kendim de bir motor yaptım
Başta sayısız deneme-yanılma ve çıkmazla karşılaştım, yaklaşık 1 yılımı aldı
3D rendering, uyarlanabilir UI, skeletal animation, save dosyaları, smart object'ler, pathfinding, scripting, ses, fizik gibi oyunda görebileceğiniz neredeyse tüm alt sistemleri yazdım
Özellikle geri sarma özelliğini (Braid'deki sistem gibi) kendim uyguladım
Böyle bir özellik motorun tüm alt sistemlerinden (script, fizik vb.) destek gerektiriyor
Kendi motorumun her parçasını bildiğim için yeni özellik geliştirirken inanılmaz bir özgürlüğüm var
Ama 1 yıl geliştirdikten sonra giderek tükendim ve motivasyonumu kaybettim
Unreal'i bilmiyorum ama Unity ile geliştirme, elle kod yazmaya kıyasla 10 kattan fazla daha hızlı olabiliyor
Fizik özelliğini 1 dakikada ekleyebilirsiniz ama kendi motorunuzda dış kütüphane entegre etmek bile bir iki gün sürebilir
Unreal kullanıcısı Noel'in gösterdiği dahili görselleştirme özellikleri Unity'de de yerleşik
Bounding box düzenleme gibi şeyler de varsayılan olarak geliyor
Motorun temel davranışı yetmiyorsa, ImGui ya da Yoga tabanlı bir CSS motoruyla kolayca genişletebilirsiniz
Gelişmiş particle editörü, karmaşıklığı gizlenmiş shader'lar, modüler veri akışı gibi sayısız özellik sunuluyor
Teoride hepsini kendim yapmak isterim ama pratikte önce bitirmek gerekiyor
Unreal ya da Unity'yi öğrenip oyun fikrini hemen hayata geçirmek için gereken süre ile, kendi motorunu yazmak için gereken süre aynı soru değil
Küçük bir fikir verin, birkaç saat içinde oynanabilir bir prototip çıkarılabilir
Unity'de başlangıçta sadece biraz programlama yeterli; Unreal'de ise yalnızca Blueprint ile bile neredeyse çıkışa yakın aşamaya kadar gidebilirsiniz
10 dakikada Super Hexagon tarzı bir oyun prototipi yapan videoya bakın: https://www.youtube.com/watch?app=desktop&v=p8MzsDBI5EI
Unity'ye özgü tek belirgin unsur prefab'lar; geri kalanı genel oyun geliştirme kavramları
Unreal geliştiricisiyseniz, Unity'de de 1 saatten kısa sürede benzer bir prototip çıkarabilirsiniz
"Motor tamamlandıktan sonra" varsayımı başlı başına gerçekçi olmayabilir
GameObject.Instantiate gibi basit görünen bir davranışı bile bir motorda kendiniz uygulamak için muazzam kaynak gerekir
2D/3D fizik, shader'lar, platform desteği gibi karmaşıklıkları düşünün
Hedefiniz motorsa motor yapın; amacınız oyunsa oyunu yapın görüşündeyim
Bir oyun motoru yazacak kadar oyun geliştirme bilginiz varsa
Unreal ya da Unity'yi öğrenip bir prototip çıkarmak için bir gün yeter
Tam ustalık uzun sürer ama istediğiniz oyun prototipini ortaya çıkarma süresiyle kıyas kabul etmez
"Her şeyi yapan" büyük motorlar olmadan da oyun yapmak daha kolay, daha eğlenceli ve bazen daha verimli
Ama motorun belli bir özelliğine (örneğin Unreal'in inverse kinematics'i ya da animasyon blending'i) derinlemesine girmeye başlayınca, "iyi ki bunu 2-3 haftada kendim yazmak zorunda kalmamışım" diye düşünüyorsunuz
Minimalizm ya da şişmeyi önlemek önemli ama bu motorlar ağır işi üstlendikleri için popüler
Eskiden ben de böyleydim
İlk 3D oyunumu yaparken input, nesne yönetimi, culling, model yükleme, matematik kütüphanesi, grafikler, normal map, SSAA gibi her şeyi kendim yazdım ama oyunun tamamlanma oranı %0 kaldı
Yine de hobi amaçlı 2D projelerde hâlâ sadece tarayıcı canvas'ı ile, bağımlılıksız geliştiriyorum
Aslında burada motor görevini tarayıcının kendisi görüyor
"İyi ki kendim yapmamışım" görüşüne karşı
Uzun vadede bir bağımsız geliştirici kariyerini düşünüyorsanız, birkaç hafta sürse bile konuyu derinlemesine anlamak ve kaynak kodunun %100'üne sahip olmak ve bunu tekrar kullanabilmek daha değerli
Benim bitirme tezim, NeXTSTEP/Objective-C tabanlı bir particle motorunu Windows 95/Visual C++ tarafına taşımakla ilgiliydi (OpenGL tabanlıydı, marching cubes örneği de vardı)
Böyle şeyler bugün motorlarda neredeyse tek satırlık özelliklerin bir parçası haline geldi
Motor kullanınca proje çok daha hızlı ilerliyor ve altyapı geliştirmeye zaman harcamak gerekmiyor
Tekerleği yeniden icat etmek çoğu insan için o kadar da eğlenceli değil
Inverse kinematics ya da animasyon blending gibi özellikler
Eğer oyununuzun merkezindeyse uygulamaya değer; değilse gereksiz bir teknik tuzak
Lua ve Love2D ile, tamamen kendi tarzımda oyunlar yapıyorum
Kendime bilinçli kısıtlar koymak işin eğlencesinin büyük parçası
Geliştirme eğlenceli olmaktan çıktıysa, bu bir şeylerin yanlış gittiğinin işaretidir; o zaman daha iyi bir yöntem ararım
Oyunum YOYOZO sadece 39KB ama Ars Technica'nın 2023'ün en iyi oyunları listesinde büyük yapımların yanında yer aldı
https://news.ycombinator.com/item?id=38372936
Playdate'i aldıktan yıllar sonra SDK'sıyla uğraşmaya başladım, Lua'yı da ilk kez öğreniyorum
Güçlü tiplendirme ve dil güvenliği isterdim ama eldeki iş için yeterli
Şimdilik yaptığım tek şey, crank'e göre sahte 3D uzayda dönen metinlerden oluşan küçük bir teknik demo
https://bsky.app/profile/haydenblai.se/post/3lpgnya4cqk2a
Bu projeyi yaparken, eski CRUD/web app kariyerim yüzünden trigonometriyi neredeyse tamamen unuttuğumu fark ettim
Playdate geliştirmenin en güzel yanı, sabit bir canvas olması sayesinde piksel konumlarını bir kez ayarlayınca her cihazda aynen çalışması
Önceki geliştirme kariyerimde hep responsive UI yaptığım için bu deneyim bana çok taze geldi
Bir oyun motoruyla (Godot, Unity, Unreal vb.) bir şey yapmaya çalıştığımda hep motorla boğuşuyormuşum gibi geliyor
Sonunda sanki önceden belirlenmiş bir oyun biçimine asset yerleştiriyormuşsunuz gibi oluyor ve istediğim oyunu yapmak zorlaşıyor
Web geliştirmeye benzetirsek, WordPress gibi hazır paket bir çözüm hissi veriyor
Varsayılan yapı niyetinizle örtüşmediğinde, çok büyük hack'ler ve dolambaçlı çözümler gerekiyor
Burada "oyun şablonları" da ateşe körükle gidiyor
Başlık ekranını ve modelleri değiştirerek bitmiş oyun gibi görünen şablonlar satın alabiliyorsunuz
Steam'deki yeni oyunların neredeyse yarısı, Unity/Unreal şablon oyunlarının hafifçe farklı skin'lenmiş versiyonları gibi görünüyor
Çeşitli örnekler:
https://assetstore.unity.com/packages/templates/…
https://store.steampowered.com/app/2488370/Cash_Cleaner_Simulator/
https://store.steampowered.com/app/2073910/A_Webbing_Journey/
https://store.steampowered.com/app/3498270/Better_Mart/
https://store.steampowered.com/app/2625420/Drive_Beyond_Horizons/
https://store.steampowered.com/app/3163790/Toy_Shop_Simulator/
https://store.steampowered.com/app/3023600/Horse_Farm_Simulator/
https://store.steampowered.com/app/3124550/Liquor_Store_Simulator/
Google Play'de tüm oyunlar birbirine benziyor; uzun yükleme süreleri, render sorunları, bozuk metinler, ses hataları gibi Unity'ye özgü problemler yaşanıyor
Mobil reklam odaklı bir "idle RPG" için bunlar kabul edilebilir olabilir ama VR alanında Unity kullanılmasını gerçekten anlamakta zorlandım
Meta Quest Store performans hedeflerini tutturmak için Unity motorunun büyük bölümlerini söküp yeniden yapmak gerekiyor
Performans hedeflerini karşılamak zor ve çalışma biçimi de eski usul
Kaliteli yazılım üretmek istiyorsanız, en baştan güven vermeyen bir motorla bunu başaramazsınız
Yazar (Noel), Celeste adlı oyunun geliştiricisidir ve oyun 3 milyondan fazla satmıştır
https://en.wikipedia.org/wiki/Celeste_(video_game)
Ben de büyük ölçüde katılıyorum ve kod odaklı bir C# oyun framework'ü geliştiriyorum (XNA/Monogame'in manevi halefi, SDL yerine Sokol kullanıyor)
https://zinc.graphics/
Modern C#'ın güçlü yönleri: çapraz platform, NativeAOT derleme, native hot reloading, reflection vb.
Ben şahsen source generator desteği de ekledim
Geçmişten gelen olumsuz algılar var ama son 5 yılda CoreCLR ve dil tarafındaki gelişim gerçekten etkileyici
Tek dileğim Union Types; şu anda öneri aşamasında ve gelecek yıl eklenmesini umuyorum
https://github.com/dotnet/csharplang/blob/main/proposals/TypeUnions.md
C#'ı yalnızca Win32 ya da Unity içinde kullandım; C/C++ tarafında düşük seviye motor bilgim var ama C#'ın oyun konsolları gibi çapraz platform alanlarda mümkün olmadığını sanıyordum
Artık bunun yanlış olduğunu fark ediyorum
Her tür yazılımda başlangıçta her şeyi sıfırdan yapmayı tercih ederim
Büyük proje deneyimi olan birine bu yavaş gelebilir ama startup aşamasında aslında daha hızlıdır
Sadece gereken minimumu uygularsınız; soyutlamalar oturduktan sonra yeni özellik ekleme hızı daha da artar
Kurumsal ölçekte büyük yazılımla, kendi yazdığım küçük motorun üretkenliği tamamen farklı
Kendi yazdığım kodu kesip biçmek, yeniden düzenlemek çok daha kolay olduğu için çok daha hızlı ilerliyorum
Bu yüzden mikroservisleri ve küçük ekipleri seviyorum
Kendiniz yaptığınızda, deneme-yanılma ve her an patlayabilecek bir mayın tarlasından geçmek zorundasınız; ayrıca dilin ya da platformun gerçek karakterini öğrenmek de yıllar alıyor
Ama sonuçta bütün bu süreç geliştiricinin gerçek birikimine dönüşüyor
Motor yerine MonoGame düzeyinde bir framework kullanmak nasıl olur diye merak ediyorum~
"O sürecin kendisi en nihayetinde geliştiricinin birikimi olarak kalıyor" sözüne kesinlikle katılıyorum.