一、關於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"));
}