最近參考了各位大神的資源,初步學(xué)習(xí)了Unity的資源管理模式,,包括在編輯器管理(使用AssetDatabase)和在運(yùn)行時(shí)管理(使用Resources和AssetBundle),。在此簡單總結(jié)運(yùn)行時(shí)用AssetBundle動(dòng)態(tài)打包/解包資源的方法,方便自己回顧,。
關(guān)于AssetBundle有很多的細(xì)節(jié)問題,,在此先作個(gè)筆記,等更多的問題搞清楚了/有了新的理解,,再接著補(bǔ)充/修改,。
創(chuàng)建編輯器菜單項(xiàng),用于打包AssetBundle
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // 需要使用List集合
using UnityEditor; // 創(chuàng)建編輯器菜單項(xiàng)需要導(dǎo)入這個(gè)文件
public class CreateMenuItem { // 不需要繼承Mono
[MenuItem("My MenuItem/Build AssetBundle")]
public static void BuildBundle()
{
List<AssetBundleBuild> list = new List<AssetBundleBuild>(); // 多個(gè)資源可以打入一個(gè)包中,,不確定個(gè)數(shù)時(shí),,可用List集合一個(gè)一個(gè)添加
AssetBundleBuild b = new AssetBundleBuild();
b.assetBundleName = "1.unity3d"; // 用于加載該資源,相當(dāng)于這個(gè)資源在AssetBundleBuild中的ID,,因?yàn)锳ssetBundleBuild中可能有多個(gè)資源
b.assetNames = new string[] { "Assets/Resources/Images/1.jpg" }; // 這個(gè)AssetBundleBuild里包含的哪些資源
list.Add(b);
// 該方法不會(huì)自動(dòng)生成文件夾,,所以若指定的文件夾不存在,則打包失敗
BuildPipeline.BuildAssetBundles("Assets/Bundles", list.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
打包成功后,,在目標(biāo)文件夾下多了如下4個(gè)文件:
關(guān)于制作編輯器菜單項(xiàng)
- 需要把該腳本放在Editor目錄下,,建議在Assets根目錄下新建“Editor”文件夾。
- 需要導(dǎo)入U(xiǎn)nityEditor文件,。
- 菜單項(xiàng)的類不用繼承MonoBehaviour,。
- 需要使用MenuItem特性,。
- 點(diǎn)擊菜單項(xiàng)觸發(fā)的函數(shù)是static靜態(tài)的。
關(guān)于打包AssetBundle
- assetBundleName : 該資源打入包后的名字,,解包時(shí)可用該名字訪問到該資源,。
- assetNames : 要被打包的資源當(dāng)前的相對(duì)路徑。
- 打包函數(shù):BuildPipeline.BuildAssetBundles(),。
- 打包函數(shù)要求傳入AssetBundleBuild[]數(shù)組,,因?yàn)橐粋€(gè)AssetBundle壓縮包中可以被加入多個(gè)資源,可以使用動(dòng)態(tài)數(shù)組List來替代(不用指定數(shù)組長度),,使用集合的Add()方法將資源一個(gè)一個(gè)加入包中,。
- 關(guān)于參數(shù)BuildAssetBundleOptions,以前常用的選項(xiàng)BuildAssetBundleOptions.CollectDependencies和BuildAssetBundleOptions.CompleteAssets都已過時(shí),,官方文檔解釋是這兩種選項(xiàng)現(xiàn)在都默認(rèn)會(huì)被執(zhí)行,。關(guān)于這個(gè)參數(shù)我沒有過多的探究,這里暫時(shí)選用了BuildAssetBundleOptions.None,。
- 方法的最后一個(gè)參數(shù)BuildTarget指定打包到哪個(gè)平臺(tái)下,,這里我用PC測(cè)試選擇BuildTarget.StandaloneWindows64。
- 打包方法中填的目標(biāo)文件夾路徑如果不存在,,該方法不會(huì)創(chuàng)建該文件夾,,打包失敗。
- 這里只是簡單的打包一個(gè)資源,,沒有涉及打包多個(gè)資源時(shí),,不同資源有共通引用別的資源的問題,學(xué)習(xí)中,。
加載/解包AssetBundle
public class LoadAssetBundle : MonoBehaviour {
void Start () {
StartCoroutine(Load());
}
// 加載AssetBundle壓縮包是個(gè)異步過程,,需要開啟協(xié)程
IEnumerator Load()
{
// 步驟一:獲取AssetBundle壓縮包
// WWW www = new WWW("http://myserver/myBundle.unity3d"); // 從遠(yuǎn)端服務(wù)器下載
// WWW www = new WWW("File://" + Application.streamingAssetsPath + "1.unity3d"); // 手機(jī)上從本機(jī)加載
WWW www = new WWW("File:///D:/Unity Projects/Learn Asset Manage/Assets/Bundles/1.unity3d"); // 從PC本機(jī)加載,是三個(gè)杠
yield return www;
AssetBundle build = www.assetBundle;
Debug.Log(build); // 測(cè)試是否非空
// 步驟二:解包獲取資源
/*
// 異步加載,,分幀操作
AssetBundleRequest request = build.LoadAssetAsync("Assets/Prefabs/airplane.prefab", typeof(GameObject)); // 名字和類型是打包時(shí)確定的
yield return request;
GameObject go = request.asset as GameObject;
*/
// 同步加載,,速度更快,但可能會(huì)阻塞主線程
GameObject go = build.LoadAsset<GameObject>("Assets/Prefabs/airplane.prefab");
Instantiate(go, new Vector3(0, 0, 0), Quaternion.identity);
// 完成后釋放原始鏡像文件
www.Dispose();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
注意點(diǎn):
- 加載AssetBundle壓縮包是個(gè)異步過程,,需要開啟協(xié)程,。
- 壓縮包的獲取方式有三種:從遠(yuǎn)端服務(wù)器、手機(jī)上本地加載,、PC上本地加載,。想要在手機(jī)上加載本地AssetBundle,,需要將所需資源包存放在自創(chuàng)建的名為“StreamingAssets”的文件夾中,,該資源才能發(fā)布到真機(jī)上。參考Streaming Assets
- 解AssetBundle包可以使用異步或同步加載方式,,前者分幀操作加載稍慢,,后者加載更快但可能阻塞主線程。
- 解壓完成后可以通過www.Dispose()方法將原WWW的壓縮包鏡像文件釋放。
|