HN公開: 自分のゲームエンジンをオープンソース化
(github.com/moddio)Moddioゲームエンジン 2
- Moddioはマルチプレイヤー優先のゲームエンジン。
- サーバー権限を持つネットワークコード、スナップショット補間、クライアント側調整機能を内蔵。
- 月額5ドルのVMで、50人以上の同時プレイヤーまたは300個以上の移動オブジェクトをサポート。
デモ
- 同梱内容: Box2D物理エンジン、サーバー権限を持つネットワークコード、インベントリおよびアイテムシステム、内蔵プロパティ(HP、エネルギーなど)と再生率、会話システム、ショップ、ユニットコントロール、クライアント側で予測される投射体およびユニット移動、ユニットAIとA*経路探索、モバイルコントロールなど。
ゲームの実行方法
- Node 18以上が必要。
- リポジトリをセットアップした後、
/srcディレクトリに移動してgame-sample.jsonをgame.jsonにリネームし、ルートディレクトリに戻ってサーバーを実行。 - これで http://localhost:80 でゲームをプレイ可能。
新しいゲームをゼロから作る方法
- Moddioゲームは https://www.modd.io で提供されるModdioゲームエディタを使用して作成・編集される。
- ゲーム作成後、ローカルインストールで使用できる
game.jsonをエクスポートできる。 - エクスポートしたゲームJSONを
game.jsonにリネームし、./srcディレクトリに移動。
貢献方法
- ModdioはMITライセンスの下で完全無料のオープンソース。
- コントリビューターになる方法を知るには、貢献方法ページを参照。
クレジット
- Isogenicゲームエンジン、Phaser、PlanckJS、uWebsocket、Box2D、Kenneyアセット、Hero Iconsなどを使用。
GN⁺の意見
- Moddioゲームエンジンはマルチプレイヤーゲーム開発に特化しており、低コストで多くのプレイヤーを支えられる強力な機能を提供。
- オープンソースであり、コミュニティの貢献を通じて継続的に発展しているため、初級ソフトウェアエンジニアにも取り組みやすい。
- ゲーム開発に必要なさまざまな機能が内蔵されており、開発者が素早くプロトタイプを作成してテストできる環境を提供。
1件のコメント
Hacker Newsのコメント
Androidアプリの登録画面で、Googleのユーザー名とパスワードをアプリ内のWebフォームのように見える場所へ入力するよう求められるが、ユーザーにはアプリがパスワードを盗み見していないか確かめる手段がない
普通はアプリがログイン画面へ遷移してから戻ってくるフローを使うものだと思うが、そのパターンの実装が難しいのか気になる。クロスプラットフォーム対応のせいで起きる問題なのかも気になる
ただし、上で述べられているやり方は本当に起きてはいけないことで、Googleがすでに禁止しているものだと思っていた
ユーザーにゲームエンジンを採用してもらうのは決して簡単ではなく、特にクローズドソースならなおさら難しい
サイトのゲームギャラリーを見ると、これまでかなりうまくやってきたように見えるが、数人の仲間が作ったものなのか、それともかなり活発なコミュニティがあるのか気になる
気軽に数日、あるいは数時間かけるだけでも意味のある結果が出る構造を思い浮かべればいい。Flashを思い出せばよい
ゲーム開発者とプレイヤーの両方にとって参入障壁が低いことが、確かに助けになっている。ダウンロードも登録も不要
タイトルだけ見た時点では、これがmodd.ioだとは思わなかった。IOゲームを作るのに使われる人気のフレームワーク/プラットフォームだ
Brainsサーバーの1つに入って、プレイヤー50人ほどでの体験がどんなものか気になって試してみた。WebSocketで予想される通り、動きがややカクついており、似たものを作っているのでネットワーク圧縮についても気になった
LZ-string圧縮だけで十分なのかはよく分からない。プレイヤー50人で毎秒およそ20KB使っているが、Warzoneは150人で毎秒48KB程度しか使っていない。無制限データでなければ、クラウド帯域幅のコストはかなりかさむ可能性がある
圧縮されたバイトバッファが
埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼のように見えるのも不思議だった。LZ-string圧縮の結果が元々こういうものなのかは分からないが、かなり見慣れないとにかく、潜在的なコストを下げるにはネットワーキング面で改善の余地が大きい。プロジェクト全体としては非常に印象的で、よくできた仕事だ
核心はクライアントサイド予測とロールバックネットワーキングアルゴリズムにある。うちのゲーム状態は30Hzで約1KBなので、通常は単一パケットに収まり、そのためWebSocketもそこまで悪くない。もちろん非信頼プロトコルの方がより良い
数か月前にWebSocketsを少しテストしてみたが、理解した限りでは、ゲームのようにレイテンシに敏感な通信でTCPを使うことにはかなりの欠点がある。TCPヘッダーはUDPより2倍以上大きく、追加の制御パケットもあり、古いデータが再送されている間は新しいデータの送信が遅れる。WebSocketsもTCP上で動くので同じ欠点を持つ
それにもかかわらず、TCPはWebSocketメッセージの配送を保証すると言われるが、パケットロスは再現できた。結局、欠点はそのままで、本当に保証配送が必要ならその上に自前で何かを作る必要があり、それなら最初からUDPの上に必要なメッセージだけそう作ればよかったのではないかと思う
ネットワーキングは少し触った程度で、知識も経験もほとんどないので、その点は差し引いて見てほしい
U+3400〜U+4DBF、U+4E00〜U+9FFFが含まれる該当の文字列は
\u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7cにデコードされる[1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
ゲームを絶対に完成させられない確実な方法は、エンジンを書くことから始めることだ
自前の技術を作ること自体は十分可能だが、各段階でその技術は汎用ゲームプラットフォームではなく、自分のプロジェクトに合わせたものであるべきだ
ここで「ブログを始める」というのは、完全にゼロから新しいブログエンジンを作るという意味だ
Node.jsベースのマルチプレイヤーバックエンドは、接続数が増えると結局は這うような遅さになるのを見てきた。これをどう解決したのか気になる
こういう場合、Go のような代替のほうが良いのでは?
バックエンドがフロントエンドのために物理演算のような重い処理をしているわけでもなさそうだし
簡単なテストでは、すぐに遅くなる他の人気WebSocketライブラリよりはるかに高性能だった
だから Node は良い選択に思える
各ゲームは最大64人に制限されているが、100以上の接続までテストしても性能上の問題は見られなかった。各ゲームは分離されたコンテナで実行される
新しいエンジンを作る動機が気になる
READMEを見ると、武器システム(近接/投射物)、ショップ、クライアント側予測による投射物やユニット移動など、かなり具体的なものが組み込まれている
なぜこうしたものをエンジンに焼き込み、コピー可能なプラグインにしなかったのか気になる。もちろん多くのゲームではこうした機能は不要だが、これはゲームエンジンなのか? それともFPS/RPG/その他の特定ジャンル向けエンジンなのか?
技術そのものが嫌いなわけではないが、それでもなお「なぜ?」という疑問が残る。何のためのものなのか? なぜThree.jsと自前サーバーではなくこれを使うべきなのか?
たとえばシンプルなMMORPGを2時間で作った: https://www.youtube.com/watch?v=GZVsxkALR5U
使いやすさとカスタマイズ性の間にはトレードオフがあると考えている。私たちは、作るのが難しいとされるマルチプレイヤーゲームと、カジュアルゲーム開発者との間のギャップを埋めるために前者を選んだ
あなた向けではないのかもしれないし、そういう 特定のゲーム を作りたい人向けのものだ。すべてのエンジンが汎用である必要はない
ここにかなり合いそうな趣味プロジェクトをいくつか持っていた。コーディングはできるが、趣味プロジェクトではそこまで集中したくない時もあるので、ローコード と対話型エディタは趣味開発者には良さそうに見える
個人的に一番楽しみなのはマップとワールド生成だ。ゲームをJSONとしてエクスポートし、プログラムで編集してから再インポートするのが最善の方法に見えるが、そうなのか気になる
ただ、少し気後れする。手を加えていないチュートリアルワールドでもJSONが3500行あるので、理解すべきことが多い
最初に思いついた方法は、意図的に編集を加えてJSONがどう変わるかを見ることだ。良いJSON diffビューアも探してみる必要がありそうだ。そうすれば、触りたい部分を見つける助けになるはずだ。アセットとマップタイルは対話型エディタで集めることになりそう
このアプローチが妥当か、役立つツールがあるのか気になる
私たちのコミュニティのある制作者は、ChatGPTでマップを動的生成している。かくれんぼゲームを作っていて、2DマップJSONを生成するようプロンプトを送り、新しいラウンドが始まるたびにそのマップを読み込んでいる。まだ公開されていないのでゲームは共有しにくい
また、コミュニティメンバーの一人が私たちのゲームJSON用インタープリタを作っている。例: https://pypi.org/project/pymodd/
このような オープンソースプロジェクト がもっと出てくるのはうれしい。GitHubスターが100個未満なのは驚きだ