比如要打包一個圖片,選擇這個圖片,在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;
常用的三種壓縮方式及區(qū)別:
1.BuildAssetBundleOptions.None: 使用LZMA算法壓縮月而,壓縮的包更小,但是加載時間更長挖滤。使用之前需要整體解壓崩溪。一旦被解壓,這個包會使用LZ4算法重新壓縮斩松。使用資源的時候不需要整體解壓伶唯。在下載的時候可以使用LZMA算法,一旦它被下載了之后惧盹,它會使用LZ4算法保存到本地上乳幸。
2.BuildAssetBundleOptions.UncompressedAssetBundle: 不壓縮,包大钧椰,加載快反惕。
3.BuildAssetBundleOptions.ChunkBasedCompression: 使用LZ4算法壓縮,壓縮率沒有LZMA高演侯,但是我們可以加載指定資源而不需要解壓全部姿染。
使用LZ4算法壓縮,可以獲得可以跟不壓縮相媲美的加載速度秒际,而且比不壓縮文件要小悬赏。目前AB包加密需要LZ4壓縮格式,也就是上面提到的ChunkBasedCompression方式娄徊。
加密方法(官方有相應的加密文檔):
1.構(gòu)建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;//這個空字節(jié)數(shù)可以自己指定,示例指定8個字節(jié)
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兵多,有提供根據(jù)Offset進行加載AB
AssetBundle abBundle = AssetBundle.LoadFromFile(assetBundleMapPath,0,8);