在Unity中使用AssetBundle

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Unity中使用AssetBundle相关的知识,希望对你有一定的参考价值。

参考技术A 我们想要在游戏中动态的加载我们的资源,可以使用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文件里才能正确运行 否则会报错 提示命名空间不正确。

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

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

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

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

下面还有很多没有截图全,有androidios

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

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

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

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

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

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

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

4.卸载我们加载上游戏的bundle
AssetBundle.UnloadAllAssetBundles,当我们设置为
AssetBundle.UnloadAllAssetBundles(true)的时候,就会把我们已经引用的bundle的资源都卸载掉,
如果是false的话就保留引用部分。例如下图:

unity3d开发2d游戏中Assetbundle有啥作用

在unity3d开发2d游戏中,Assetbundle 是Unity Pro提供提供的功能,它可以把多个游戏对象或者资源二进制文件封装到Assetbundle中,提供了封装与解包的方法使用起来很便利。在如下几个方面的作用明显:
  1.预设
  Assetbundle可以将Prefab封装起来,这是多么方便啊! 而且我也强烈建议大家将Prefab封装成Assetbundle,因为Prefab可以将游戏对象身上带的游戏游戏组件、游戏脚本、材质都封装在一起。当从服务器上将Assetbundle下载以后直接Instantiate就可以放入游戏中。
  试想一下,如果只能将原始的二进制资源文件放在服务器上下载,当资源文件下载完毕后,需要动态的创建游戏对象、然后动态的将脚本绑定在游戏对象、动态的将贴图赋予游戏对象等等各种动态的操作。。所以强烈建议使用Prefa,不解释!!!!!
  另外,我在举个例子,因为模型有可能会带很多动画文件,那么这样一组模型资源就可能是多个FBX 文件 和 若干png贴图文件 材质文件。这时我只需要把原始模型放入Prefab中,它就会包含这个模型的所有组件、甚至包括它的动画资源、贴图。那么如下图所示,Mode就是模型的Prefab文件,那么我仅仅只需要把Mode这个预设打包成Assetbundle即可。 当我在服务器上下载这个Assetbundle并且载入游戏中就可以直接使用了,切换动画、换贴图都可以。。
  2.二进制文件
  也并不是Assetbundle中全都要用预设,Assetbundle它也可以将二进制文件直接封装在里面,比如图片、声音、文本信息等等。
  3.场景文件
  在Unity中可以将一个场景保存在Scene中,Scene就会包含这个场景中的所有,那能不能把Scene也封装成Assetbundle中?答案是能,但是它不能在移动平台上用,因为移动平台上是不能更新脚本的,换句话来说就是即使将脚本绑定在Prefab中,然后下载Assetbundle后,所有脚本是不会执行的,后面说另外一种巧妙用法。
  4.移动平台
  上面MOMO已经将Assetbundle 的使用原理大致介绍了一下 ,我们在谈谈移动平台。脚本不能更新是移动平台下最大的伤,这就意味着开发者无法绕过App store和 google Play这种在线商店升级应用程序。唯一能做到的就是更新资源、举个例子,游戏中在处理版本升级时,一般会有个大版本号和一个小版本号,大版本号就是 2.0、3.0这种 版本需要在AppStore中更新,大版本主要是升级游戏脚本,然后当小版本号,比如2.0.1 或2.0.2这种只是更新游戏中的资源,通过自己游戏的服务器就可以完成,通过Assetbundle在自己服务器上下载,然后适应在游戏中。如果非要更新脚本,或不得不更新脚本那么只能在Appstore或者google Play去更新大版本。
  移动平台上不能更新脚本,那么Prefab上绑定的脚本怎么办?在任何平台上都可以把脚本添加到Prefab上,然后打包成Assetbundle,只有移动平台上有点特殊,比如将Test.cs这条脚本绑定在Prefab中,最后程序通过服务器下载这个Assetbundle ,当载入工程中这条脚本是不会被执行的。
  但是如果本地工程有Test.cs这条脚本,那么Unity会自动将这条脚本绑定在下载的Prefab中,并且他们执行的非常好。如果本地工程中没有Test.cs这条脚本,那么Prefab上的脚本是永远都不会执行的。有时我们会在脚本中写一些Public的变量,有可能不同的Prefab上绑定的是相同的脚本,只是Inspector 脚本中的public参数不同。别担心这一点Assetbundle 中的Prefab也是没问题,所以说只要大版本中的脚本没问题,在小版本中只更新游戏资源是一点问题都么有的。
  5.移动优化
  之前我们说过可以将游戏中的某个游戏对象封装成Assetbundle,也可以将游戏中的整个场景也封装成Assetbundle。但是我认为需要巧妙的使用封装场景,因为场景中肯定有很多公用的模型,如果打包场景的话那么内存与size就是 公用模型的size * N个场景,想想其实挺恐怖的。其实我们可以巧妙的使用,首先把场景中公用的部分和私有的部分统统放入Unity, 然后烘培整个场景。 当场景烘培完毕后把公用的模型部分在拿出去,场景只只保留私有的模型。还可以做一个工具将公用模型在场景中的坐标保存在XML中(每个场景文件会对应一个公用模型的XML信息),最后在将公用的模型分别封装在别的Assetbundle中。
  服务器上提供每个场景的Assetbundle ,和公用模型的Assetbundle,一般公用模型的Assetbundle可以放在常驻内存中(可能使用频繁、根据项目的不同而定)场景Assetbundle下载完毕后,现载入场景然后在根据场景对应的XML信息将公用模型部分动态的在添加到场景中,这样就完成了一个场景的构建。
参考技术A 打包成Assetbundle的资源,可以输出windows,iphone,Androd等模式。

以上是关于在Unity中使用AssetBundle的主要内容,如果未能解决你的问题,请参考以下文章

在 Unity 5 中使用 .NET 4.5 代码

在 Unity 中使用资源文件夹

快速上手Unity原生Json库

unity中协程函数没有错误为啥会报错

在Unity中将Unity生成的代码与Objective-C混合使用?

在 Unity 中使用 Android Studio 上的类