em2native: Unity WebGLプロジェクトを変換用にビルドする
今までWebGL-Nativeと呼んできたけど、それだとDOMを実装してそうということで、 emscripten2native
で行きましょうということで。。実際にはEmscriptenも微妙にWASIや単体モードをサポートしてはいるけど。
で、Emscriptenアプリをネイティブアプリに変換するためには、いくつかpre-requisitesがある。
- on-memoryでないファイルシステムツリーが存在すること → Unityでは事前にpackされてしまうので一旦unpackが必要
- Emscriptenの
FS
が公開されていること
これらをUnity WebGLビルドで達成する方法のメモ。
Webサイト上のアセットをunpackする
Unity WebGLでは、ゲームが使うファイルを一つにpackしてしまうようになっている。これだとゲームの起動時に全アセットぶんのメモリが必要になってしまって非効率なのでなんとかする必要がある。
Asset Bundleを使わないようにする (FIXME)
... 後でサポートする方法を検討したい。後回し。
ビルドを圧縮しない
PlayerSettings → Publishing Settings で、Compression Formatを Disabled
に設定する。
unpackする
単純にパス名とファイルをを結合しただけのフォーマットなので展開も簡単。展開すると以下のようなツリーになる。
appfs/boot.config
appfs/data.unity3d
appfs/Il2CppData
appfs/Il2CppData/Metadata
appfs/Il2CppData/Metadata/global-metadata.dat
appfs/Managed
appfs/Managed/mono
appfs/Managed/mono/4.0
appfs/Managed/mono/4.0/machine.config
appfs/Resources
appfs/Resources/unity_default_resources
appfs/RuntimeInitializeOnLoads.json
appfs/ScriptingAssemblies.json
appfs/sharedassets0.resource
appfs/sharedassets1.resource
( appfs
はem2nativeのファイルシステムrootの名称 )
idbfs
を事前にmkdirしておく
いわゆるPlayerPrefsの格納先としてEmscriptenのIDBFSが使用されるので、そのmount pointとしてあらかじめ idbfs
をmkdirしておく必要がある。
FS
をエクスポートする
Unityが使用するEmscriptenのオプションを修正するには、 /ProjectSettings/ProjectSettings.asset
をエディタで直接修正する必要がある。
webGLEmscriptenArgs: -s EXPORTED_RUNTIME_METHODS='["FS"]'
このように webGLEmscriptenArgs
を使って EXPORTED_RUNTIME_METHODS
オプションを設定すると、本来公開されていない FS
オブジェクトを外部に公開できる。
em2nativeはこの FS
を使って 自前のファイルシステムにUnityのリクエストをリダイレクトする ことになる。