1. 程式人生 > >資源解決方案 AssetBundle.壓縮,解壓,例項化,依賴關係

資源解決方案 AssetBundle.壓縮,解壓,例項化,依賴關係

筆記內容

預製體: AssetBundle: 預製體 --> UI載入? resources 預製體 都是載入過來的. UI 都採用動態繫結

就是assetbundle下載過程 通過網路下載的 紅警 騰訊 資源包更新 需要消耗100MB 流量 現在正在解壓本過程不消耗流量 進度條 跳轉場景 WWW www = new WWW(ABURL) AssetBundle ab = www.assetBundle;

AB包 是一個特殊格式的壓縮包 關於unity資源都能壓縮 不包含程式碼的 UI 模型 音樂 熱更新: 不幹掉原來的進行更新(打補丁)

具體步驟

1.進行AB包的時候進行屬性設定 2.將設定好的屬性(預製體…) 壓縮成為一個特定的檔案 程式碼壓縮的!!! 3.放置到web/gameserver上面 4.客戶端經過檢驗之後下載 5.下載之後解壓例項化 6.BuildAssetBundleTool

編譯器擴充套件:

  1. 在editor目錄下
  2. AssetBundle的名字就是壓縮包的名字和實質內容基本無關! ab.Unload(true); --> 從專案和記憶體中都幹掉 ab.Unload(false); --> 釋放記憶體

示例 編譯器擴充套件及壓縮AB包 在這裡插入圖片描述

1.編譯器擴充套件必須在Editor文件內 2.需要引用UnityEditor 3.不要繼承MonoBehaviour 4.[MenuItem(“AssetBundleTools/BuidAB”)] 5.程式碼實現

壓縮AB包

建立好路徑,streamingAssets檔案下再加Windows資料夾用以儲存 程式碼實現

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;//編譯器擴充套件選單引用
using System.IO;


public class BuildAssetBundleTools{
    [MenuItem("AssetBundleTools/BuidAB")]//固定格式,建立選單選項AssetBundleTools,二級選單為BuidAB
    public static void Building()
    {
        string abPath =
Application.streamingAssetsPath + "\\Windows";//定義路徑,固定格式,要寫入到Windows資料夾內 //固定格式,壓縮 (路徑,伺服器,標準格式) BuildPipeline.BuildAssetBundles(abPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64); } }

例項化預製體

1.預製體制作完成後需要在右下角進行設定AssetBundle項,這個名字即是AB包的名字,如名字相同則在同個壓縮包內 2.建立指令碼並掛載

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

public class Load : MonoBehaviour {

	// Use this for initialization
	void Start () {
		string abPath= Application.streamingAssetsPath + "\\Windows\\Cube";//路徑
        AssetBundle ab = AssetBundle.LoadFromFile(abPath);//解壓固定格式
        if (ab==null)
        {
            Debug.LogError("載入失敗");
            return;
        }
        GameObject cubeObj = ab.LoadAsset<GameObject>("Sphere");//解壓固定格式
        if (cubeObj!=null)
        {
            Instantiate(cubeObj);//例項化出來
        }
        else
        {
            Debug.LogError("該資源不存在");
        }
        StartCoroutine("creat",ab);//開啟協程
    }
	
	// Update is called once per frame
	void Update () {
		
	}
    IEnumerator creat(AssetBundle ab)
    {
        //yield return new WaitForSeconds(3);
        //ab.Unload(false);//釋放記憶體
        yield return new WaitForSeconds(3);
        Instantiate(ab.LoadAsset<GameObject>("Cube"));
    }
}

WWW實現資源載入

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

public class WWWL : MonoBehaviour {

	// Use this for initialization
	void Start () {
        //本地必須加入file:// 這樣子www才能進行訪問
        string path = "file://" + Application.streamingAssetsPath + "/Windows/cube";
        StartCoroutine("load", path);
    }
	
	// Update is called once per frame
	void Update () {
		
	}
    IEnumerator load(string _path)
    {
        using (WWW load01=new WWW(_path))
        {
           
            yield return load01;
            if (load01!=null)
            {
                AssetBundle ab = load01.assetBundle;
                if (ab!=null)
                {
                    GameObject obj = ab.LoadAsset<GameObject>("Cube");
                    Instantiate(obj);
                }
            }
            else
            {
                Debug.LogError("載入失敗");
            }
        }
    }
}


依賴關係載入示例

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

public class load1 : MonoBehaviour {
    public string ABName;//載入的AB包設定的名字
    string _abPath;//AB包路徑
    string _manPath;//依賴關係包路徑
    List<AssetBundle> MyABList;//用來裝依賴關係
	// Use this for initialization
	void Start () {
        MyABList = new List<AssetBundle>();//初始化變數
        _abPath = Application.streamingAssetsPath + "/Windows/";//路徑未寫完呼叫需要加上ABname;
        _manPath = Application.streamingAssetsPath + "/Windows/Windows";//依賴路徑
        #region 載入依賴固定格式
        AssetBundle _manAB = AssetBundle.LoadFromFile(_manPath);
        AssetBundleManifest manifest = _manAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
        string[] depen = manifest.GetAllDependencies(ABName);//傳遞您想要依賴項的包的名稱。
        if (depen.Length!=0)
        {
            foreach (string s in depen)
            {
                MyABList.Add(LoadABByName(s));//加進順序表,通過方法傳遞名字返回一個載入好的AssetBundle值
            }
        }
        #endregion
        
        #region 例項化
        AssetBundle _ab = AssetBundle.LoadFromFile(_abPath + ABName);
        GameObject _copyAB = _ab.LoadAsset<GameObject>("Capsule");
        Instantiate(_copyAB);
        #endregion
        #region 釋放記憶體
        foreach (var item in MyABList)
        {
            item.Unload(false);
        }
        #endregion
    }

    // Update is called once per frame
    void Update () {
		
	}
    private AssetBundle LoadABByName(string name)
    {
        return AssetBundle.LoadFromFile(_abPath + name);
    }
}