建立腳本:
//第一步 加載AB包
AssetBundle.LoadFromFile();//裡面應該傳AB包路徑
打包時我們預設的打包路徑是Assets同級下的AssetBundles内的檔案,例如上一次打包的PC
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLjNmNmJzYxUDOiZWNlJWYiBTZxQTY0QDMyQGN5MDMlFzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
還有一個就是因為我們選擇了Copy to StreamingAssets是以它會在Asset下建立一個檔案夾
我們為什麼需要拷貝到StreamingAssets呢?
我們需要知道,當我們打包時,Assets同級下的AssetBundles内的檔案是不會被打包出去的。
StreamingAssets檔案夾會随着U3D打包而打包。它不會對裡面的檔案進行壓縮加密和Resources不一樣。在PC平台可讀可寫,IOS和Android是隻讀的。
StreamingAssets檔案夾路徑怎麼擷取呢?
公共類中提供了:
Application.streamingAssetsPath//在不同平台下得到StreamingAssets路徑
//第一步 加載AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"model");
//"/"可以"\\"代替不可以用"\"這個是轉義符,+"包名"此處streamingAssetsPath内包明為model
不用泛型加載對象是Object,這樣會造成一個問題。隻用名字加載會出現 同名不同類型資源分不清
是以推薦使用泛型的形式來加載
//第二步 加載AB包中的資源
GameObject obj = ab.LoadAsset<GameObject>("Cube");
然後生成加載的對象
Instantiate(obj);
運作腳本:
AB包不能重複加載 否則報錯
//AB包不能夠重複加載 否則報錯
//AssetBundle ab2 = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/" + "model");
//加載一個圓,由于我們已經加載了AB包,是以就省略了第一步
GameObject obj2 = ab.LoadAsset("Sphere", typeof(GameObject)) as GameObject;
Instantiate(obj2);
以上都是同步加載
異步加載->攜程
建立攜程
StartCoroutine(LoadABRes("head", "Sphere"));
IEnumerator LoadABRes(string ABName,string resName)
{
//第一步 加載AB包
AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync(Application.streamingAssetsPath + "/" + "ABName");
yield return abcr;
//第二部 加載資源
AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync("resName", typeof(GameObject));
yield return abq;
GameObject sp = abq.asset as GameObject;
//abq.asset得到資源
Instantiate(sp);
}
解除安裝AssetBundle(AB包)
AssetBundle.UnloadAllAssetBundles(true);如果為true的話,場景中有東西是AB包加載的話,那些東西也會被解除安裝。false隻解除安裝AB包
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
AssetBundle.UnloadAllAssetBundles(true);
}
}
單獨解除安裝model包(包含正方形的包)
ab.Unload(false);和上面一樣,當為true時AB包加載的也會消除
1、如何解決AB包不允許重複加載的問題?
用字典記錄已加載的AB包,如果存在則不重複加載
如果要記錄,那麼一定要提供解除安裝的方法