unity AssetBundle 使用

一、什麼是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);
        }

    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章