Unity AssetBundle 的簡單使用

AssetBundle本質就是一種資源管理的技術。
AssetBundle是一個壓縮包。 它包含模型、貼圖、預製體(Prefab)、音頻等
資源,可以在遊戲運行期被加載。
AssetBundle自身保存着互相的依賴關係。

創建AssetBundle:
 1: 首先定位需要打包與加載的資源,資源可以
是任意類型(如:貼圖、材質、音頻、預設等)。
在Assets下點擊資源,屬性窗口下方中可以看
到資源預覽。 在AssetBundle後面輸入需要打包
的“AssetBundle名稱”。
2: 現在編寫打包腳本(BuildAssetBundle.cs),在編寫前首先確認腳本定
義在“Editor”的特殊文件夾下。
3: 打包核心API:
 BuildPipeline.BuildAssetBundles(“AB輸出路
徑”,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
4: 編寫腳本,在Unity編輯器頂部菜單會出現自定義的AB菜單。點擊菜單
後開始打包,大約幾秒後在項目視圖的StreamingAssets目錄下我們可以看
到打好包的文件資源

 

//把資源打成ab包

//腳本定義在“Editor”的特殊文件夾下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;   //引入Unity編輯器,命名空間
using System.IO;     //引入的C#IO,命名空間

public class BuildAssetBundle {

    /// <summary>
    /// 打包生成所有的AssetBundles(包)
    /// </summary>
    [MenuItem("AssetBundleTools/BuildAllAssetBundles")]
    public static void BuildAllAB()
    {
        //打包AB輸出路徑
        string strABOutPathDIR = string.Empty;

        //獲取"StreamingAssets"數值
        strABOutPathDIR = Application.streamingAssetsPath;
        //判斷生成輸出目錄文件夾
        if (!Directory.Exists(strABOutPathDIR))
        {
            Directory.CreateDirectory(strABOutPathDIR);
        }
        //  對需要打包的資源,在資源預覽窗口, 在AssetBundle後面輸入需要打包 的“AssetBundle名稱”,調用打包函數 就會打包
        //打包生成                                                                   //BuildTarget 打包到的目標平臺
        BuildPipeline.BuildAssetBundles(strABOutPathDIR,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
    }


}

 

把ab包的資源加載到場景


// AssetBundle基本加載
//             分爲兩種:
//            1: 加載非“對象預設”方式。(例如: 貼圖、材質、音頻...)
//            2:  加載“對象預設”(*.Prefab) 方式。
//採用www方式  下載assetBundle(下載的AssetBundle文件不會存入Unity引擎的緩存區)

//三種不同的方法來加載已經下載的數據資源:
//assetBundle.LoadAsset();  通過指定assetBundle包名稱加載資源。
//assetBundle.LoadAssetAsync(); 異步加載模式。加載過程不會同時阻礙主線程的運行,
//     這特別適合需要讀取大尺寸資源,以及一次性讀取多個資源的場合。
//assetBundle.LoadAllAssets(); 加載assetBundle中包含的所有資源對象。

//Unity打包的時候會自動處理依賴關係,並生成一個*.manifest文件,這個文件描述
//  了assetbundle包大小、CRC驗證、包之間的依賴關係等。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace DemoSpace
{
	public class AssetBundleLoadDemo : MonoBehaviour 
	{
        //測試對象,改變貼圖
        public GameObject goCubeChangeTextur;

        //定義URL與資源名稱
        private string _URL1;
        private string _AssetName1;


        //測試對象,顯示方位
        public Transform TraShowPos;

        private string _URL0;  //只加載AB包URL路徑
        private string _URL2;
        private string _AssetName2;

        private void Awake()
        {
            //AB 包下載地址
            _URL1 = "file://" + Application.streamingAssetsPath + "/textures1"; //textures1 包的名稱
            ////(AB包內部)資源名稱
            _AssetName1 = "unitychan_tile6";

            //只加載“素材AB包”
            _URL0= "file://" + Application.streamingAssetsPath + "/texture1";  //texture1 包的名稱
            //AB 包下載地址
            _URL2 = "file://" + Application.streamingAssetsPath + "/prefabs1"; //prefabs1 包的名稱
            //(AB包內部)資源名稱
            _AssetName2 = "FloorCube.prefab";
        }

        void Start () {

            //測試加載“非GameObject”資源  (加載非預設)
            StartCoroutine(LoadNonObjectFromAB(_URL1, goCubeChangeTextur, _AssetName1));

            //測試加載“非GameObject”資源   
            //預設打成ab包,預設的 材質也 打成ab包,   AB預設包 對  材質AB包 有依賴
            // 所以要先加載“材質AB包”,後加載 預設包 
            //要是單獨打包預設 ,就不用先加載“材質AB包”
            StartCoroutine(LoadFromAB(_URL0));//先加載“材質”AB包
            StartCoroutine(LoadPrefabsFromAB(_URL2, _AssetName2, TraShowPos));//再加載AB預設包,且提取資源。
        }

        /// <summary>
        /// 加載“非GameObject”資源  (非預設)
        /// </summary>
        /// <param name="ABURL">AB包URL</param>
        /// <param name="goShowObj">操作且顯示的對象</param>
        /// <param name="assetName">加載資源的名稱</param>
        /// <returns></returns>
        IEnumerator LoadNonObjectFromAB(string ABURL, GameObject goShowObj, string assetName)        
        {
            //參數檢查
            if(string.IsNullOrEmpty(ABURL) || goShowObj==null)
            {
                Debug.LogError(GetType()+ "/LoadNonObjectFromAB()/輸入的參數不合法,請檢查");
            }

            using (WWW www=new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab != null)
                {
                    if (assetName=="")
                    {
                        goShowObj.GetComponent<Renderer>().material.mainTexture = (Texture)ab.mainAsset;
                    }
                    else {
                        goShowObj.GetComponent<Renderer>().material.mainTexture = (Texture)ab.LoadAsset(assetName);
                    }
                    //卸載資源(只卸載AB包本身)
                    ab.Unload(false);
                }
                else {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下載錯誤,請檢查 URL: "+ ABURL + " 錯誤信息:"+www.error);
                }

            }
        }

        /// <summary>
        /// 加載“預設”資源
        /// </summary>
        /// <param name="ABURL">AB包URL</param>
        /// <param name="assetName">加載資源的名稱</param>
        /// <param name="showPosition">顯示的方位</param>
        /// <returns></returns>
        IEnumerator LoadPrefabsFromAB(string ABURL, string assetName,Transform showPosition=null)
        {
            //參數檢查
            if (string.IsNullOrEmpty(ABURL))
            {
                Debug.LogError(GetType() + "/LoadPrefabsFromAB()/輸入的參數不合法,請檢查");
            }

            using (WWW www = new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab != null)
                {                    
                    if (assetName=="")
                    {
                        //加載主資源
                        if (showPosition != null)
                        {
                            GameObject goCloneObj=(GameObject)Instantiate(ab.mainAsset);
                            //克隆的對象顯示位置
                            goCloneObj.transform.position = showPosition.transform.position;
                        }
                        else {
                            //克隆加載的預設對象
                            Instantiate(ab.mainAsset);  
                        }
                    }
                    else {
                        //實例化指定資源
                        if (showPosition != null)
                        {
                            GameObject goCloneObj = (GameObject)Instantiate(ab.LoadAsset(assetName));
                            //克隆的對象顯示位置
                            goCloneObj.transform.position = showPosition.transform.position;
                        }
                        else
                        {
                            //克隆加載的預設對象
                            Instantiate(ab.LoadAsset(assetName));
                        }
                    }
                    //卸載資源(只卸載AB包本身)
                    ab.Unload(false);
                }
                else
                {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下載錯誤,請檢查 URL: " + ABURL + " 錯誤信息:" + www.error);
                }

            }
        }

        //加載AB包(不提取資源)
        IEnumerator LoadFromAB(string ABURL)
        {
            //參數檢查
            if (string.IsNullOrEmpty(ABURL))
            {
                Debug.LogError(GetType() + "/LoadFromAB()/輸入的參數不合法,請檢查");
            }

            using (WWW www = new WWW(ABURL))
            {
                yield return www;
                AssetBundle ab = www.assetBundle;
                if (ab == null)
                {
                    Debug.LogError(GetType() + "/LoadNonObjectFromAB()/WWW 下載錯誤,請檢查 URL: " + ABURL + " 錯誤信息:" + www.error);
                }
            }
        }


    }
}


 

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