新版本里针对AssetBundle格式简单并且容易破解的问题,推出了加密功能,目前加密需要AssetBundle为LZ4压缩格式,其它格式的加密后续推出。这里说一下常用的压缩方式及对应的压缩算法。
首先我们打包用的API:.BuildPipeline.BuildAssetBundles(BuildPath,BuildAssetBundleOptions, BuildTarget); 压缩方式在第二个参数进行设置,是一个枚举值
常用的三种压缩方式及区别:
1.BuildAssetBundleOptions.None: 使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4算法重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
2.BuildAssetBundleOptions.UncompressedAssetBundle: 不压缩,包大,加载快。
3.BuildAssetBundleOptions.ChunkBasedCompression: 使用LZ4算法压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不需要解压全部。
使用LZ4算法压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。目前AB包加密需要LZ4压缩格式,也就是上面提到的ChunkBasedCompression方式。
加密方法(官方有相应的加密文档):
1.构建AB包时,先指定本次build所使用的加密秘钥,密钥长度为16为字符(128bit):
BuildPipeline.SetAssetBundleEncryptKey("0123456789abcdef");
然后指定BuildAssetBundleOptions 包含:ChunkBasedCompression和EnableProtection:
BuildPipeline.BuildAssetBundles(assetbundleBuildPath, BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.EnableProtection, EditorUserBuildSettings.activeBuildTarget);
通过指定密钥为null来清除秘钥:BuildPipeline.SetAssetBundleEncryptKey(null);
2.加载AssetBundle时,先指定本次加载所使用的解密秘钥:AssetBundle.SetAssetBundleDecryptKey(rightUserKey);然后加载AssetBundle,常用的加载方式:
1).AssetBundle.LoadFromFile
2).AssetBundle.LoadFromMemory
3).WWW.LoadFromCacheOrDownload 不过现在新版本里www类已经过时。
4).UnityWebRequest
最后也是通过指定密钥为null来清除秘钥:BuildPipeline.SetAssetBundleEncryptKey(null);
欢迎关注公众号 “当代野生程序猿”。