C#で制作されたピクセルアートECSゲームエンジン『Murder』
(github.com/isadorasophia)- Murder Engine は FNA 上に構築されたピクセルアート向けの ECSゲームエンジン で、現在も開発中のため変更が多く、breaking change が発生する可能性がある
- 導入用の例としては neocityexpress のゲームジャムプロジェクトと hellomurder が示されており、ワールド・エンティティ・コンポーネントの生成フローを確認できる
- プロジェクト構成は
gameとgame.editorを分離し、別途editor.exeを用意せず、ユーザーのプロジェクト内で エディタを直接制御 する方式を採用している - 開発環境は Linux, MacOS, Windows, Steam Deck をサポートし、必要なのは .NET 8 SDK で、ゲームのターゲットは Linux, MacOS, Windows をサポートする
- まだ NuGet パッケージ はなく、git submodule として配置し
.csprojから参照する方法が推奨されており、Web・モバイルの公式サポート予定は現時点ではない
Murder Engineの性格と現状
- Murder Engine は FNA ベースのピクセルアート向け ECSゲームエンジン
- 現在開発中のエンジンであり、リリースブランチは安定維持を目指しているものの、多くの変更や未完成の部分があることを前提にする必要がある
- README では "Proceed at your own risk" と警告しており、breaking change の可能性を明示している
導入例とECSの学習導線
- 素早く例を見て把握したいユーザーには、次のプロジェクトから見始める流れが推奨されている
- game jam project: Murder のアーキテクチャを確認できるゲームジャムプロジェクト
- Hello World project: ワールド、エンティティ、コンポーネントの生成方法を示すサンプル
- Murder で ECS がどのように適用されているかは Bang のドキュメントを参照するよう案内している
- Bang は Murder が採用している ECSフレームワーク
プロジェクト構成とエディタ方式
- Murder のプロジェクト構成は
resources,src/game,src/game.editorに分かれているgameには最終ゲーム向けのbin,packed,resourcesが含まれるgame.editorにはゲームエディタ向けのbinとresourcesが含まれる
- 外部の
editor.exeは存在せず、ユーザー自身のプロジェクトだけが存在する - この構成は、MonoGame や FNA のプロジェクト開発スタイルのように、プロジェクト全体を直接制御できるようにするための選択
- エディタを別プロジェクトにしている理由は、エディタコードがゲームコードに触れないように しつつ、エディタ側では必要な作業を自由に行えるようにするため
ビルドと依存関係の扱い
- 現時点で Murder 向けの NuGet パッケージ はない
- 推奨される方法は、Murder を git submodule として追加し、
.csprojから参照すること - 参照例は HelloMurder.csproj にある
要件と対応プラットフォーム
- エディタを実行する開発環境は Linux, MacOS, Windows, Steam Deck をサポートする
- 必要要件は .NET 8 SDK のインストール
- ゲームのターゲットプラットフォームは Linux, MacOS, Windows をサポートする
- Linux には Steam Deck が含まれる
- コンソール対応は現在進行中
- Web とモバイルの iOS・Android は、現時点では公式サポートの予定がない
コントリビュートとフィードバック
- プロジェクトはまだ非常に初期段階
- 提案やフィードバックは作者に連絡可能で、実際の利用とフィードバックに関心があると案内している
1件のコメント
Hacker Newsのコメント
saint11 の名前が付いているのを見て、良いものだと確信した。ピクセルアートのチュートリアルが本当にうまく整理されている: http://saint11.org/blog/pixel-art-tutorials/
新しいゲームエンジンと ECSフレームワーク は見ていて楽しい。ECS部分であるBangを見ると、
CarComponentのようなコンポーネントとCarMoverSystemのようなシステムの例があり、システムはクラスで、実装したインターフェースが実行タイミングを決める構造に見えるDOTSに少し似ているが、システムがゲームのどこで追加されるのか、同じ種類のシステムがどう並べられるのかはまだ見つけられなかった。車と障害物のように、異なるクエリを複数行うシステムがどういう形になるのかも気になる
Bangはソースコードジェネレーターを使っているようだ。
GetComponentと違ってTryGetVelocity、RemoveFriction、SetVelocityはVelocity、Frictionコンポーネントの存在をもとに生成されているようで、おそらくコンポーネントIDのキャッシュのためだと思うが、確かではないアーキタイプベースではなく、各エンティティが
component id => componentの辞書を保持し、各システムがどのエンティティがフィルターに合うかを追跡する方式だ。性能がどれほど良いかは分からないが、多くのゲームでは性能より開発のしやすさのほうが重要なこともある変更も即時に適用されるように見える。そうだとすると、システムがエンティティにコンポーネントを追加/削除してフィルターのマッチ可否が変わるとき、同じティックで処理されるかどうかがエンティティIDによって変わるのかが気になる
ドキュメントをざっと見た限りでは、こうした依存関係や順序を明示的に示す方法は見つからず、このエンジンがそれをどう扱うのか気になる
このフレームワークで作られたジャムゲームの Itchページ とダウンロード: https://saint11.itch.io/neo-city-express
72時間のジャムゲームとしては印象的だ。アートと文章が良く、予想外の形でメカニクス面の面白さもある
とても良い。エディターがすごくスタイリッシュで気に入った。MonoGame は性能が良くクロスプラットフォームなので昔から好きだったが、大きなゲームは作ったことがなく、たまにデモを作った程度だった
良さそう。C#ゲーム開発でGCの一時停止問題があるのか気になる
Q3Aスタイルのシーンとゲームプレイでは非常に堅牢だ。ティックごとに変わるシーン要素がほとんどないため、GCの一時停止はほぼ無視できる
.NET 6+では、DIYエンジンで戦略的に高速反復呼び出しを行うと、GCの一時停止は1〜5ms程度と測定された。プロジェクト設定で同時/サーバー/バックグラウンドGCをオフにし、フォアグラウンド+ワークステーションGCを使うほうがジッターは最も低かった
選択肢はメモリを100%自前で管理するか、ゴミをできるだけ頻繁に片付けるかだけに見える。最近の.NETでは、低レベルDLLハックのような黒魔術なしにGCを完全に止めるのはほぼ不可能だ。業務イベントやゲームラウンドの合間にプロセスを再起動できるなら、
Process.Exit()も一部の領域では有効なGC手法だhttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
リンクを読んだだけではよく分からないが、Murderゲームエンジンで F#ゲーム を作るのがどれほど難しいのか気になる
UnityでECSを少し使ったことがあるが、MurderのECSのほうがずっと簡単だった。開発者たちは本当によく作っている
Murderで小さなアーケードゲームのプロジェクトを作っていて、ここでプレイできる: https://nopetrides.itch.io/bombs-away
saint11の紹介ページにはこう書かれている: “Murder Engine: 2D Pixel art C# ECS Game Engine made by Isa! I usually help on the render and physics side of it.”
Isa: https://isadorasophia.com/projects/
ゲームエンジンとは関係ないが、悪意のある人が「例のハッカー系サイトの人たちがmurderについて議論している」と言えてしまう点が面白い
最近、こういう完全に無害な資料を執拗な敵対者がどう利用できるかをよく考えるようになった
それでも、これほど簡単に反論できる場合なら、「人々がmurderを議論している」という表現と露骨な嘘との間に大きな違いがあるのかは分からない
ECSって何?