unityAB包學習
- 1.AB包的導出
- 擴展BuildAssetBundleOptions
- 無特殊選項
- 壓縮相關選項
- 2.AB包資源管理
- 3.Resource和AssetBundle加載方式的區別
- 4.預設體
- 5.Unity Asset Bundle Browser 工具
- 5為什么要勾選拷貝到StreamingAsset里面。
- 6.AB包的加載
1.AB包的導出
首先在Project窗口,在Asset窗口下創建一個名為Editor的文件夾,并將AB包導出的代碼放于此處,否者將報錯。
選擇你要打包的內容到某個預設定的包中,下圖示意為把Sampleplayr這個預制件預處理放置到charactorAb包中。真正開始導出是使用你自定義的導出按鍵,代碼在下方。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;public class AssetBundleExport
{[MenuItem("Assets/Export AssetBundles")]//菜單物品:于 Asset按鍵下方欄目的“Name”按鈕。//此處Name是“Export AssetBundles”static void BuildAllAssetBundles(){//靜態方法,工具類,不需要實例化,unity內部似乎已經幫我們處理過了string assetBundleDirectory = "E:\\unt\\AssetBundle\\Assets\\ExportAB";if (!Directory.Exists(assetBundleDirectory))//檢測路徑是否存在{//如果不存在就新建一個文件夾Directory.CreateDirectory(assetBundleDirectory);}//否者導出//參數為 路徑/ AB包導出選項(此處為none)/ 導出的目標平臺BuildPipeline.BuildAssetBundles(assetBundleDirectory,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows);}
}
unity官方頁面:
擴展BuildAssetBundleOptions
無特殊選項
BuildAssetBundleOptions.None
作用:默認選項,不應用任何特殊的構建選項。構建的 AssetBundle 會包含所有依賴項,并且不會進行額外的優化或壓縮。
壓縮相關選項
2.AB包資源管理
AB包導出的資源最好合理分類,不要引用Project中的Resource內的資源文件,否則會多次調用復制。
為什么呢?是由于unity內部機制決定的!
3.Resource和AssetBundle加載方式的區別
也就是說Resource雖然保證了能引用到某個文件,但它不合理的遍歷查找方式和重復資源加載和落后的打包發布使得這個系統不如AssetBundle。
但是Resource的操作方便,適合小型游戲的開發。使用Resources系統可以快速地加載和使用資源,無需過多考慮資源的重復加載和打包優化等問題,能夠提高開發效率。開發人員可以更專注于游戲的功能實現,而不必花費過多精力在資源管理上。
4.預設體
預設體是一種“反射”并沒有真正存儲C#代碼,而是對C#腳本的一種關聯,這就是為什么預設體即使掛載了C#腳本和組件也能放入AB包中。
5.Unity Asset Bundle Browser 工具
工具下載自行百度。
Configure欄
build欄
下圖來源:
于毒,空間鏈接
-
- LZMA 壓縮
壓縮原理
LZMA 是一種通用的數據壓縮算法,采用了字典編碼和算術編碼相結合的方式,能實現較高的壓縮比。它會對整個 AB 包進行壓縮,生成一個緊湊的文件。
優點
高壓縮比:生成的 AB 包文件體積最小,在網絡傳輸時可以節省大量的帶寬,減少下載時間和流量消耗,適合需要通過網絡大量下載資源的情況,例如手游的資源更新。
缺點
加載時間長:在加載 AB 包時,需要先將整個壓縮包解壓,這個過程會消耗較多的 CPU 資源和時間,導致加載速度變慢。
解壓內存需求大:解壓過程需要足夠的內存來存儲解壓后的文件,可能會對內存有限的設備造成壓力。
適用場景
適用于網絡帶寬有限、下載速度較慢的場景,例如移動設備通過移動網絡下載資源,或者資源更新包較大的情況。
- LZMA 壓縮
-
- LZ4 壓縮
壓縮原理
LZ4 是一種無損數據壓縮算法,它采用塊壓縮的方式,將 AB 包分割成多個小塊分別進行壓縮。這樣在加載時可以按需解壓部分塊,而不需要解壓整個包。
優點
快速加載:由于采用塊壓縮,加載時可以只解壓需要的部分,大大縮短了加載時間,提高了資源的加載效率。
低內存占用:解壓過程中只需要解壓當前需要的塊,對內存的需求相對較小,適合內存有限的設備。
缺點
壓縮比相對較低:相比 LZMA,LZ4 的壓縮比要低一些,生成的 AB 包文件體積會稍大。
適用場景
適用于對加載速度要求較高的場景,例如游戲運行時需要頻繁加載和卸載資源的情況,如場景切換、動態加載模型等。
- LZ4 壓縮
-
- 不壓縮
壓縮原理
不進行任何壓縮操作,AB 包以原始的二進制數據形式存儲。
優點
最快的加載速度:由于不需要進行解壓操作,加載 AB 包的速度最快,能夠立即使用資源。
缺點
文件體積大:AB 包的文件大小與原始資源文件大小基本相同,會占用更多的存儲空間,并且在網絡傳輸時需要更多的帶寬和時間。
- 不壓縮
5為什么要勾選拷貝到StreamingAsset里面。
何時是只讀的?
6.AB包的加載
同一個AB包(指小包)不能夠被重復加載,否者報錯。
void Start ()
{// 第一步 加載 AB 包AssetBundle ab = AssetBundle.LoadFromFile (Application.streamingAssetsPath + "/" + "model");// 第二步 加載 AB 包中的資源// 只是用名字加載 會出現 同名不同類型資源 分不清// 建議大家用 泛型加載 或者 是 Type 指定類型//GameObject obj = ab.LoadAsset<GameObject>("Cube");GameObject obj = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;Instantiate(obj);
}
StartCoroutine (LoadABRes ("head", "23_11100001"));
IEnumerator LoadABRes (string ABName, string resName)
{
// 第一步 加載 AB 包AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync (Application.streamingAssetsPath + "/" + ABName);yield return abcr;
// 第二步 加載資源AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync (resName, typeof (Sprite));yield return abq;
//abq.asset as Sprite;img.sprite = abq.asset as Sprite;
}
AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects)
參數含義:該方法有一個布爾類型的參數unloadAllObjects 。當參數為true時,會卸載所有已加載的 AB 包,并且會卸載所有通過這些 AB 包加載到內存中的資源,即便這些資源正被其他部分依賴引用;當參數為false時 ,會卸載所有未被其他資源依賴的 AB 包及其資源,對于正被依賴引用的資源則不會卸載。
AssetBundle ab = AssetBundle.LoadFromFile("path/to/your/assetbundle");
// 加載資源
GameObject obj = ab.LoadAsset<GameObject>("YourGameObject");
// 卸載AB包,不卸載已加載資源實例
ab.Unload(false);
// 此時obj仍可使用,但不能再從ab加載新資源// 卸載AB包,同時卸載已加載資源實例
ab.Unload(true);
// 此時obj不可用,相關資源內存被釋放
異步卸載包
IEnumerator UnloadABBundleAsync(){// 進行異步卸載,同時卸載已加載資源實例var unloadRequest = ab.UnloadAsync(true);// 等待卸載完成while (!unloadRequest.isDone){yield return null;}Debug.Log("AB包及其已加載資源實例已成功異步卸載");// 此時AB包已卸載,ab引用不再有效,可設置為nullab = null;}