[Unity/WebGL]Chrome(Android)でカメラの許可等のポップアップ出現後、操作不可

※Unity 2021.3.11f1で修正されたかも

WebGL: Fixed a bug where losing focus on the player would cause buttons to become stuck. (UUM-3230)

https://unity3d.com/jp/unity/whats-new/2021.3.11
上記の通り修正された可能性があるので、この対応はアップデートにより不要になる可能性があります。

概要

現象としてはカメラの要求等を行ったときのプロンプトでUnityの画面じゃないところにフォーカスを当てたとき、元の画面をタップしても反応しなくなってしまう。
  • WEBGLJsプロンプトの後にゲームにフォーカスを戻す方法。(モバイルクロームは、ゲームキャンバスの外側のURLまたは画面の白い部分に触れるまでタッチ入力を壊すようです)
    • https://www.reddit.com/r/Unity3D/comments/oi5x8m/webgl_how_to_give_the_focus_back_to_the_game/
  • 質問Chromeブラウザのポップアップにより、webglアプリがフォーカスを失い、元に戻すことができなくなります
    • https://forum.unity.com/threads/chrome-browser-popups-causes-webgl-app-to-lose-focus-and-cant-be-regained.1223469/
現象としてはUnityやRedditのフォーラムでも報告されている。起こっている事としては、「Unityのゲームから消失したフォーカスが元のUnity画面に復帰するには、画面をタップするだけでは戻らない」という事らしい。

タイトルのSceneでApplication.runInBackgroundをtrueにする

上記記事に記載があった内容。
公式マニュアルによると「キャンバスやブラウザーウィンドウがフォーカスを失っても、コンテンツは引き続き実行されます。」とのことで、一度これを試してみる。
※Chromeのインスペクタでリモートでwindow.alert(1)を投げてテスト

単純にApplication.runInBackground = trueだけだと予期した通りにならず、操作不能に陥る。
using UnityEngine.EventSystems;

namespace xxx.Scripts.Utils.Misc
{
    public class XxxEventSystem : EventSystem
    {
        protected override void OnApplicationFocus(bool hasFocus)
        {
#if !(UNITY_WEBGL && !UNITY_EDITOR)
            base.OnApplicationFocus(hasFocus);
#endif
        }
    }
}
WebGL版のみEventSystemのOnApplicationFocusで「何もしない」スクリプトを作ってみると、アラートを出した後にアプリケーションがフォーカスを失うことが無くなった。

※2021.3.6f1で確認しているけど結構深刻なバグなので、モバイルサポートを本格化する2022のLTSリリースでは治ってる気がするのでコードが腐らないように注意すること