C# ile Geliştirilen Piksel Sanat ECS Oyun Motoru 'Murder'
(github.com/isadorasophia)- Murder Engine, FNA üzerine inşa edilmiş piksel sanat için bir ECS oyun motorudur; şu anda geliştirme aşamasında olduğu için çok sayıda değişiklik ve breaking change beklenmelidir
- Başlangıç örnekleri olarak neocityexpress game jam projesi ve hellomurder gösterilir; dünya, entity ve component oluşturma akışını sergilerler
- Proje yapısı
gamevegame.editorolarak ayrılır; ayrı bireditor.exeolmadan kullanıcının projesi içinde editörü doğrudan kontrol etme yaklaşımını benimser - Geliştirme ortamı Linux, MacOS, Windows, Steam Deck destekler; gereken şey .NET 8 SDK'dır ve oyun hedefleri Linux, MacOS, Windows'u destekler
- Henüz NuGet paketi olmadığı için git submodule olarak ekleyip
.csprojiçinde referans verme yöntemi önerilir; web ve mobil için şu anda resmi destek planı yoktur
Murder Engine'in niteliği ve durumu
- Murder Engine, FNA tabanlı bir piksel sanat ECS oyun motorudur
- Şu anda geliştirilmekte olan bir motordur; release branch'leri stabil tutulmaya çalışılsa da çok sayıda değişiklik ve henüz tamamlanmamış kısım beklenmelidir
- README “Proceed at your own risk” diye uyarır ve breaking change olasılığını açıkça belirtir
Başlangıç örnekleri ve ECS öğrenme yolu
- Hızlıca örneklere bakıp kavramak isteyen kullanıcılar için aşağıdaki projelerden başlanması önerilir
- game jam project: Murder mimarisini görebileceğiniz bir game jam projesi
- Hello World project: dünya, entity ve component oluşturma yöntemini gösteren örnek
- Murder'da ECS'nin nasıl uygulandığını görmek için Bang belgelerine bakılması söylenir
- Bang, Murder'ın kullandığı ECS framework'üdür
Proje yapısı ve editör yaklaşımı
- Murder proje yapısı
resources,src/game,src/game.editorolarak ayrılırgameiçinde son oyun içinbin,packed,resourcesbulunurgame.editoriçinde oyun editörü içinbinveresourcesbulunur
- Harici bir
editor.exeyoktur; yalnızca kullanıcının kendi projesi vardır - Bu yapı, MonoGame veya FNA proje geliştirme tarzında olduğu gibi projenin tamamını doğrudan kontrol edebilmek için seçilmiştir
- Editörün ayrı bir proje olarak tutulmasının nedeni, editör kodunun oyun koduna temas etmemesini sağlamak ve editör tarafında istenen işleri özgürce yapabilmektir
Derleme ve bağımlılık yöntemi
- Şu anda Murder için NuGet paketi yoktur
- Önerilen yöntem, Murder'ı git submodule olarak ekleyip
.csprojiçinde referans vermektir - Referans örneği HelloMurder.csproj dosyasında bulunur
Gereksinimler ve desteklenen platformlar
- Editörü çalıştıran geliştirme ortamı Linux, MacOS, Windows, Steam Deck destekler
- Gereken şart .NET 8 SDK kurulumudur
- Oyun hedef platformları Linux, MacOS, Windows'u destekler
- Linux'a Steam Deck de dahildir
- Konsol desteği şu anda devam eden bir çalışmadır
- Web ve mobil iOS·Android için şu anda resmi destek planı yoktur
Katkı ve geri bildirim
- Proje hâlâ çok erken aşamadadır
- Öneriler veya geri bildirimler için geliştiriciyle iletişime geçilebileceği; gerçek kullanım ve geri bildirimle ilgilenildiği belirtilir
1 yorum
Hacker News yorumları
Adında saint11 olduğunu görünce iyi olacağına emin oldum. Piksel art eğitimleri gerçekten çok iyi düzenlenmiş: http://saint11.org/blog/pixel-art-tutorials/
Yeni oyun motorları ve ECS framework’leri izlemesi keyifli şeyler. ECS kısmı olan Bang’e bakınca
CarComponentgibi bileşenler veCarMoverSystemgibi sistem örnekleri var; sistemler sınıf ve uyguladıkları arayüz de ne zaman çalışacaklarını belirliyor gibi görünüyorDOTS’a biraz benziyor, ama sistemlerin oyuna nerede eklendiğini ve aynı türdeki sistemlerin nasıl sıralandığını henüz bulamadım. Araba ve engeller gibi birden fazla farklı sorgu yapan sistemlerin nasıl göründüğünü de merak ediyorum
Bang kaynak kod üreteci kullanıyor gibi.
GetComponent’ın aksineTryGetVelocity,RemoveFriction,SetVelocity;Velocity,Frictionbileşenlerinin varlığına göre üretiliyor gibi görünüyor. Belki de bileşen ID önbelleği yüzündendir, emin değilimArketip tabanlı değil; her entity
component id => componentsözlüğü tutuyor ve her sistem hangi entity’lerin filtresine uyduğunu izliyor. Performansının ne kadar iyi olacağını bilmiyorum, ama birçok oyunda geliştirici ergonomisi performanstan daha önemli olabilirDeğişiklikler de anında uygulanıyor gibi. Öyleyse bir sistem bir entity’ye bileşen ekleyip/sildiğinde ve bunun filtre eşleşmesini değiştirdiğinde, aynı tick içinde işlenip işlenmemesinin entity ID’sine göre değişip değişmediğini merak ediyorum
Belgelere kabaca baktığımda bu bağımlılıkları veya sırayı açıkça belirtmenin bir yolunu göremedim; bu motorun bunu nasıl ele aldığını merak ediyorum
Bu framework ile yapılmış jam oyununun Itch sayfası ve indirmesi: https://saint11.itch.io/neo-city-express
72 saatlik bir jam oyunu için etkileyici. Sanatı ve yazıları iyi; beklenmedik biçimde mekanik açıdan da eğlenceli
Çok iyi. Editör inanılmaz stil sahibi, hoşuma gitti. MonoGame’i performanslı ve çapraz platform olduğu için her zaman sevmişimdir; ama büyük bir oyun yapmadım, sadece ara sıra demolar yaptım
Güzel görünüyor. C# oyun geliştirmede GC duraklaması sorunu var mı merak ediyorum
Q3A tarzı sahne ve oynanışta oldukça sağlam. Her tick’te değişen sahne öğesi neredeyse yok, bu yüzden GC duraklamaları çoğunlukla ihmal edilebilir
.NET 6+’ta, kendin-yap motorlarda stratejik olarak hızlı tekrarlarla çağrıldığında GC duraklamaları 1–5 ms civarında ölçüldü. Proje ayarlarında eşzamanlı/sunucu/arka plan GC’yi kapatıp ön plan + workstation GC kullanmak en düşük jitter’ı verdi
Seçenekler ya belleği %100 elle yönetmek ya da çöpü olabildiğince sık temizlemek gibi görünüyor. Modern .NET’te düşük seviyeli DLL hack’leri gibi kara büyüler olmadan GC’yi tamamen kapatmak neredeyse imkânsız. İş olayı ya da oyun turu arasında süreci yeniden başlatabiliyorsanız
Process.Exit()de bazı alanlarda geçerli bir GC tekniğihttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
Sadece bağlantıyı okuyarak pek anlayamadım; Murder oyun motoruyla F# oyunu yapmanın ne kadar zor olacağını merak ediyorum
Unity’de ECS’i biraz kullanmıştım; Murder’ın ECS’i çok daha kolaydı. Geliştiriciler gerçekten iyi iş çıkarmış
Murder ile küçük bir arcade oyun projesi yaptım, buradan oynanabilir: https://nopetrides.itch.io/bombs-away
saint11’in tanıtım sayfasında şöyle yazıyor: “Murder Engine: Isa tarafından yapılmış 2D piksel art C# ECS oyun motoru! Ben genelde render ve fizik tarafında yardım ediyorum.”
Isa: https://isadorasophia.com/projects/
Oyun motoruyla ilgisiz ama kötü niyetli birinin “şu hacker sitesi insanları murder’ı tartışıyor” diyebilecek olması komik
Son zamanlarda böyle tamamen zararsız materyallerin ısrarcı bir hasım tarafından nasıl kullanılabileceğini çok düşünüyorum
Yine de bu kadar kolay çürütülebilen bir durumda “insanlar murder’ı tartışıyor” ifadesiyle düpedüz yalan arasında büyük bir fark var mı bilmiyorum
ECS nedir?