Open3

em2native: Unity WebGLプロジェクトを変換用にビルドする

okuokuokuoku

今までWebGL-Nativeと呼んできたけど、それだとDOMを実装してそうということで、 emscripten2native で行きましょうということで。。実際にはEmscriptenも微妙にWASIや単体モードをサポートしてはいるけど。

で、Emscriptenアプリをネイティブアプリに変換するためには、いくつかpre-requisitesがある。

  1. on-memoryでないファイルシステムツリーが存在すること → Unityでは事前にpackされてしまうので一旦unpackが必要
  2. Emscriptenの FS が公開されていること

これらをUnity WebGLビルドで達成する方法のメモ。

okuokuokuoku

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しておく必要がある。

okuokuokuoku

FS をエクスポートする

Unityが使用するEmscriptenのオプションを修正するには、 /ProjectSettings/ProjectSettings.asset をエディタで直接修正する必要がある。

webGLEmscriptenArgs: -s EXPORTED_RUNTIME_METHODS='["FS"]'

このように webGLEmscriptenArgs を使って EXPORTED_RUNTIME_METHODS オプションを設定すると、本来公開されていない FS オブジェクトを外部に公開できる。

em2nativeはこの FS を使って 自前のファイルシステムにUnityのリクエストをリダイレクトする ことになる。