在Unity中使用AssetBundle

我們想要在游戲中動態(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);
}
assetbundle1.png

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

第二個參數(shù)打包規(guī)則可以分為很多

assetbundle2.png

//官方解釋地址
[https://docs.unity3d.com/ScriptReference/BuildAssetBundleOptions.html]

第三個參數(shù)是使用的目標(biāo)操作系統(tǒng)

assetbundle3.png

下面還有很多沒有截圖全,有Android和ios。

那么assetBundle是如何在我們整個項(xiàng)目中區(qū)分什么資源需要打包的呢?
其實(shí)是通過標(biāo)簽來做到的


Type
Type
Type

這樣打出來的bundle都是mod.player

2.查看我們打好的bundle
當(dāng)我們正確打包好bundle后會在制定好的路徑里看到我們打好的包


assetbundle4.png

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


assetbundle5.png

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的話就保留引用部分。例如下圖:


設(shè)置為true的話
設(shè)置為false的話
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容