解決したい事
エラーを正してWebGLが起動するようにしたい。
発生している問題
Unityバージョンを
更新前:2019.4.13f1
更新後:2021.3.5f1
に更新した後、WebGL形式でビルドし、chromeで起動したところ、以下のようなエラーにより起動できなくなりました。
(ビルド自体はエラーなく完了します、ブラウザ起動時にブラウザ側でエラーが発生して読み込みが完了しません)
exception thrown: ReferenceError: unityInstance is not defined,ReferenceError: unityInstance is not defined at _StringReturnValueFunction
Uncaught (in promise) ReferenceError: unityInstance is not defined at _StringReturnValueFunction
warning: 2 FS.syncfs operations in flight at once, probably just doing extra work
原因のスクリプトを排除してビルドしたところ問題なく起動できたため、このスクリプト(正確にはjslib内の記述)が原因だと思います。
エラー原因と思われるスクリプトはC#スクリプトからjslibスクリプトを呼び出し、OSの種類を読み取ってC#スクリプトに返す仕組みとなっています。
cs
using UnityEngine; using System.Runtime.InteropServices; public class ReadJS : MonoBehaviour { public GameObject[] PCMode_OnlyObjects; public GameObject[] MobileMode_OnlyObjects; [SerializeField] private bool isDebugDeviceChecke = false; public enum deviceMode { PC, Mobile, Else, } public static deviceMode DeviceMode; [DllImport("__Internal")] private static extern void StringReturnValueFunction(); void Awake() { #if UNITY_EDITOR || UNITY_STANDALONE SetPC(); #endif #if UNITY_WEBGL && !UNITY_EDITOR StringReturnValueFunction(); #endif } void MobileModeActive() { foreach(var ob in PCMode_OnlyObjects) { if(ob != null) { ob.SetActive(false); } } foreach(var ob in MobileMode_OnlyObjects) { if(ob != null) { ob.SetActive(true); } } } void PCModeActive() { foreach(var ob in PCMode_OnlyObjects) { if(ob != null) { ob.SetActive(true); } } foreach(var ob in MobileMode_OnlyObjects) { if(ob != null) { ob.SetActive(false); } } } public void ChangeController() { if(DeviceMode == deviceMode.PC) { DeviceMode = deviceMode.Mobile; SetMobile(); } else if(DeviceMode == deviceMode.Mobile) { DeviceMode = deviceMode.PC; SetPC(); } } void SetPC()//CheckOS.jslib側で呼び出す { if(isDebugDeviceChecke) Debug.Log("This Devis is PC."); DeviceMode = deviceMode.PC; if(MobileMode_OnlyObjects != null) PCModeActive(); } void SetMobile()//CheckOS.jslib側で呼び出す { if(isDebugDeviceChecke) Debug.Log("This Devis is Mobile."); DeviceMode = deviceMode.Mobile; if(MobileMode_OnlyObjects != null) MobileModeActive(); } }
js
mergeInto(LibraryManager.library, { StringReturnValueFunction: function () { var returnStr = window.navigator.userAgent.toLowerCase(); if(String(returnStr).indexOf("windows") != -1 || String(returnStr).indexOf("windows") != -1 ) { unityInstance.SendMessage('DeviceManager', 'SetPC'); }else { unityInstance.SendMessage('DeviceManager', 'SetMobile'); } }, });
試したこと
エラーに関して調べたところ、1つ目のエラーはこちらの記事に倣って、Player Settings -> Publish Settings -> Decompression Fallbackにチェックを入れました。
2つ目のエラーは1つ目のエラーが発生することで表示される内容だと思います。
3つ目のエラーに関しては調べたところ、ファイルダイアログシステムを使うと出るという記事を散見しましたが、
自分の方では使用していませんが、OSを読み取りに行かせている部分か、unityInstanceの書き方がバージョンアップによって出力形式が変更されたことで問題となっているのかなぁと思っています。
参考記事
よろしくお願いします。
まだ回答がついていません
会員登録して回答してみよう