AssetBundle的基礎使用

一、關於AssetBundle

1.什麼是AssetBundle

1) AssetBundle是一種經過Unity引擎處理了的資源包

2) 已經序列化的資源

3) 具有針對平臺的特性

4) 外部不相干,使用同樣加密方式的包,可以互相調用

2.類型

1) 一個場景打成一個AB包,使用的時候,是將場景加載到遊戲中

2) 鬆散資源包,一堆可複用的資源打成一個包,使用的時候,是按需載入包

3.作用

1) 最小化APP安裝包

1) 增量更新

3) 更好的控制實時的內存消耗

4) 選擇性的提供不同的內容

5) 減少打包和迭代時間

二、打包AssetBundle

打包方法:  BuildPipeline.BuildAssetBundles()

我們看到BuildAssetBundles() unity提供了兩種重載方法,先來說第一種

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

這裏有三個參數,第一個是輸出路徑,第二個打包的配置選項(一般選壓縮格式),第三個是打包的目標平臺

注:assetbundle的壓縮格式有3中:

1)LZMA --> BuildAssetBundleOptions.None    包最小,加載最慢

2)LZ4 --> BuildAssetBundleOptions.ChunkBasedCompression    包比不壓縮小,加載比不壓縮略慢

1)不壓縮 --> BuildAssetBundleOptions.UncompressedAssetBundle    包最大,加載最快

這種方法主要是根據我們在Inspector面板中對物體設置的assetbundle名進行打包,比如

擴展編輯器的打包代碼,Directory.CreateDirectory(savePath); 把文件保存在asset的同級目錄。

using UnityEditor;
using System.IO;

public class BuildAssetBundle : Editor
{
    private static string savePath = "AssetBundles";

    [MenuItem("Tools/BuildAssetBundle")]
    public static void BuildAssetBunlde()
    {
        if (Directory.Exists(savePath) == false)
        {
            Directory.CreateDirectory(savePath);
        }
        BuildPipeline.BuildAssetBundles(savePath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        AssetDatabase.Refresh();
    }
}

還有根據路徑打包

public static AssetBundleManifest BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);

這個方法多了一個參數AssetBundleBuild[] builds

我們可以看到是Unity封裝的一個打包結構體

必須設置assetBundleName和assetNames,其它可設可不設

assetBundleName即爲打出的assetbundle名

assetNames爲你要打包的資源路徑,這裏使用相對路徑,它是一個數組,說明可以把多個對象打成一個assetbundle。

第二種打包方法代碼

 

        if (Directory.Exists(savePath) == false)
        {
            Directory.CreateDirectory(savePath);
        }

        List<AssetBundleBuild> builds = new List<AssetBundleBuild>();
        
        AssetBundleBuild build = new AssetBundleBuild();
        build.assetBundleName = "Micro_Wizard.unity3d";
        build.assetNames = new string[] { "Assets/Toon/Micro_Wizard.prefab" };
        builds.Add(build);

        BuildPipeline.BuildAssetBundles(savePath, builds.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
        AssetDatabase.Refresh();

三、加載AssetBundle

1.從本地文件中加載

    public void LoadFromFile()
    {
        AssetBundle assetBundle = AssetBundle.LoadFromFile(Application.dataPath + "/../AssetBundles/Micro_Wizard.unity3d");
        Instantiate(assetBundle.LoadAsset<GameObject>("Micro_Wizard.prefab"));
    }

2.從內存中加載

    public void LoadFromMemory()
    {
        AssetBundle assetBundle = AssetBundle.LoadFromMemory(File.ReadAllBytes(Application.dataPath + "/../AssetBundles/Micro_Wizard.unity3d"));
        Instantiate(assetBundle.LoadAsset<GameObject>("Micro_Wizard.prefab"));
    }

3.從文件流加載

    public void LoadFromStream()
    {
        var fileStream = new FileStream(Application.dataPath + "/../AssetBundles/Micro_Wizard.unity3d", FileMode.Open, FileAccess.Read);
        AssetBundle assetBundle = AssetBundle.LoadFromStream(fileStream);
        Instantiate(assetBundle.LoadAsset<GameObject>("Micro_Wizard.prefab"));
    }

4.UnityWebRequest加載

    public void WebRequest()
    {
        StartCoroutine(WaitWebRequest());
    }

    IEnumerator WaitWebRequest()
    {
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(Application.dataPath + "/../AssetBundles/Micro_Wizard.unity3d");   
        yield return request.SendWebRequest();
        //AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(request);
        AssetBundle assetBundle = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
        Instantiate(assetBundle.LoadAsset<GameObject>("Micro_Wizard.prefab"));
    }

5.WWW加載

注:從2018版本後,這個方法已過時,使用UnityWebRequest方法代替

    public void WWWLoad()
    {
        StartCoroutine(WaitWWWLoad());
    }

    IEnumerator WaitWWWLoad()
    {
        while (Caching.ready == false)
            yield return null;

        WWW www = WWW.LoadFromCacheOrDownload(Application.dataPath + "/../AssetBundles/Micro_Wizard.unity3d", 1);
        yield return www;

        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log(www.error);
            yield break;
        }
        AssetBundle assetBundle = www.assetBundle;
        Instantiate(assetBundle.LoadAsset<GameObject>("Micro_Wizard.prefab"));
    }

 

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