歡迎加入Unity業內qq交流羣:956187480
qq掃描二維碼加羣
完整demo地址:https://download.csdn.net/download/qq_37310110/11559522
一.AssetBundle簡介
1.什麼是Assetbundle?
它是一個存在於硬盤上的文件。可以稱之爲壓縮包。這個壓縮包可以認爲是一個文件夾,裏面包含了多個文件。這些文件可以分爲兩類:serialized file 和 resource files(序列化文件和源文件)。serialized file:資源被打碎放在一個對象中,最後統一被寫進一個單獨的文件(只有一個);resource files:某些二進制資源(圖片、聲音)被單獨保存,方便快速加載
它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包裏面的內容,我們可以通過這個對象加載出來使用。
2.Assetbundle的作用?
AssetBundle是Unity引擎提供的一種資源打包方式,可以對除了C#腳本外的任何資源進行打包壓縮處理。
如果想在Unity平臺實現Lua熱更新,Assetbundle技術是無法跳過的知識點,在unity平臺我們進行熱更新下來的資源都是需要事先進行Assetbundle打包處理的。
二.AssetBundle打包流程
1.編輯器擴展編寫
打包過程需要在編輯器模式下進行,所以我們就需要擴展編輯器,也就是不用運行就能執行的邏輯
public class EditorMenu {
[MenuItem("Tool/BuildAssetbundle")]
static void BuildABs()
{
//打包後的資源存放路徑,這個路徑根據項目情況不定
string abDataPath = Application.streamingAssetsPath ;
if (!Directory.Exists(abDataPath)) Directory.CreateDirectory(abDataPath);
//BuildAssetBundle函數後的三個參數分別爲:存儲路徑;壓縮方式;資源目標平臺
var a = BuildPipeline.BuildAssetBundles(abDataPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
EditorUtility.ClearProgressBar();
Debug.Log("AssetBundle打包完畢");
}
}
注意:在我們打包的時候爲了方便後面的資源釋放更新我們要創建一個ab包的文件列表,這一步可以先忽略後面再處理。
因爲我們從服務器端下載所有AssetBundle文件的時候需要這些文件的web路徑,每個地址對應一個Assetbundle文件.我們不可能在代碼中寫幾十上百個文件的web地址,所以說在打包的時候我們就要生成目錄文件,後面不管是釋放資源還是下載更新資源都要通過這個目錄文件間接的獲取地址和更新信息的。
static void BuildABs(string path)
{
//打包後的資源存放路徑,這個路徑根據項目情況不定
if (!Directory.Exists(path)) Directory.CreateDirectory(path);
//BuildAssetBundle函數後的三個參數分別爲:存儲路徑;壓縮方式;資源目標平臺
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
EditorUtility.ClearProgressBar();
Debug.Log("AssetBundle打包完畢");
///----------------------創建文件列表-----------------------
string newFilePath = path + "/files.txt";
if (File.Exists(newFilePath)) File.Delete(newFilePath);
paths.Clear(); files.Clear();
Recursive(path);
FileStream fs = new FileStream(newFilePath, FileMode.CreateNew);
StreamWriter sw = new StreamWriter(fs);
for (int i = 0; i < files.Count; i++)
{
string file = files[i];
string ext = Path.GetExtension(file);
if (file.EndsWith(".meta") || file.Contains(".DS_Store")) continue;
string md5 = GameTool.Md5File(file);
string value = file.Replace(path, string.Empty);
sw.WriteLine(value + "|" + md5);
}
sw.Close(); fs.Close();
AssetDatabase.Refresh();
}
2.打包類型及打包平臺
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用之前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。在下載的時候可以使用LZMA算法,一旦它被下載了之後,它會使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。 注意使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小
BuildTarget
Unity具有跨平臺性,所以在打包的時候就要考慮到平臺差異。打包的時候就要選擇合適的平臺類型
3.AssetLables資源標籤
在Unity環境內除了腳本文件,選中任何文件在Inspector面板下都會出現一個AssetLables界面,我們通過這個給資源設置assetbunddle的文件名跟文件後綴。文件名就是打包ab包後的文件名是可以分目錄嵌套的,後綴的話常用的有unity3的,assetbundle,ab等自定義,也可以不設置後綴,在文件名後面加後綴也行。文件名跟後綴都是小寫。
AssetBundle分組策略總結:
a,把經常更新的資源放在一個單獨的包裏面,跟不經常更新的包分離
b,把需要同時加載的資源放在一個包裏面
c,可以把其他包共享的資源放在一個單獨的包裏面
d,把一些需要同時加載的小資源打包成一個包
e,如果對於一個同一個資源有兩個版本,可以考慮通過後綴來區分 v1 v2 v3
4.Manifest文件
打包結束後的資源包由兩部分構成,一個是AssetBundle文件,另一個是Manifest文件
.meta文件是unity內部自動生成的文件可以忽略,manifest文件是專門用於存儲打包後的AssetBundle文件的基本信息的。主要包含以下信息:
CRC校驗碼:類似於MD5,用於計算該資源的一個特殊信息標識
ClassTypes:當前資源關聯使用到了Unity中的哪些類,這些類是以編號索引的形式存在的,每一個編號對應一個類文件
三.依賴打包
1.同一資源被不同的包依賴
如果不考慮依賴直接打包的話,那些共用的材質帖圖就會被多次重複打包進去,包體就會變大。當遇到這種情況的時候建議把共用 的材質或者貼圖打成一個共用包,這樣再打包的時候這些共用包只會打一次,大大減小了包體的大小。
2.加載順序導致的資源丟失
如果a包所依賴的貼圖資源被打包在b資源裏。如果先加載a包,後加載b包,a包就會出現貼圖丟失的問題。遇到這個問題就要記住當包有依賴關係的時候,我們只能先加載被依賴的包,後加載主體包。
以上兩種情況這裏就不演示了,大家可以自己測一下。
完整demo地址:https://download.csdn.net/download/qq_37310110/11559522
歡迎hu加入Unity業內qq交流羣:956187480
qq掃描二維碼加羣