Unity高級功能—AssetsBundle的打包與下載

假設我們現在有一個立方體的預製體需要打包進來怎麼操作?

  1. 創建一個立方體,然後將它託進res文件夾,製作一個立方體預製體(prefab)
  2. 右下角的小窗口裏面,我們可以設置這個prefab爲一個AssetBundle,點擊New,就可以給他設置自己的名字,

我給這個prefab歸屬到“cub_bundle”類裏面

3、編寫腳本,進行打包

我們創建一個Editor的文件夾,然後在裏面創建一個腳本,我們起名字叫做:”exprot_assetbundle”,以及一個AssetBundle文件夾,這個文件夾是用來存放我們導出的資源的,導出的資源的路徑需要我們自己去設置。

腳本的內容如下

using System.Collections;  
using System.Collections.Generic;  
using UnityEngine;  
using UnityEditor;  
  
public class export_assetbundle : Editor  
{  
    // 在Unity上面的選項欄裏面,添加一個Build選項,點擊這個Build選項,我們就可以進行打包操作  
    [MenuItem("build/build_assetbundle")]  
  
    static void run() {  
        //調用函數來打包assetbundle  
        // 輸出路徑,自己創建,build之後,生成的文件就會在自己創建的輸出路徑中“Assets/AssetBundles”  
        //調用接口打包  
        // 第一個參數是我們指定的輸出文件夾  
        // 第二個參數指的是打包的方式,一般選擇就是None  
        // 第三個選項是準備打包的對應平臺的選項  
        BuildPipeline.BuildAssetBundles("Assets/AssetBundles",BuildAssetBundleOptions.None,BuildTarget.StandaloneOSX);  
  
    }  
}  

添加完上面的腳本之後,我們返回Unity的界面,就會在Unity上面的欄目裏面發現我們添加的選項按鈕:

點擊這個按鈕,接着Unity就會爲我們進行打包,然後將打包的文件設置在我們剛纔第一個參數的設置的路徑:

cub_bundle就是我們打包的文件,AssetBundles相當於一個說明文件,文件裏面說明了我們這個包裏面打包了什麼東西。

此時我們打包就已經操作完成了。

補充:

如果我們想打包不同種類呢:

就將我們在預製體右下角設置的bundle類型變換一下,就可以了。

就像現在我在res文件夾裏面添加一個膠囊體的預製體,然後將其命名爲:Capsule_bundle

這樣,打出來的就是會是兩個,如下圖:

 

下載

下載的方式有兩種,nocache和cache;

nocache:只要下載就去服務器下載,不管本地有沒有

cache:會帶一個版本號,下載時候會對比這個版本號,如果版本號一直的話,就不會下載,不一致,就會重新下載。

案例實現:

nocache下載:

爲了不使得主線程阻塞,使用協程進行下載,使用WWW類。

cache下載:

使用WWW類的LoadFromCacheorDown實現

public class GameScene : MonoBehaviour  
{  
    public string url;  
    // 版本號,自己控制  
    public int version;  
    // Start is called before the first frame update  
    void Start()  
    {  
        //this.StartCoroutine(this.nocache_load());  
        this.StartCoroutine(this.cache_load());  
    }  
  
    // 下載AssetBundle  
    // 分爲兩種:nocache,cache  
    // nocache:不會緩存,只要使用就會重新下載  
    // cache:就帶一個版本號,下載的時候,只要發現版本號一致,就不會下載,版本號不一致的時候纔會下載  
    IEnumerator nocache_load()  
    {  
        WWW w = new WWW(url);  
        yield return w;  
  
        //下載完成之後,執行的邏輯   
  
        if(w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
        AssetBundle bundle = w.assetBundle;  
    }  
  
    IEnumerator cache_load()  
    {  
        WWW w = WWW.LoadFromCacheOrDownload(url,version);  
  
        yield return w;  
  
        if (w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
        AssetBundle bundle = w.assetBundle;  
  
    }  
  
    // Update is called once per frame  
    void Update()  
    {  
          
    }  
}  

使用不緩存的方法,每運行一次都會從http服務器上面讀取,我在自己本地搭建的http服務器,所以上面有讀取的記錄。

使用緩存的方法,只要我的文件不變,意味着我的版本號不變,此時只有第一次運行的時候,會從http服務器下載,之後運行就不會下載了。

但是當你更改了版本號的時候,就會重新從服務器下載一遍

 

使用cache下載的方法,內存裏面會有下載的AssetBundle裏的景象。

AssetBundle的加載使用

在我們打包的文件裏面,有一個capsual_bundle.mainfest文件

這個文件裏面就描述了我們這個assetbundle裏面存放了哪些東西

打開之後,我們就會發現裏面有一個路徑的描述:

這個就是我們可以使用的資源的路徑,

案例代碼:

IEnumerator cache_load()  
    {  
        WWW w = WWW.LoadFromCacheOrDownload(url,version);  
  
        yield return w;  
  
        if (w.error != "")  
        {  
            Debug.Log(w.error);  
        }  
  
        AssetBundle bundle = w.assetBundle;  
  
        // 實例化一個對象  
        Object Prefab = bundle.LoadAsset("Assets/res/Capsule.prefab");  
        GameObject obj = (GameObject)Instantiate(Prefab);  
        obj.transform.parent = this.transform;  
  
        //卸載AssetBundle的鏡像  
        // 傳false的時候:只會卸載內存鏡像的AssetBundle,但是由AssetBundle生成的Prefab變量是不會被卸載的  
        // 傳true的時候:會卸載內存鏡像,也會卸載由鏡像生成的object變量  
        bundle.Unload(false);  
  
    }  

Tip:

1:AssetBundle.LoadAsset(路徑); // 資源所在的路徑名字

2: AssetBundle.LoadAllAsset()加載所有的資源

3:卸載

AssetBoundle.Unload(false);

AssetBoundle.Unload(true);

 true: 卸載內存鏡像以及Asset的內存實例;

  false: 卸載內存鏡像不卸載Asset內存實例;

4: 不能使用WWW對象去下載一個已經被加載進來的AssetBundle;

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章