概要
- Terraria と Celeste をWebAssembly経由でブラウザ上に移植した技術的挑戦の記録
- C# と FNAエンジン を活用し、元のソースコードを最小限の修正でWASM化
- アセット管理 や スレッド対応、 OpenGL描画 の課題と解決策
- FNA Proxy や OffscreenCanvas などの技術的工夫
- Gitリポジトリ や実際に動作するデモも公開
Terraria/Celesteをブラウザで動かすまでの技術的道のり
-
Celeste をブラウザで動かしたという過去の投稿に触発され、独自に移植作業を開始
-
Terraria と Celeste はどちらもC#とFNAエンジンベースであり、同様の手法で移植可能と判断
-
ゲームの デコンパイル と WASMターゲット への再コンパイルを目指す
-
ilspycmd によるデコンパイル時にReLogic.dllが欠如していたが、バイナリから抽出することで解決
-
必要ライブラリ を揃えて再ビルドし、Linux上での起動に成功
- 新規プロジェクトを WASMターゲット で作成し、emscriptenの設定を追加
- FNAエンジン のC++部分はemscriptenのOpenGLエミュレーションでビルド
- FNA-WASM-BUILDを利用し、GitHub Actionsで自動化
- ネイティブライブラリは<NativeFileReference>でリンク
-
ビルド後、最小限のエントリポイントを[JSExport]で公開し、JSからFNAゲームループを制御
-
アセット管理 はOrigin Private File System APIとwindow.showDirectoryPicker()でユーザーから取得
-
Firefox や WebKit 系ブラウザのAPI対応差異も吸収
-
.NET 8.0 wasm ではスレッド未対応だったが、.NET 9.0 wasmでWasmEnableThreadsを有効化
-
メインスレッド問題 はOffscreenCanvas未対応のため、FNA ProxyでOpenGL呼び出しをDOMスレッドにプロキシ
-
FNA Proxy はfishスクリプトでラッパーC関数を自動生成し、C#のPInvokeバインディングも書き換え
-
AES暗号化 未対応はemscripten OpenSSLで自前実装し、<NativeFileReference>でリンク
-
AOT(Ahead-Of-Time)コンパイル でパフォーマンスを大幅向上
-
実際に遊べるデモ と Gitリポジトリ を公開
Celesteのブラウザ移植と追加課題
-
Celeste もFNAベースのため、TerrariaのWASM化手法をそのまま流用
-
SDL3 の安定化によりOffscreenCanvasが利用可能となり、FNA Proxy不要に
-
FMOD (Celesteの音声ライブラリ)はEmscriptenビルドはあるが、Web Worker内での動作に非対応
- wrapスクリプトの再利用は不可能(FMODが非オープンソースのため)
-
Everest mod loader のブラウザ対応も視野
- 追加パッチやEmscriptenのバグ回避も必要
- 依存関係の違いによるさらなる調整
まとめ・リポジトリ・デモ
-
Terraria 移植版デモ:[Terraria in the browser here]
-
Celeste 移植版デモ:[Celeste in the browser here]
-
Terraria Gitリポジトリ :[Terraria git repository]
-
Celeste Gitリポジトリ :[Celeste git repository]
- 各プロジェクトは 公式データ を所有していることが前提
- オープンソースコミュニティ の協力と技術的工夫による成果
- 今後も WASM や ゲームエンジン の進化に伴い、さらなる移植や最適化が期待される