RhinoFreak 发表于 2022-4-9 13:25

Unity AssetBundle 的使用

比如要打包一个图片,选择这个图片,在Inspector视图的最下面AssetBundle 后选择New 输入一个名字,
编辑一个脚本放到Editor文件夹中
using System.IO;using UnityEditor;public class CreateAssetBundles{        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;for (int tb = 0; tb < oldData.Length; tb++){newData = oldData;}FileStream fs = File.OpenWrite(fileFile);//打开写入进去fs.Write(newData, 0, newOldLen);fs.Close();}
解密:unity官方提供的AB包加载API,有提供根据Offset进行加载AB
AssetBundle abBundle = AssetBundle.LoadFromFile(assetBundleMapPath,0,8);
页: [1]
查看完整版本: Unity AssetBundle 的使用