Godot C# の Web 版に関して
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
現在、 Godot C# (4.2) は Web 版に対応していない。
3.x 系では対応していたのに、なぜ 4.x 系ではサポートされていないか。また今後の方針に関して記載する。
(間違えがあれば、コメントで指摘してほしい)
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
結論
.NET 9.0 GA 以降に実装予定
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
まずはじめに Godot は C# に対応しており、現在 (4.2) 対応しているプラットフォームは以下である。
プラットフォーム | ランタイム サポート | .NET バージョンの最小要件 |
---|---|---|
Windows | CoreCLR, Mono, NativeAOT | 6.0 (CoreCLR), 7.0 (Mono, NativeAOT) |
macOS | CoreCLR, Mono, NativeAOT | 6.0 (CoreCLR), 7.0 (Mono, NativeAOT) |
Linux | CoreCLR, Mono, NativeAOT | 6.0 (CoreCLR), 7.0 (Mono, NativeAOT) |
Android | Mono | 7.0 |
iOS | NativeAOT | 8.0 |
Web | - | - |
3.x 系ではすべてサポートされているが、 4.x 系に以降したときに Desktop 以外のサポートがなくなった。 Android と iOS は 4.2 で実験的機能[1]として追加された。 (本題から逸れるため、詳細は記載しない)
Web も 3.x 系では利用可能だったが、 4.x 系では未だ利用ができない状況である。
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
さて、そろそろ本題とする。
Godot では C# 以外のプロジェクトでは Emscripten を利用し、 C++ のコードを Web Assembly (wasm) に変換することによってブラウザ上で動作させている。
C# は言わずもがな Web Assembly に対応している言語であり、代表的なソリューションとして Blazor wasm が挙げられる。しかし、現在の C# wasm のランタイムは動的リンクに非対応であり、これが原因で動作していない。この issue の Milestone は .NET 9.0 に設定されており、これが先述の .NET 9.0 のリリース以降にサポートされるだろう という結論に結びつく。履歴を見てみると、もともとは .NET 8.0 に設定されていたようだが、延期になったようだ。 (Blazor Static-SSR が実装された代わりに、これとか、 マルチスレッド対応とかが延期されたのかな)この issue の close 後に、 Godot の開発者が dotnet9-preview 版を利用して開発を進めたら、 .NET 9.0 のリリースとほぼ同時に Web 版が使えるようになるかもしれない。 (私の予想では .NET 9.0 リリース後の1-4ヶ月くらいはかかると思うが)
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
Godot 3.x 時代で使えて、 4.x では使えない理由
3.x では Mono を利用していたらしい。
4.x では wasm を利用するため、以前よりも高速で、配信サイズも小さくなる予定である。 (おそらく互換性も向上する)
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
![Lemon73](https://res.cloudinary.com/zenn/image/fetch/s--t4uIcazU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_70/https://storage.googleapis.com/zenn-user-upload/avatar/f1c94ac2a9.jpeg)
追記 (2024/8/4)
Blazor のマルチスレッド対応が気になっている。 (.NET 10 に延期したんだ…。履歴を見る感じ5年くらい延期してる?)
いくつか issue があって、終わっているのもあるっぽい (内容はほぼ読んでないから、違いはわからないけど)
- https://github.com/dotnet/aspnetcore/pull/54062 (9.0-preview2)
- https://github.com/dotnet/aspnetcore/issues/54071 (9.0-preview3)
- https://github.com/dotnet/aspnetcore/issues/54365 (10 planning)
- https://github.com/dotnet/aspnetcore/issues/17730 (10 planning)
現状、終わっていないのは下の2つの issue のみ。ほとんどの作業は .NET 9 で解決したみたい (すごいね)