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側で対応出来る暫定対応策が見つかった

といった状況です。
エラーが発生すると以下の様な表示になります。

iOS15.4のSafariでUnity WebGLを動かしてエラーが発生した画面

対策手順

私が実施した手順は以下の通りです。
環境: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、なんて恐ろしい環境なんだ…😢


この記事が気に入ったらサポートをしてみませんか?