【Unity WebGL】馬鹿な!?iPhoneはキューブ1つすらメモリ不足で表示できないだと…?

3Dモデルのインポートを行い、あとは「電気をつけて」などの挙動を実現するためのスクリプトの作成を残すのみの状態。楽勝で完成できると思っていたのだが…。

「iPhoneで起動できない」 ― この一言で、すべてがひっくり返ってしまった。

iPhoneでの起動が不安定

iPhoneでの挙動が怪しい感じ

前回テクスチャサイズを下げたことにより、モバイル端末でも起動するようになったばかり。でも実はiPhoneでは起動すらしないこともあり、挙動が不安定だったというのだ。あくまでiPhoneだけ不安定で、Androidでは安定して動作している謎。iPhone Xまでも動かないというのだから始末に負えない。

原因を調査しよう!

ローディングの終わり際にクラッシュして起動しない状態

何が起きているか分からないことにはどうしようもないので、まずiPhoneがどのようなエラーで落ちているかを確認することに。エラーログを確認するため、MacとiPhoneを接続する方法を利用。結果、”Out of executable memory in function at index“というエラーが発生し起動できていないことが判明。

3Dモデルによる負荷が原因?

Out of executable memory in function at indexのエラー

Out of memory(メモリ不足)“と聞いて最初に疑ったのは、当然3Dモデルによる端末への負荷。3Dオブジェクトの数を減らして表示できれば、それが原因であると結論付けることにした。

キューブ1つにしてみた

キューブ1つを表示するためのUnityシーン

さすがにキューブ1つなら表示されるだろう!と思っていたのですが…。残念ながら、表示されず。えっと、これ詰んできたぞ。iPhoneって実はスペック低いんじゃないか?(錯覚)

あー。なんだよ、もう!とりあえず飯だ!飯食ってから考えようぜ?(ダブルチーズバーガーを頬張りながら)

最近のストレス解消法が大食いになりつつあるシバトウ。1か月で5kg太った。

Macをわきに寄せ、マックを食べるシバトウ。しばし、大した策もなく思考停止の状態に陥ったのであった。

情報収集に奔走したあの日々

有力情報もなく時間だけが過ぎていった

Unityもくもく会に参加したり、Web上のありとあらゆる言語の記事を読破する日々が続いたころ。ようやく手がかりとなる記事を見つけることができた。これによれば、「iOS 11.2.2での修正でWebGLを表示するためのWebAssemblyという仕組みがiOS上で壊れてしまった」とある。

その後も直ったり壊れたりを繰り返して今に至るよう。最近でも修正されたはずのバグが再発し、ディスカッションページがReopen(再開)のステータスに変わっていることが分かる。

Unityエディタからasm.jsを選択すればOK!

Unity 2018.3であればproject settings(プロジェクト設定)からasm.jsを選択できる

結論から言えば、WebAssemblyより古い形式であるasm.jsをターゲットにした出力を行うのがベストだった。Unity 2018.3であれば、「Projec Settings > Player > Publishing Settingsの中にあるLinker Targetの設定」からasm.jsを選択することができる。

なお次期バージョンとなるUnity 2019.1では、この設定が削除されWebAssemblyに統一されることが決定している。もしWebGLでモバイル対応を考えている方がいれば、現状では2018.3(細かく言えば2018.3.9以降)を選択することをオススメする。