資源解決方案 AssetBundle.壓縮,解壓,例項化,依賴關係
阿新 • • 發佈:2018-12-18
筆記內容
預製體: 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
編譯器擴充套件:
- 在editor目錄下
- 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);
}
}