一、什麼是AssetBundle?
可以歸爲兩點:
1,它是一個存在於硬盤上的文件。可以稱之爲壓縮包。這個壓縮包可以認爲是一個文件夾,裏面包含了多個文件。這些文件可以分爲兩類:serialized file 和 resource files。(序列化文件和源文件) serialized file:資源被打碎放在一個對象中,最後統一被寫進一個單獨的文件(只有一個) resource files:某些二進制資源(圖片、聲音)被單獨保存,方便快速加載
2,它是一個AssetBundle對象,我們可以通過代碼從一個特定的壓縮包加載出來的對象。這個對象包含了所有我們當初添加到這個壓縮包裏面的內容,我們可以通過這個對象加載出來使用。
二、AssetBundle使用流程(簡稱AB)
1,指定資源的AssetBundle屬性 (xxxa/xxx)這裏xxxa會生成目錄,名字爲xxx
選中你要打包的材質,爲其添加assetbundle屬性
2,構建AssetBundle包
創建一個Editor文件夾(名字確定),寫一個擴展腳本CreatAssetBundle
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class CreatAssetBundle{
[MenuItem("Assets/Build AssetBundles")]//菜單欄添加
static void BuildAllAssetBundle() {
string dir = "AssetBundles";
if (Directory.Exists(dir) == false) {//創建文件
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
///<summary>
///BuildAssetBundleOptions.None:使用LZMA算法壓縮,壓縮的包更小,但是加載時間更長。使用
///前需要整體解壓。一旦被解壓,這個包會使用LZ4重新壓縮。使用資源的時候不需要整體解壓。
///在下載的時候可以使用LZMA算法,一旦它被下載了之後,它會使用LZ4算法保存到本地上。
/// BuildAssetBundleOptions.UncompressedAssetBundle:不壓縮,包大,加載快
/// BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4壓縮,壓縮率沒有LZMA高,但是我們可以加載指定資源而不用解壓全部。
///注意使用LZ4壓縮,可以獲得可以跟不壓縮想媲美的加載速度,而且比不壓縮文件要小。
///</summary>
}
}
資源打包
腳本添加後,assets 下會出現Build AssetBundles,點擊進行打包
3,上傳AB包
將ab包放到服務器上
4,加載AB包和包裏面的資源
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.Networking;
public class LoadFormFileExample : MonoBehaviour {
IEnumerator Start () {
//string path = "AssetBundles/wall.unity3d";
//AssetBundle ab2 = AssetBundle.LoadFromFile("AssetBundles/shear.3d");
//AssetBundle ab1 = AssetBundle.LoadFromFile("AssetBundles/wall.unity3d");
//GameObject wallPrefab = ab1.LoadAsset<GameObject>("Cube");
//Instantiate(wallPrefab);
//第一種加載方式 LoadFromMemoryAsync,異步加載需要轉換爲bytes數組,返回request
//AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
//yield return request;
//AssetBundle ab = request.assetBundle;
//第二種方式 ,LoadFromMemory 同步加載,直接返回AssetBuandle
//AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes(path));
//第三種LoadFromFile 從本地文件加載
//AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path);
//yield return request;
//AssetBundle ab = request.assetBundle;
//第四種使用方式UnityWebRequest
string uri = "http://localhost/AssetBundles/wall.unity3d";//修改地址即可
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//www,加載方式
//while (Caching.ready == false) {
// yield return null;
//}
//WWW www = WWW.LoadFromCacheOrDownload(@uri,1);
//yield return www;
//if (string.IsNullOrEmpty(www.error) == false) {
// Debug.Log(www.error);
// yield break;
//}
//AssetBundle ab = www.assetBundle;
//使用
GameObject wallPrefab = ab.LoadAsset<GameObject>("Cube");
Instantiate(wallPrefab);
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] st = manifest.GetAllDependencies("wall.unity3d");//獲取所有依賴的包名
foreach(string i in st) {
AssetBundle.LoadFromFile("AssetBundles/" + i);
}
}
}