Unity-WebGL
#Unity のWebGLビルド
WebGL での開発を始めるにあたって
emscriptenコンパイラツールチェーンを使用して、Unityのランタイムコード(CおよびC++で記述)をWebAssembly(Wasmとしても知られています)にクロスコンパイルしています。
.NETゲームコード(C#スクリプト)をWebAssemblyに変換するには、IL2CPPという技術を使います。IL2CPPは、.NETのバイトコードを、対応するC++のソースファイルに変換し、それをemscriptenでコンパイルして、スクリプトをWasmに変換します。
と、結構ビルドパイプラインが複雑になってる
制限
System.Threading名前空間の要素はすべて使用できない
VisualStudioでデバッグできない
IPソケットに直接アクセス出来ない
グラフィックAPIはOpenGL ES2.0(3.0)準拠になる
オーディオAPIはWebAudioAPI準拠になる
AOTプラットフォームである
事前に機械語に変換するよという話
JITの対義語(実行直前に機械語に変換)
System.Reflection.Emitを使った動的コード生成は使えない
WebAssembly is Here!
もうちょっと詳しい実装内容。
IL2CPP, emscripten, binaryen を使用してwasmにコンバートしてる
最終的に<ビルド名> .wasm.code.unitywebが生成される
asm.jsより小さいらしい
最小のビルドサイズを得るには
すべての組み込みシェーダーを除外し
圧縮形式としてBrotliを使用して
すべての不要なパッケージを除外する
メモリ使用量の制限
UnityWebGLは、動的にメモリを確保するが、確保できる最大量は環境ごとに異なる
エディタースクリプトで、PlayerSettings.WebGL.emscriptenArgs = "-s WASM_MEM_MAX = 512MB";をする事で、確保する最大量を制限できる。これでブラウザ間の差異をなくす(低い方に合わせる)
wasmバイナリは、IndexedDBにキャッシュされる
デバッグに関してはDebug.Log()で頑張ってね