1. 程式人生 > >unity AssetBundle打包

unity AssetBundle打包

AssetBundle分兩部分 一部分是將資源打包 程式碼如下:

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);
        }
        //打包生成
        BuildPipeline.BuildAssetBundles(strABOutPathDIR,BuildAssetBundleOptions.None,BuildTarget.StandaloneWindows64);
    }


}

程式碼寫好後要先在工程目錄下選中要打包的資源,在inspector中AssetBundle選項後面給資源要打的包起名字

然後使用 BuildAllAB()方法就開始打包並將包存放在Assets/StreamingAssets目錄中;

 

第二部分是使用包的資源:

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

namespace DemoSpace
{
	public class AssetBundleLoadDemo : MonoBehaviour 
	{
        //測試物件,改變貼圖
        //public GameObject goCubeChangeTextur;
        //測試物件,顯示方位
        public Transform TraShowPos;

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

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

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


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

        void Start () {
            //測試載入“非GameObject”資源
            //StartCoroutine(LoadNonObjectFromAB(_URL1, goCubeChangeTextur, _AssetName1));

            //測試載入“非GameObject”資源
            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);
                }
            }
        }


    }
}

通過修改URL的地址和呼叫對應的載入方法就可以完成 AssetBundle包的應用了