对ab进行加密,防止资源被轻易盗取;网上有很多种加密,实在太废力了;以下加密只能防小白使用工具盗取;废话不多说
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);//打包
public static AssetBundle LoadFromFile(string path, uint crc, ulong offset);//load资源
public static AssetBundleCreateRequest LoadFromFileAsync(string path, uint crc, ulong offset);//async load资源
- 1现象:对打包出来的ab包,使用工具AssetStudio能很简单的被解导出来,这是我们不想见到
- 2原理:对BuildPipeline.BuildAssetBundles(…)生成文件之后
-
- 加密:对文件对写入一些空字符,达到offset偏移咯
-
- 解密:使用AssetBundle.LoadFromFile()有offset方法进行load出来:偏移多少就offset多少
以下是我工程的代码,原理已贴出,若老司机可以忽略以下
if (GUILayout.Button("生成AB包", GUILayout.Height(40)))生成文件
{
//.....略
//想过用byte还原回去,能还原;但还原之后,若不删除原ab包 unity生成会闪退 建议生成AB时删除原目录或手动解压压缩回去(原先未加密前先压缩一下)
//全体重新打ab包造成时间长一点
var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/" + this.platformType.ToString() + "/StreamingAssets";
if (Directory.Exists(filepath))
Directory.Delete(filepath, true);
BuildPipeline.BuildAssetBundles(fold, buildAssetBundleOptions, buildTarget);
}
//生成文件之后,加密
if (GUILayout.Button("给AssetBundle加密(别重复点击)", GUILayout.Height(40)))
{
var filepath = Application.dataPath.Replace("Unity/Assets", "") + "Release/Android/StreamingAssets";
var files = Directory.GetFiles(filepath, "*.*");
for (int i = 0; i < files.Length; i++)
{
if (files[i].Contains("StreamingAssets.manifest") || files[i].Contains("Version.txt"))
{
}
else
{
byte[] oldData = File.ReadAllBytes(files[i]);
int newOldLen = 128 + oldData.Length;//定死了,128个空byte
var newData = new byte[newOldLen];
for (int tb = 0; tb < oldData.Length; tb++)
{
newData[128 + tb] = oldData[tb];
}
FileStream fs = File.OpenWrite(files[i]);//打开写入进去
fs.Write(newData, 0, newOldLen);
fs.Close();
}
}
}
//解密加载
//找到自己loadFormFileAsync(path)
if (Define.IsAsync && Define.IsILRuntime)//异步
{
this.request = AssetBundle.LoadFromFileAsync(path, 0, 128);//定死的,128字节
}
else
{
this.request = AssetBundle.LoadFromFileAsync(path);
}
if (Define.IsAsync && Define.IsILRuntime)//同步
{
assetBundle = AssetBundle.LoadFromFile(p, 0, 128);
}
else
{
assetBundle = AssetBundle.LoadFromFile(p);
}