“ 记录一下,超刺激的,unity项目版本降级操作。不知道谁开发的项目,2020年敢选2020版本的unity,虽然是正式版吧,但是网友们从来都是今年用去年版本,去年用前年版本。坑的很。”
事情的起因是这样子的,我们有个CDI的项目,主要是想要做一个楼内导航的WebGL虚拟化项目。进行路标模拟的评估什么的。然而不知道谁用的最新版本的正式版unity实现的整个项目。
我们当时的项目版本是这样的:
准确的说上次的那个版本是2020.1.01.f1,我看了看是正式版也就没管什么,毕竟我上次学习和使用unity是大概13年的时候哈哈哈。
然后问题来了,unity的这个版本只能打包dev包,打不了生产包,😳。我觉得他们一定是在演我哈哈哈,然后我们线上就先一直用的development包。线上的版本,build的文件夹下是这样子的:
然后尴尬的问题来了,我们上次用2020版本的unity打的生产包是这样子的:
我们发现其实从加载方式上来看,index.html加载unity instance的方式其实是一样的,这个示例代码只是相当于更新了需要加载的文件的名字。我们猜测是因为unity自己的loader.js其实自己做过处理,production的包比development的包只是多了一个tar压缩,别的也没什么区别。但是问题在于就是不能用。。。
同样是扔给nginx代理开起来,development的包能用,production不行。console会抛出错误:
“Uncaught ReferenceError: unityFramework is not defined at HTMLScriptElement.script.onload (WebGL)”
大概看了下网友们的评测[1],就是因为做了压缩所以出现了错误。有人说再nginx改一下配置就行。
然而我试了下不行,后面估计是版本的问题就没管,一直在拿着develop的包用。结果今天安装了2020.1.0f1c1之后就没事了。估计是不是用的unity hub安装的,我以前是独立的unity然后绑定到unity hub上的,又或是更新了。目前打出来的生产包没什么问题,照常使用。
事实证明,目前我用的这个版本的2020是可以的,只不过需要更新下nginx的配置。因为浏览器没有将gzip的包识别为正确的格式,比如*.js.gz没有在response里面识别为 application/javascript,所以会出现这些的问题。
第二个坑的点是,我降级导入项目,各种坑各种错。然后发现了一个非常机智的做法[2]:
总结下来就是先将高版本的项目导出成*.unitypackage,然后reimport到新的,低版本的asset里面去就行。
然后我又发现了一个坑,就是我导入的项目,为什么死活拿不到WebGLInput的这个包呢。我明明已经安装了webgl的module。
查了很多资料,有的说需要在c# assemble里面重新添加一下reference。我发现其实UnityEngine的这个包其实是在的,就是对应的一些别的包不在。后来发现其实因为我没有再build setting里面设置对应的打包platform。
默认的平台是这样的,如果我们只是新建一个3D的项目,默认打包平台是这样:
然后点到对应的WebGL的tab下,然后点击switch platform:
漫长的加载之后,如果unity的logo变成这个样子,就对了:
这个时候我们发现以前标红线的WebGLInput就对了,并且我们肯也可以在assemble里面看见这些内容:
如果我们能看到UnityEngine.WebGLModule这个引用,就证明已经存在了编译成功的可能。
当然为了在打包多种平台代码的时候,去掉讨厌的红线,因为红线会导致编译错误,然后挂载的脚本就不能继续挂载到对应的player上了。所以我们还有一种骚操作,就是利用#def语句来进行动态的加载和编译,目前最后的代码是这样的:
public static void _enableInteraction(bool enable) {#if !UNITY_EDITOR && UNITY_WEBGL // WebGLInput 在刚刚进入场景时是否拦截 UnityEngine.WebGLInput.captureAllKeyboardInput = enable;#endif }
如果判断的当前的编译环境就是UNITY_EDITOR的时候,这行就不会编译,我用的外置visualstudio2019也是对应的UNITY_EDITOR的环境。如果打包模式是UNITY_WEBGL,那么代码也会加载。否则就不会加载,也就不会有编译错误,爽
!
还有一点要注意的是,降级之后,我之前烘焙好的navigation mesh全都需要重新烘焙一下,要不然又会出现识别错误,我猜测如果对应的烘焙了lighting,对应的光照图是不是也要重新bake一遍才行哈哈哈。
然后最悲催的事情,是我发现2020打包出来的production包和2019打包出来的production包不一样。。尴尬的一笔哈哈哈。
这个故事告诉我们什么呢,还是用LTS的稳定版吧,别用最新版哈哈哈哈。
结尾引用:
“[1] 【Bug】 Uncaught ReferenceError: unityFramework is not defined at HTMLScriptElement.script.onload (WebGL)
{ https://forum.unity.com/threads/uncaught-referenceerror-unityframework-is-not-defined-at-htmlscriptelement-script-onload-webgl.803967/ }
[2] Downgrading your Project’s Unity Version { https://courses.cs.washington.edu/courses/cse490j/19wi/tutorials/project_version_tutorial.pdf }
”无需摇摆不定
快来点在看吧