比如要打包一个图片,选择这个图片,在Inspector视图的最下面AssetBundle 后选择New 输入一个名字,
编辑一个脚本放到Editor文件夹中
using System.IO;
using UnityEditor;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
BuildPipeline.SetAssetBundleEncryptKey("0123456789abcdef");//16个加密字符
string assetBundleDirectory = UnityEngine.Application.streamingAssetsPath;
if (!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.ChunkBasedCompression|
BuildAssetBundleOptions.EnableProtection,
BuildTarget.StandaloneWindows);
}
}
然后在Assets栏下点Build AssetBundles 按钮就会将图片打包到StreamingAssets文件夹下
使用方法:
//加载资源
UnityEngine.AssetBundle.SetAssetBundleDecryptKey("0123456789abcdef");//16个字符
var myLoadedAssetBundle
= AssetBundle.LoadFromFile(System.IO.Path.Combine(Application.streamingAssetsPath, "ab"));
if (myLoadedAssetBundle == null)
{
Debug.Log("Failed to load AssetBundle!");
return;
}
var jpg = myLoadedAssetBundle.LoadAsset<Texture>("abc");
this.GetComponent<RawImage>().texture = jpg;
常用的三种压缩方式及区别:
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);
另外一种简单的加密方式:
使用offest加密
原理就是对AssetBundle的二进制文件添加一些字符,来达到加密的目的
public static void ABOffsetEncryption(string fileFile)
{
byte[] oldData = File.ReadAllBytes(fileFile);
int newOldLen = 8 + oldData.Length;//这个空字节数可以自己指定,示例指定8个字节
var newData = new byte[newOldLen];
for (int tb = 0; tb < oldData.Length; tb++)
{
newData[8+ tb] = oldData[tb];
}
FileSt
ream fs = File.OpenWrite(fileFile);//打开写入进去
fs.Write(newData, 0, newOldLen);
fs.Close();
}
解密:unity官方提供的AB包加载API,有提供根据Offset进行加载AB
AssetBundle abBundle = AssetBundle.LoadFromFile(assetBundleMapPath,0,8);