我們想要在游戲中動態(tài)的加載我們的資源,可以使用AssetBundle的方式或者是Resources.Load的方式。
那么如何使用AssetBundle呢
我們首先需要對我們的編輯器做一些小小的處理
1.在Unity中增加一個打bundle的操作按鈕
在項(xiàng)目的Assets同級目錄下創(chuàng)建一個Editor的文件,然后在新建一個腳本文件
引用官方的話
//Create a folder (right click in the Assets folder and go to Create>Folder), and name it “Editor” if it doesn’t already exist
//Place this script in the Editor folder
要把這個腳本放到Editor文件里才能正確運(yùn)行 否則會報錯 提示命名空間不正確。
[MenuItem("我的工具/BulidBundle")]
static void BulidAssetBundle()
{
Debug.Log("Hello Use BulidAssetBundle");
string dirpath = "BundleResccc";
if (!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
BuildPipeline.BuildAssetBundles(dirpath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}

這樣我們的打包按鈕就加好了,只要點(diǎn)擊操作就會走這個靜態(tài)方法(BulidAssetBundle)進(jìn)行打包。
其中打包主要是調(diào)用了BulidPipeline.BuildAssetBundles這個方法。
BulidPipeline.BuildAssetBundles主要使用三個參數(shù)來完成打包:
第一個是打包后的包體存放路徑。
第二個是打包規(guī)則。
第三個是目標(biāo)操作系統(tǒng)。
第二個參數(shù)打包規(guī)則可以分為很多

//官方解釋地址
[https://docs.unity3d.com/ScriptReference/BuildAssetBundleOptions.html]
第三個參數(shù)是使用的目標(biāo)操作系統(tǒng)

下面還有很多沒有截圖全,有Android和ios。
那么assetBundle是如何在我們整個項(xiàng)目中區(qū)分什么資源需要打包的呢?
其實(shí)是通過標(biāo)簽來做到的

這樣打出來的bundle都是mod.player
2.查看我們打好的bundle
當(dāng)我們正確打包好bundle后會在制定好的路徑里看到我們打好的包

其中我們可以通過查看.manifest文件來得知里面包含了什么資源

3.加載我們已經(jīng)打好的bundle
3.1 使用本地文件加載的方式 AssetBundle.LoadFromFile
AssetBundle ab = AssetBundle.LoadFromFile("BundleResccc/mod.player");
GameObject obj = ab.LoadAsset<GameObject>("RPG-Character");
if (obj != null)
Instantiate(obj);
3.2 使用內(nèi)存加載的方式 AssetBundle.LoadFromMemory
AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("BundleResccc/mod.player"));
GameObject obj = ab.LoadAsset<GameObject>("RPG-Character");
if (obj != null)
Instantiate(obj);
3.3 使用內(nèi)存異步加載的方式 AssetBundle.LoadFromMemoryAsync
void Start()
{
PrepareBundle();
}
private async void PrepareBundle()
{
await ResLoadBundle();
AssetBundle ab = request.assetBundle;
GameObject obj = ab.LoadAsset<GameObject>("RPG-Character");
if (obj != null)
Instantiate(obj);
}
private static async Task ResLoadBundle()
{
request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes("BundleResccc/mod.player"));
Debug.Log("Load End");
}
4.卸載我們加載上游戲的bundle
AssetBundle.UnloadAllAssetBundles,當(dāng)我們設(shè)置為
AssetBundle.UnloadAllAssetBundles(true)的時候,就會把我們已經(jīng)引用的bundle的資源都卸載掉,
如果是false的話就保留引用部分。例如下圖:

