unity AssetBundle打包
阿新 • • 發佈:2018-11-15
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包的應用了