(声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,推荐大家购买Unity正版源码)
1.问题描述
由于升级到了2019.3.0f6,一打开项目就会问是不是要升级V2, 说V1已经过时了,所以决定升级到V2。中间cacheserver的其他问题就不多说了,感觉有时候能用上cacheserver,有时候还得自己干活import,最终还是用上了。(使用下来看,目前还是很不稳定,建议大家再等等后面的版本)
但是中间出现了个问题,再进入项目后,报了类似这样的错误:
,有的会报下具体是哪个资源,有的只有这么一句话,大家也知道,这个Library里面的东西是中间产物的cache, 以往是全删除了再来一次,但是这次发现不行了。再进去看下具体的文件,大家就可以发现一个问题,
这个中间文件的字节是0. 最最麻烦的是,你找到了这个文件,但是你不能直接删除,
直接删除会导致你再次启动Unity的崩溃(因为unity内部有一些关联设置的,但是没判断好,直接gg),另外,你再reimport也是没有用的,0还是0,就是这么坚强。
2.问题研究
具体怎么产生的,大家可以看下RemoteAssetCache.cpp看下,比较怀疑是下载有问题,它是下载到Temp, 然后Move到LIbrary目录,然后加入到AddToArtifactDb,但也可能是自己Import过程中突然个屁了导致屁股没擦干净,源代码里面大家可以仔细看下,但是整个的流程还是比较复杂和长的。
3.问题解决
3.1 从根源上解决
这个可能要unity引擎源码和cacheserver都要一起修改下,加一些确认重传以及对0字节的一些错误处理等,这个后面慢慢研究下。
3.2 清理错误
这个是目前简单的解决方式,以保证项目正常启动和运行,不然一直报错,也还比较方便的。
解决方法其实很简单,就是找到为0的artifact里的文件,然后找到这个文件对应的资源asset,然后reimport,但是unity里面artifacts里看到的文件名,并不是直接的guid,这里需要个转换。所以我们主要的问题是怎么根据0字节的文件去找到他对应的
GUI.
大家可以看下ArtifactGarbageCollection.cpp文件
这个函数是unity启动项目的时候,去清理无用的artifact文件的,我们可以借用下。
后面的具体的path==是清理一些零星的错误用的,因为我本机扫出来可能没有,但是别人机器上有,所以简单加下,类似黑名单,这样,你就可以得到所有的有问题的GUID了,保存到一个文件。
主要是两步,删除为0的artifact文件,然后强制import一遍对应的Asset,运行完脚本,应该就可以修复了。有的可能完事后重新打开下unity。
(声明:本文章所有用到的图片和源码,只为了学习和研究用途,未经我同意,不得进行转载或者其他用途,推荐大家购买Unity正版源码)