天天看點

AB包資源加載

建立腳本:

        //第一步 加載AB包

        AssetBundle.LoadFromFile();//裡面應該傳AB包路徑

打包時我們預設的打包路徑是Assets同級下的AssetBundles内的檔案,例如上一次打包的PC

AB包資源加載
AB包資源加載

 還有一個就是因為我們選擇了Copy to StreamingAssets是以它會在Asset下建立一個檔案夾

AB包資源加載

我們為什麼需要拷貝到StreamingAssets呢?

我們需要知道,當我們打包時,Assets同級下的AssetBundles内的檔案是不會被打包出去的。

StreamingAssets檔案夾會随着U3D打包而打包。它不會對裡面的檔案進行壓縮加密和Resources不一樣。在PC平台可讀可寫,IOS和Android是隻讀的。

 StreamingAssets檔案夾路徑怎麼擷取呢?

公共類中提供了:

Application.streamingAssetsPath//在不同平台下得到StreamingAssets路徑

//第一步 加載AB包
AssetBundle ab =  AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"model");
//"/"可以"\\"代替不可以用"\"這個是轉義符,+"包名"此處streamingAssetsPath内包明為model
           
AB包資源加載
AB包資源加載

不用泛型加載對象是Object,這樣會造成一個問題。隻用名字加載會出現 同名不同類型資源分不清

AB包資源加載

 是以推薦使用泛型的形式來加載

//第二步 加載AB包中的資源
      GameObject obj =  ab.LoadAsset<GameObject>("Cube");
           

然後生成加載的對象

Instantiate(obj);

運作腳本:

AB包資源加載

 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);

        }

    }

AB包資源加載

 單獨解除安裝model包(包含正方形的包)

ab.Unload(false);和上面一樣,當為true時AB包加載的也會消除

1、如何解決AB包不允許重複加載的問題?

用字典記錄已加載的AB包,如果存在則不重複加載

如果要記錄,那麼一定要提供解除安裝的方法