ips: 0 Unity的PlayerSettings的otherSettings或者Publish Settings里面的Enable Exceptions里面选择Full StackTrace ,可以在打出的包中的浏览器的webgl打印出错误调用栈,具体在哪个Setting取决于unity的版本 1 一般出现了错误 可以看看在浏览器里面传的变量和在编辑器里面的有什么不一样 如果有不一样 就可以试着将浏览器的变量放入到编辑器里面试试 2 有时一些错误比较可能是浏览器的缓存问题 适当清空缓存是可以的 3 有时一些错误在一个浏览器表达不明确 可以换个浏览器 比如谷歌和火狐切换 4 如果浏览器出现了很不明确的错误提示甚至导致崩溃,而且编辑器本身也有一些无关痛痒的错误,第一时间将这些无关痛痒的错误解决了。因为这些错误可能就是造成浏览器崩溃的错误。 5 开一些翻墙软件也可能造成和服务端的一些资源加载不过来 6 有些错误是在Unity WebGL 程序还没加载完成就出现的 自己清缓存加上服务器重启可能可以了 即使自己一直找不出哪里的错 7 有时打不了包可能是因为系统盘满了 8 在浏览器出报错的时候,有时会出现很长的报错信息,但是真正有用的部分可能不是那个很长的,可能是很长的前面或者后面出现的报错信息,所以看报错的时候全部认真看是很重要 的 9 如果有些bug确定处理好了 但是浏览器还是老样子,可以清一下浏览器缓存 10 不论手机端还是PC端,出了情况最好上谷歌或者火狐浏览器看看报错或者警告的情况,帮助很大。 11 WebGL如果出错了,比较好的找错误的方法是在PC端打出exe包看看报错。
错误: 1 RuntimeError: index out of bounds 这种错误出现,可能是在编辑器里面是 Object reference not set to an instance of an object 即访问某个空引用。
2 An error occurred running the Unity content on this page. See your browser JavaScript console for more info. The error was: SyntaxError: expected expression, got ‘PackageManager里面降XR的包移出或者升级到最新,参考网址
11 如果WebGL打包不了但是一直查找不到原因,尝试重启unity,如果还不行尝试重启电脑,我试过几次这样的,这可能是unity的bug
12 在谷歌浏览器报错 VM12 UnityLoader.js:4 GET http://192.168.1.39:8082/static/Build/CPWEBGL.json 404 (Not Found) 在火狐浏览器报错 SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON dataUnityLoader.js:4:9722 onload http://192.168.1.39:8082/static/Build/UnityLoader.js:4 情况是这样的, 所有前端引用的都是我同一个unity打包的webgl程序,在前端的用户部分能正常访问,前端的商家部分报错找不到这个,其实我和前端约定叫做CPWEBGL,我少放了B,导致商家部分找不到我的文件,但是前端的用户部分能正常访问我也不清楚前端做了什么骚操作,这次经历给的经验就是要注意打的webgl程序的名字
13 LinkError:“TellForEndGoToChatNow"import object field is not a Function”,WebGL里面这个出错是因为在unity的自定义前端交互函数文件Mktail.jslib里面定义了这个方法如红框但是这个方法里面的绿框框住的某个前端方法没有定义,虽然说函数只是在C#里面定义了这个外部引用函数,一直没到调用时机,但是mktail.jslib里面的方法估计在程序加载时候才进行错误检查,发现前端的GotoCustomChat函数没有定义过,所以不认为TellForEndGoToChatNow是一个方法,所以进行的报错吧
public class HallProSurGoUI : MonoBehaviour
{
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern void TellForEndGoToWangPu();
[DllImport("__Internal")]
private static extern void TellForEndGoToChatNow(string sellerId);
#endif
14 missing function: canZhanGetWebGLUserId 这个报错出现的原因是在unity的自定义前端交互函数文件Mktail.jslib里面没有定义canZhanGetWebGLUserId 这个方法但是在c#文件里面引用到了这个方法
c#定义
[DllImport("__Internal")]
private static extern void canZhanGetWebGLUserId (string sellerId);
15 如果项目有在WebGL端运行的情况,通常会在Unity工程的Assets下的Plugins文件夹里面有自定义的jslib文件,这个文件里面每个定义的方法后面要有逗号分开,如果有没分开的,可能会导致webgl平台的unity程序生成失败
mergeInto(LibraryManager.library, {
//获取产品id
getProductIdStrFromJSCode: function(){
console.log("jslib getProductIdStrFromJSCode " + window.getModelIdFromJSCode());
var id = window.getModelIdFromJSCode();
var bufferSize = lengthBytesUTF8(id) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(id, buffer, bufferSize);
return buffer;
},
});
16 和上面的内容类似的,jslib文件里面写到代码要符合javascript即js语法的规则,js是脚本语言,和lua类似,定义方法参数的时候不能够定义类型,如果在WebGL打包失败的时候,报错指定到了jslib所在的内容,例如
Unexpected identifier,,SyntaxError: Unexpected identifier at Object.load (eval at globalEval
reprocessed source (you can run a js engine on this to get a clearer error message sometimes)
一般是里面的内容不符合js语法的规则,这时可以将jslib里面的代码复制,放到网页上的某个js脚本语法检查网页
17 Access to XMLHttpRequest at ‘’ from origin ‘https://seller.pre.mktail.cn’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 这个问题出现的原因是浏览器的同源策略问题,浏览器的同源策略会屏蔽掉一些非同源网站的请求,所以U3D发出的网络请求会被浏览器给阻隔掉 解决前端跨域:has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header…
18 在unity工程的 .jslib文件中,某个函数如果传字符串到外面,会像下图中的红框内部这样定义,这里说明一下,字符串参数为啥要用Pointer_stringfy处理,其实在c#传字符串给js的过程中,jslib里面的 js接收到的是字符串在内存中的地址,既然是地址的话,转换成字符串就需要Pointer_stringfy再处理一下,这样传到外面的才是真的字符串
19 关于unity程序结束的方法,目前unity在WebGL上面还不是很成熟,感觉还是有点bug,其中有个比较严重的就,程序在结束之后内存没有清除,这个bug unity官方在2018年中的时候在论坛 Unload Unity gameInstance and release heap memory 上面也承认了,目前的2019年中记录的解决方案参考下面网址 完全释放Unity WebGL内存 它的做法是将unity程序嵌套在iframe里面 可行性不清楚,我同事试了说不行,但是在这之前找过很多方法了,都是不行的,这里记录一下这种方法的存在。
20 WebGL打包报错 Unknown format, not a static library! 我这里是 stdout: stderr:ERROR:root:D:\UnityProjects\Company\Assets\Company\ExhibitionHall\Origin\AVProVideo\Plugins\iOS\libAVProVideoiOS.a: Unknown format, not a static library! 原因是引用了AVPro这个插件,但是里面的ios第三方库libAVProVideoiOS.a设置成了AnyPlatform,导致WebGL打包的时候需要考虑这个库 ,但是识别不了,将识别平台改成ios即可
21 对于在jslib里面要获得前端函数的stiring类型的返回值,获得了之后需要有下面四行代码:
var bufferSize = lengthBytesUTF8(id) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(id, buffer, bufferSize);
return buffer;
c#才能接收到字符串
mergeInto(LibraryManager.library, {
//获取产品id
getProductIdStrFromJSCode: function(){
console.log("jslib getProductIdStrFromJSCode " + window.getModelIdFromJSCode());
var id = window.getModelIdFromJSCode();
var bufferSize = lengthBytesUTF8(id) + 1;
var buffer = _malloc(bufferSize);
stringToUTF8(id, buffer, bufferSize);
return buffer;
},
});
22 在WebGL端报错 Scene ‘DesiginSpace’ couldn’t be loaded because it has not been added to the build settings or the asset bundle has not been loaded. To add a scene to the build settings use the menu File->Build Settings , 其实我在buildsettings里面是添加了DesiginSpace这个场景的,后来我几次将这个场景的位置调上或者调下都没效,发现场景名和存储场景路径中的某个文件夹名字一样, 就试着将场景名字改了一下,后面加个Scene,然后就可以了,估计是unity的bug。
StackOverflow也有人遇到了这样的错 How Do I Load A Assets Bundle 他的解决办法是重新将场景从build settings里面移出然后再添加进去 这个bug算是unity的bug了,我在关于unity的bug中也记录过 Unity 引擎报错集锦 因为在webgl出来的,其他人可能在webgl也会遇到,所以这里也说一下
23 unity的一些静态放置的UI在浏览器可能出现异常情况,对于这种问题需要在运行的时候将这种出现异常情况的UI用代码的方式进行设置。
24 missing function: _ZNSt2___212basic_stringIcNS_11char_traitsTcEENS_9allocatorIcEEE6__initEPKcj这个报错的出现的原因一般是某个第三方库缺少引用或者是双重引用,我这边的情况是我使用了TriLib插件后,导出没问题,但是导出的包运行的时候报这个错误,因为我使用的Trilib插件是阉割版的,它的WebGL的分支不存在,导致在WebGL的时候出现了这个错误。出现这种错误看不见他具体报错内容而是一堆乱码的时候,要想想最近做了什么,最后一个可行的分支版本与出错版本的最显著区别是什么地方,我这次的错误靠的是这个方法猜出来的。
下图的左边是正常版本的,右边是阉割版本的,可以看出严格版本里面没有WebGL这个分支
25这次遇到的还是关于Trilib插件的问题,在使用trilib1.8.7,并且在导出WebGL包的时候报错 unity版本是2019.3.1f1 Linking globals named ‘gzgetc’: symbol multiply defined!ERROR:root:Failed to run llvm optimizations: 参考链接: Unity 2019.1 TriLib WebGL build failed 链接的陈述大概是 插件里面的库文件对gzgetc的定义和unity的打包的库文件对gzgetc的定义重复了 如图所示 我没有按照链接里面的做,将trilib版本从1.8.7升级到了1.9.0,它里面的内容也变了
这次打包的时候就不报错了
26 Failed running “E:/AllUnity/2019.3.1f1/Editor/Data/PlaybackEngines/WebGLSupport\BuildTools\Emscripten_Win\python\2.7.5.3_64bit\python.exe” -E “E:/AllUnity/2019.3.1f1/Editor/Data/PlaybackEngines/WebGLSupport\BuildTools\Emscripten\emcc” @“D:\UnityProjects\Company\Assets…\Temp\emcc_arguments.resp”
stdout: stderr⚠️ unresolved symbol: FullScrnForEndClickERROR:root:‘E:/AllUnity/2019.3.1f1/Editor/Data/PlaybackEngines/WebGLSupport\BuildTools\Emscripten_FastComp_Win\binaryen\bin\asm2wasm D:\UnityProjects\Company\Temp\StagingArea\Data\linkresult_wasm\build.temp.asm.js --total-memory=33554432 --trap-mode=clamp -O3 --mem-init=D:\UnityProjects\Company\Temp\StagingArea\Data\linkresult_wasm\build.js.mem --mem-base=1024 --wasm-only --symbolmap=D:\UnityProjects\Company\Temp\StagingArea\Data\linkresult_wasm\build.js.symbols -o D:\UnityProjects\Company\Temp\StagingArea\Data\linkresult_wasm\build.wasm’ failed UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) 这个报错是在打包时候报的错,仔细看内容,在里面有段话 stderr⚠️ unresolved symbol: FullScrnForEndClick 这个是关键的, 在我的工程里面,这个报错的原因是在jslib文件里面没有定义 FullScrnForEndClick 这个方法,但是在c#文件里面有引用到
#if UNITY_WEBGL
[DllImport("__Internal")]
private static extern void ForEndFullScrn();
[DllImport("__Internal")]
private static extern void FullScrnForEndClick();
#endif
所以把引用的去掉就可以了 ,或者在jslib里面定义这个方法
27 unity打包的时候如果设置了broti或者gzip这种压缩方式,则打包出来的程序放到服务器的时候,服务器需要设置相对应的解压方式,否则运行的时候会报错,ReferenceError:Cant find variable: UnityFramework
28
Failed to load resource: net::ERR_HTTP2_PROTOCOL_ERROR
听说是http2的关系。淘宝客服说可以关闭掉
29
会出现加载很久的情况,给出的提示是:
You can reduce startup time if you configure your web server to add “Content-Encoding: gzip” response header when serving “Build/WebAR-WebGLTest.wasm.unityweb” file.
30
The AudioContext was not allowed to start. It must be resumed (or created) after a user gesture on the page.
带有音频的视频或者其他元素,在WebGL的移动端或者PC端都需要用户输入响应。PC端是通过鼠标点击,移动端是通过手指触控做到用户输入响应。
31
Exception:
C:\Program Files\Unity\Hub\Editor\2019.4.36f1c1\Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe
did not run properly!
环境变量或者硬盘命名或者我的文档或者打包路径中有中文名称。
32 一些粒子系统在WebGL下的表现可能不尽如人意,这是Unity对WebGL的兼容测试较少的原因。在更改参数测试了几次都没有效果的情况下,最好是用其他方法代替粒子系统,参考网址 Unity particles not showing on WebGL
RangeError:Maximum call stack size exceeded. null function or function signature mismatch
我在服务器疯狂从回收站还原删除 再删除再还原 在谷歌浏览器就出现这些报错。 重启阿里云服务器不行 清楚手机浏览器缓存就可以了。但是微信浏览器不能清楚缓存,因为找不到这个选项按钮入口。
-
exception thrown: RuntimeError: unreachable,RuntimeError: unreachable
这其实对应了开发中最最常见的报错NullReference。所以某个地方出现了这个报错之后,最好还是到程序中根据对应的流程去复现这个报错。
TypeError: Failed to fetchat instantiateAsync (blob:https://www.wenginning.love/e2d10002-ac06-49e3-912d-5blf12alcb4d:3:18419)
at createWasm (blob:https://www.wenginning.love/e2d10002-ac06-49e3-912d-5blf12alcb4d:3:19029)
at Array.unityFramework (blob:https://www.wenginning.love/e2d10002ac06-49e3-912d-5blf12alcb4d:3:304158at https://www.wenqinning.love/WebAR/Build/4.8.10.24.loader.js:l:6595
我的出现原因是WebGl程序在加载过程中出现了wifi断开导致的。是wifi自己断开的原因。
- 谷歌浏览器报错
Get https://www.wenqinning.love/WebAR/Build/4.19.13.56.data 404 (Not Found)
这是放在服务器程序丢失了或者找不到造成的。
KeyNotFoundException: The given key"开始页船3 was not present in the dictionary.
在浏览器里面清除缓存即可。
Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output:
Traceback (most recent call last):
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emcc2.py", line 3571, in
sys.exit(main(sys.argv))
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emcc2.py", line 3564, in main
ret = run(args)
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emcc2.py", line 1082, in run
phase_post_link(options, wasm_target, wasm_target, target)
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\contextlib.py", line 74, in inner
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emcc2.py", line 2400, in phase_post_link
phase_emscript(options, in_wasm, wasm_target, memfile)
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\contextlib.py", line 74, in inner
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emcc2.py", line 2428, in phase_emscript
emscripten.run(in_wasm, wasm_target, final_js, memfile)
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten.py", line 830, in run
emscript(in_wasm, out_wasm, outfile_js, memfile, shared.DEBUG)
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten.py", line 308, in emscript
glue, forwarded_data = compile_settings()
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\emscripten.py", line 178, in compile_settings
cwd=path_from_root('src'), env=env)
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\tools\shared.py", line 216, in run_js_tool
return check_call(command, *args, **kw).stdout
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\tools\shared.py", line 202, in check_call
return run_process(cmd, *args, **kw)
File "C:\Program Files\Unity\Hub\Editor\2021.3.8f1c1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\tools\shared.py", line 97, in run_process
ret = subprocess.run(cmd, check=check, input=input, *args, **kw)
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\subprocess.py", line 474, in run
File "D:\obj\windows-release\37amd64_Release\msi_python\zip_amd64\subprocess.py", line 926, in communicate
UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 393654: illegal multibyte sequence
UnityEngine.GUIUtility:ProcessEvent (int,intptr,bool&)
在打包的时候,jslib里面不能够有中文。注释也是不行的。否则就会报这个错。
-
WebGL打包的时候只有
这是因为index.html与实际加载的文件名字不一样。
在打包的时候文件夹名字与index里面的一致即可。
-
404 Not Found
这类似于服务器加载程序的时候找不到要加载的js文件。
Failed to load resource: the server responded with a status of 404 (Not Found)
然后是加载完成后报的这个错。
mp_test.loader.js:1 Uncaught (in promise) RangeError: Offset is outside the bounds of the DataView at DataView.getUint32 ()
- 这种报错出现的原因是Unity中index.html的修改没有完成导致的,路径修改不对
GET https://hssczl.gd-txhn.com/WebGLPackages/5.10.17.29/temp_test/Build/temp_test.loader.js net::ERR_ABORTED 404 (Not Found)
需要修改成
即把路径改成到Build之前的每个//之间的都用…代替。