iOS15.4のSafariでUnity WebGLが動かない問題の対応策
はじめに
こんにちは、Crispy!です。
先日iOS15.4がリリースされましたが、これまで動いていたUnity WebGLプロジェクトが軒並みエラーを吐いて起動しない問題に悩まされました。
ここではUnityの公式フォーラムでの情報をベースに、私の環境でも試して成功した対策をメモとして残します。
あくまで暫定対応策であり、今後は状況が変わることが予想されますのでご注意ください。
また、今後状況が改善すれば、情報を随時更新したいと思います。
今、何が起きているのか
一次ソースとしては以下のUnity公式フォーラムを参照してください。
iOS 15 + WebGL 2 issue - Unity Forum
簡単に情報をまとめると
iOS15.4ベータ版より、Safari上でUnity WebGLが起動しなくなる
wasmのビルドサイズが9MBを超えたあたりで発生する
iOS15.4正式リリースでもこの状況は変わらない
Unity社としても重大な問題として対応している
UnityEditor側で対応出来る暫定対応策が見つかった
といった状況です。
エラーが発生すると以下の様な表示になります。
対策手順
私が実施した手順は以下の通りです。
環境:Unity 2020.3.19f1 / Windows10 21H2 64bit
参考:iOS 15 + WebGL 2 issue - Unity Forum
1. UnityEditorへパッチを当てる
UnityEditorのIL2CPPの中にあるGenericMetadata.cppを書き換えます。
(念のため、必ずバックアップを別の場所に残しておきましょう!)
ファイルの存在する場所の例として、WindowsでUnityHubを使ってインストールし、標準からディレクトリを変えていない場合は以下になります。
C:\Program Files\Unity\Hub\Editor\(Unityバージョン)\Editor\Data\il2cpp\libil2cpp\metadata\GenericMetadata.cpp
このソースコードをエディターで開いて、
const Il2CppType* GenericMetadata::InflateIfNeeded
を検索し、
このfunctionの前に #pragma clang optimize off
このfunctionの後に #pragma clang optimize on
を挿入します。
以下は書き換え後の抜粋です。
(省略)
#pragma clang optimize off
const Il2CppType* GenericMetadata::InflateIfNeeded(const Il2CppType* type, const Il2CppGenericContext* context, bool inflateMethodVars)
{
switch (type->type)
{
case IL2CPP_TYPE_VAR:
return InflateGenericParameterIfNeeded(type, context->class_inst);
(中略)
default:
return type;
}
}
#pragma clang optimize on
static baselib::ReentrantLock s_GenericClassMutex;
typedef Il2CppHashSet<Il2CppGenericClass*, Il2CppGenericClassHash, Il2CppGenericClassCompare> Il2CppGenericClassSet;
static Il2CppGenericClassSet s_GenericClassSet;
(省略)
2. WebGLのキャッシュを削除する
既存のプロジェクトの場合、上記1の手順を実施しビルドし直すだけでは、変更が反映されず問題が解決しません。
UnityプロジェクトのディレクトリにIL2CPPのキャッシュが残っているため、これを削除する必要があります。
キャッシュのディレクトリは以下の通りです。
(Unityプロジェクト)\Library\Il2cppBuildCache\WebGL
このWebGLディレクトリを削除し、再度ビルドし直します。
私の環境では、これで問題は一応解決しました。
おわりに
あくまで暫定対応策で、今後もっと良い方法が見つかるかもしれません。
iOSのSafari、なんて恐ろしい環境なんだ…😢
この記事が気に入ったらサポートをしてみませんか?