1、Hash
使用BuildPipeline.BuildAssetBundles(targetPath, Options, BuildTarget); 生成AssetBundle时,可以将Options参数添加BuildAssetBundleOptions.AppendHashToAssetBundleName选项,这样生成的Bundle名字都会带一个Hash。这样便于热更新,当资源内容改变而名字本身不会变化时,通过Hash值的差异就可以比较出是新资源还是旧资源了。但在实际操作中却遇到了资源有变化但生成的Hash码却未变的情况,后网上一查,才知Unity的Hash算法只是个伪hash算法,相当不靠谱。后来我们生成Bundle后又对Bundle的名字加了CRC校验码,确保资源变化后名字一定又变化。
2、CRC校验
通过BuildPipeline.GetCRCForAssetBundle(string targetPath,out uint crc)接口可以获取某个Bundle的CRC值。使用UnityWebRequestAssetBundle.GetAssetBundle(string uri,CahcedAssetBundle cachedAssetBundle,uint crc = 0u)下载Bundle时可以设置是否进行crc校验,crc默认为0,即不进行crc校验,非零则拿传入的值对下载下来的Bundle进行crc校验,校验不对则返回错误。
3、Caching
Caching类用来管理AssetBundles缓存,Unity可以创建多个缓存Cache。Caching.GetAllCachePaths(pathes)获取所有缓存路径。Caching.AddCache(string cachePath)可以添加新的Cache。Caching.currentCacheForWriting设置当前缓存路径。当设置了该属性时,使用UnityWebRequestAssetBundle下载的AssetBundle就会存储到这个缓存路径中。
每个Cache都有一个maximumAvailableStorageSpace属性,即当前缓存最大可用存储空间,该值默认为4G,expirationDelay属性即最大缓存时间,默认为150days。我们可以使用Application.persistentDataPath作为缓存路径存储热更新的资源,这样资源就不会过期清除了。
网友评论