在Unity中使用AssetBundle

我们想要在游戏中动态的加载我们的资源,可以使用AssetBundle的方式或者是Resources.Load的方式。

那么如何使用AssetBundle呢

我们首先需要对我们的编辑器做一些小小的处理

1.在Unity中增加一个打bundle的操作按钮
在项目的Assets同级目录下创建一个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文件里才能正确运行 否则会报错 提示命名空间不正确。

[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

这样我们的打包按钮就加好了,只要点击操作就会走这个静态方法(BulidAssetBundle)进行打包。
其中打包主要是调用了BulidPipeline.BuildAssetBundles这个方法。
BulidPipeline.BuildAssetBundles主要使用三个参数来完成打包:
第一个是打包后的包体存放路径。
第二个是打包规则。
第三个是目标操作系统。

第二个参数打包规则可以分为很多

assetbundle2.png

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

第三个参数是使用的目标操作系统

assetbundle3.png

下面还有很多没有截图全,有Android和ios。

那么assetBundle是如何在我们整个项目中区分什么资源需要打包的呢?
其实是通过标签来做到的


Type
Type
Type

这样打出来的bundle都是mod.player

2.查看我们打好的bundle
当我们正确打包好bundle后会在制定好的路径里看到我们打好的包


assetbundle4.png

其中我们可以通过查看.manifest文件来得知里面包含了什么资源


assetbundle5.png

3.加载我们已经打好的bundle
3.1 使用本地文件加载的方式 AssetBundle.LoadFromFile

AssetBundle ab = AssetBundle.LoadFromFile("BundleResccc/mod.player");
GameObject obj = ab.LoadAsset("RPG-Character");
if (obj != null)
  Instantiate(obj);

3.2 使用内存加载的方式 AssetBundle.LoadFromMemory

AssetBundle ab = AssetBundle.LoadFromMemory(File.ReadAllBytes("BundleResccc/mod.player"));
GameObject obj = ab.LoadAsset("RPG-Character");
 if (obj != null)
   Instantiate(obj);

3.3 使用内存异步加载的方式 AssetBundle.LoadFromMemoryAsync

void Start()
{
    PrepareBundle();
}

private async void PrepareBundle()
{
     await ResLoadBundle();
     AssetBundle ab = request.assetBundle;
     GameObject obj = ab.LoadAsset("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,当我们设置为
AssetBundle.UnloadAllAssetBundles(true)的时候,就会把我们已经引用的bundle的资源都卸载掉,
如果是false的话就保留引用部分。例如下图:


设置为true的话
设置为false的话

你可能感兴趣的:(在Unity中使用AssetBundle)