3Dモデルのインポートを行い、あとは「電気をつけて」などの挙動を実現するためのスクリプトの作成を残すのみの状態。楽勝で完成できると思っていたのだが…。
「iPhoneで起動できない」 ― この一言で、すべてがひっくり返ってしまった。
iPhoneでの起動が不安定
前回テクスチャサイズを下げたことにより、モバイル端末でも起動するようになったばかり。でも実はiPhoneでは起動すらしないこともあり、挙動が不安定だったというのだ。あくまでiPhoneだけ不安定で、Androidでは安定して動作している謎。iPhone Xまでも動かないというのだから始末に負えない。
原因を調査しよう!
何が起きているか分からないことにはどうしようもないので、まずiPhoneがどのようなエラーで落ちているかを確認することに。エラーログを確認するため、MacとiPhoneを接続する方法を利用。結果、”Out of executable memory in function at index“というエラーが発生し起動できていないことが判明。
3Dモデルによる負荷が原因?
“Out of memory(メモリ不足)“と聞いて最初に疑ったのは、当然3Dモデルによる端末への負荷。3Dオブジェクトの数を減らして表示できれば、それが原因であると結論付けることにした。
キューブ1つにしてみた
さすがにキューブ1つなら表示されるだろう!と思っていたのですが…。残念ながら、表示されず。えっと、これ詰んできたぞ。iPhoneって実はスペック低いんじゃないか?(錯覚)
あー。なんだよ、もう!とりあえず飯だ!飯食ってから考えようぜ?(ダブルチーズバーガーを頬張りながら)
Macをわきに寄せ、マックを食べるシバトウ。しばし、大した策もなく思考停止の状態に陥ったのであった。
情報収集に奔走したあの日々
Unityもくもく会に参加したり、Web上のありとあらゆる言語の記事を読破する日々が続いたころ。ようやく手がかりとなる記事を見つけることができた。これによれば、「iOS 11.2.2での修正でWebGLを表示するためのWebAssemblyという仕組みがiOS上で壊れてしまった」とある。
その後も直ったり壊れたりを繰り返して今に至るよう。最近でも修正されたはずのバグが再発し、ディスカッションページがReopen(再開)のステータスに変わっていることが分かる。
Unityエディタからasm.jsを選択すればOK!
結論から言えば、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以降)を選択することをオススメする。