因为心情差和没什么好写的好久没上来了。
最近因为项目需求要研究assetbundle资源加密,要加密自然就要解密了,踩了不少坑,而且自己查问题的时候也发现没有文章详细的讲一下解密要注意的地方,只是简单的列了下代码,可能是之前的版本不需要注意太多东西就能顺利解密吧?毕竟LZ4格式是5.3以后才有的,所以总结记录一下,希望能帮到有需要的人。
主要的坑是解压时机,assetbundle格式,请求assetbundle的方式
#什么时候开始解压的
这涉及到Failed to decompress data for the Assetbundle这个问题
原文在这
https://caihua.tech/2017/03/05/关于AssetBundle解压的讨论结果/
#assetbundle压缩格式
assetbundle的默认压缩格式是LZMA,这个格式会在www请求的时候就解压,因为加密过的ab,所以根本解压不了,会弹这个错误Failed to decompress data for the Assetbundle。而我当前项目就是LZMA,这个坑了我好久都没反应过来,直到看到
自己加密的bundle要选LZ4格式,这个格式不会在请求的时候就解压,让你能够拿到你加密时的数据再进行操作。
WWW www = new WWW(fullPath);//WWW.LoadFromCacheOrDownload(fullPath, hash,0);
yield return www;
if (!string.IsNullOrEmpty(www.error))
{
res.ErrorText = www.error;
CLogger.LogError("Load resource [" + fullPath + "] failed,errorMsg=" + res.ErrorText);
}
else
{
byte[] data = MyDecription(www.bytes,res.ResPath);
UnityEngine.AssetBundle ab = UnityEngine.AssetBundle.LoadFromMemory(data);
res.SetAssetBundle(ab);
//AssetBundleCreateRequest req = UnityEngine.AssetBundle.LoadFromMemoryAsync(data);
//yield return req;
//res.SetAssetBundle(req.assetBundle);
}
#不能用unityWebRequest来请求数据
可以参考的是下面的链接的老哥,还有其他一些链接忘了
https://bitbucket.org/Unity-Technologies/assetbundlegraphtool/issues/1/error-while-downloading-asset-bundle
https://answers.unity.com/questions/1434541/asset-bundle-failed-to-decompress-data-unity-56-wi.html
一定要用new WWW的形式才行,用unityWebRequest或WWW.LoadFromCacheOrDownload都不行
以上就是要注意的地方,这个坑的地方没搞过一下是真的反应不过来,尤其是压缩格式和请求方式。
附上加密方法,不建议用,因为好慢,用你一开始查到的就好 那个快很多
//System.Random random = new System.Random(_pstr.GetHashCode());
//_data[i] ^= (byte)random.Next(256);
最后吐槽一下现在公司项目的代码问题,之前看一个触发trigger的功能,竟然辗转了六七个文件,途径10几个函数才调用到。我叼,大哥你没事吧 触发一个触发器要这么搞吗 这样应该是为了解耦吧 但解到了这种程度真的就好吗 追踪个代码追到想吐 本来很直接的逻辑写得转来转去 类似这样的写法看到还不少,难怪他们之前不建议去修改非自己模块的东西,这样写法别人容易改错也不奇怪了。一个人只顾自己的不去看别人的模块,修改别人的模块怎么会熟悉项目,怎么能成长得快。这群人真是思想出了问题 ,可能是因为公司还OK 大家都想着在养老吧 难受,僵硬