Unity5 AssetBundle的一些整理(一)
最近整理一些AssetBundle的知識,包括AB的打包(差異包),讀取等。是一個比較大的功能點,在這記錄一下,以免後面自己也亂了。要是有什麼錯誤的地方歡迎各位看客指出。第一篇的話就說說AB最基礎的實現。
首先當然是什麼是AssetBundle,網上有很多的詳細介紹,我個人的理解就是,AssetBundle指把Asset資源例如,Texture圖片,Prefab預設,Animation動畫這些打包成一個個的Bundle。然後在程式碼中就可以根據路徑獲取到這些Bundle,解析出裡面的Asset用於使用。
程式碼中讀取工程中的資源,還有一種方法是Resources.Load()讀取Asset/Resources資料夾下面的資源。或者是Editor環境下的UnityEditor.AssetDatabase.LoadAssetAtPath()。至於為什麼要這麼麻煩的將資源打包成AB檔案再去動態讀取,最主要的目的就是為了可以熱更新資源。
舉個例子:當你的遊戲上線了,有一天你覺得你的登入介面的按鈕不好看,想替換下登入介面的樣式。這時你可能需要在自己的專案工程中替換好樣式然後出一個新的apk或app包,然後去走包體更新的流程。這樣明顯十分的麻煩,想想蘋果爸爸的稽核流程就望而卻步。AB就可以解決上面的這個問題,首先在遊戲上線前,先將你的登入介面打包成LoginAB資源,然後使用程式碼讀取這個AB資源裡面的UI顯示在介面上。當你需要更新介面的時候,你只要把修改後的介面打成一個新的LoginAB,放到你的伺服器上,遊戲啟動的時候在伺服器下載新的LoginAB放入手機的可讀取目錄中(例如IOS的Documents下),當要顯示登入介面的時候,先判斷手機的可讀取目錄中是否有新的LoginAB,有的話則讀取該AB,不然讀取包體內原本的LoginAB。這樣進入遊戲你的登入介面就是最新的介面了(當然啟動遊戲下載伺服器上的AB和讀取下載下來的AB這塊的邏輯需要預先寫好哈)。
大致瞭解了AB的作用後,那麼接下來要做的就是如何用程式碼實現上面的這些功能,資源的打包,讀取,下載,熱更新等等。
下面列一些需要的知識點:
(1)unity5.0之後所有的資源都多了一個新的屬性AssetBundle,裡面可以填寫assetBundleName和assetBundleVariant。如下圖所示:
assetBundleName:當你給一個Asset新增assetBundleName時,即等於告訴unity這些資源是需要打包成AB的。AB的名稱就是你這裡設定的名稱,多個不同的Asset新增同一個name的的話,這些Asset會被打進同一個AB中。需要注意的是name中字母需要全部使用小寫,檔名字尾可以自定義。並且可以使用'/'符號來進行分層。例如A.prefab的assetBundleName為b/c/a.ab,那麼打出來的AB則會在指定父目錄即StreamingAssets的b資料夾裡的c資料夾下,名為a.ab。
assetBundleVariant:資源標籤(本文中暫時沒用到),在打包時,會作為字尾新增在assetbundleName之後,通常用作LOD。一個資源只可以設定兩個標籤。例如有兩套貼圖資源,一套高清,一套普通,然後給他們設定同樣的assetBundleName為MyAsset,高清資源的assetBundleVariant 設定為LD,普通資源設定為SD,那麼就可以根據不同裝置通過選擇載入MyAsset.LD或MyAsset.SD來切換資源庫,這樣依賴MyAsset的Prefab就可以動態切換版本了。注意,兩套資源集的asset必須完全一一對應,對於unity來說LD和SD是同一個bundld,同一時刻只能載入其中一個。
對應的結構體:
namespace UnityEditor {
//
// 摘要:
// AssetBundle building map entry.
public struct AssetBundleBuild {
//
// 摘要:
// AssetBundle name.
public string assetBundleName;
//
// 摘要:
// AssetBundle variant.
public string assetBundleVariant;
//
// 摘要:
// Asset names which belong to the given AssetBundle.
public string[] assetNames;
//
// 摘要:
// Addressable name used to load an asset.
public string[] addressableNames;
}
}
(2)打包的相關指令碼:
當設定好上述屬性時,如何將它打成我們想要的AB包呢,接下來就要使用程式碼實現。在Assets/Editor目錄下新建一個指令碼,如下:
using UnityEngine;
using UnityEditor;
namespace Tool.AssetBundle {
public class BuildAssetBundle : MonoBehaviour {
// 打包輸出目錄,通常為StreamingAssets(若不存在該目錄需要新建一個),這是Unity的一個特殊目錄,打包時該目錄下所有資源會被打進包體中
//StreamingAssets與Resources的區別在於,StreamingAssets不會被壓縮打進包體,而Resources會被壓縮
public static readonly string RES_OUTPUT_PATH = "Assets/StreamingAssets";
//MenuItem會在unity選單欄新增自定義新項
[MenuItem("CustomEditor/Build AssetBundle")]
private static void Build() {
//打包,第一個引數是AB的輸出目錄,第二個引數是打包選項,第三個引數是打包的平臺,IOS,Android,Win要區分開,不然AB使用的時候會有問題。
BuildPipeline.BuildAssetBundles(RES_OUTPUT_PATH, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
}
}
}
上面的這就是一段最簡單的AB打包程式碼,然後返回Unity介面,在選單欄選擇CustomEditor下面的Build AssetBundle,如圖:你會發現除了canvas.ab還多了很多其他的檔案,這些留到下一篇再解釋,包括程式碼中一些需要注意的地方。
相關文章
- 整理Object的一些方法Object
- oracle set的一些整理Oracle
- scipy.sparse的一些整理
- 整理一些CSS的知識CSS
- GitHub上整理的一些工具Github
- 一些不常用的工具整理
- 關於MySQL event的一些整理MySql
- 整理的一些T-sql(轉)SQL
- 整理的一些常用到的 Nginx 配置Nginx
- Proguard整理一些資料
- 一些老筆記整理筆記
- Linux的一些工具使用技巧整理Linux
- 整理的一些SQL題,與討論SQL
- 整理的一些常用系統表 (轉)
- MySQL的一些常用的SQL語句整理MySql
- 一些前端小問題整理前端
- 整理一些筆記上傳筆記
- Linux下一些操作的簡單整理Linux
- JavaScript關於陣列的一些方法整理JavaScript陣列
- 專案中常用到的一些方法整理
- 【API分享】整理一些免費好用的APIAPI
- Spring 常見的一些面試題整理Spring面試題
- 整理總結的一些前端面試題前端面試題
- 整理的一些oracle備份筆記 (zt)Oracle筆記
- Unity5中lightmap的坑Unity
- Flutter Notes | 我用到的一些外掛整理Flutter
- 一些常見的重置密碼漏洞分析整理密碼
- js 一些專案中常用的原型方法整理JS原型
- 整理記錄一些好用的隨機圖API隨機API
- 一些功能性函式使用整理函式
- Java一些小知識整理,用於面試Java面試
- 整理了一些前端設計相關的網站前端網站
- 整理了一些好用的api,含免費次數API
- 一些知識點的整理以及面試題記錄面試題
- 整理一些前端開發比較好的node包前端
- 學習 Go 的一些工具類和技術點整理Go
- 組內分享,畫架構圖的一些知識整理架構
- 整理一些 JDK 中 Integer 實用但不常用的方法JDK