【AssetBundle】Unity AssetBundle打包和资源加载解析

前言

AssetBundle是Unity加载的资源格式。游戏不管使用什么平台打包,AssetBundle都是必不可少的。
需要工具直接支持的话,请看这篇:【游戏框架】Unity资源管理和AssetBundle工具

为何选择AssetBundle

资源加载常用有几种模式:
1.直接使用IO进行加载,适合文本资源。
2.Resources类。将资源放置到名为Resources的文件夹下,就可以使用同名类进行加载。
3.AssetDatabase类。编辑器模式下,可以用原资源格式进行加载。
4.AssetBundle格式。任何平台下都能使用。

可以看出,AssetBundle的使用范围最广,是Unity推荐的资源格式。其他的方法通常是用于辅助加载。

AssetBundle在这里插入图片描述相关点

流程:AssetBundle相关资源 -> 如何打资源 -> 如何读取资源

#AssetBundle
从字面理解,AssetBundle是Asset(资源)Bundle(捆绑)。就是能将一个或多个资源放到一个对象中(压缩)。
那么就有一个问题了,如果压缩包里有一堆资源,而我想要指定某一个对象,要怎么才能找到呢?Unity提供的方案就是manifest(清单)。
AssetBundle和manifest是同时存在的。前者就是原资源的压缩包,后者就是索引表。

AssetBundle本身就是资源,用文本打开就是一堆字节。
例子:打包的字体资源
在这里插入图片描述

Manifest是Unity的配置文件,里面的信息我们则可以清楚了解。
重点关注Assets和Dependencies。CRC在做资源更新时会用上,资源加载这块用处不大就不展开讲了。
Asset是我们指定打包的资源,Dependencies是Unity检查出来的所有打包的资源的依赖文件。
在这里插入图片描述

在我们打包完毕后,除了指定的资源外,还会生成一个汇总资源。这个总清单会记录这次打包全部的资源和对应的依赖文件。
例子文件比较长,我就截部分出来。Name是AssetBundle的名字,Dependencies是依赖的文件。在加载资源时,需要先将依赖文件加载完毕才能加载指定资源。所以这个清单是很重要的文件,在加载时会详细解析。
在这里插入图片描述

Build

打包最重要的是打包策略。策略会影响包体大小。有一些渠道会对包体大小有所限制。
打包策略是指哪些资源需要独立打包,哪些资源需要集中打包。策略的制定一方面和业务的相关,一方面和加载相关。
最常见的是UI的预制体每一个独立打包,UI的图集每个图集独立打包,字体,音效和材质球各统一打包。
这个策略是会随着项目的发展而逐渐优化,一开始定个结构即可。

打包工具并不复杂,重点就是要判断资源有没有重复。
在选择输出的路径时,任何地址都可以。但是如果想要在编辑器模式下也能读取bundle,则需要将资源放一份到StreamingAssets文件夹下。
StreamingAssets文件夹是Unity的特殊路径,名字不能打错,是一个可读不可写的目录。通常用于加载bundle。

资源打包的时候可能会遇到各种各样的错误。通常问题都出在资源和编辑器脚本上。
资源的命名最好还是常规英文,不要用中文符号。
有种情况是编辑器写了Editor模式下的数据,unity将其序列化后该资源需要被打包。这种资源在以bundle的情况下加载是会崩的。解决办法就是不能存纯Editor平台可用的数据。

 //核心代码就这一行 生成资源
AssetBundleManifest manifest = BuildPipeline.BuildAssetBundles(m_OutputPath, builds, m_BuildAssetBundleOptions, m_BuildTarget);

Load

资源加载的步骤:1.加载AssetBunlde 2.加载bundle里面的Asset 3.实例化/转类型
加载AssetBundle的名字就是生成出来的AssetBundle的全名,Asset的名字是清单中Assets里面的全路径。输入时是需要带上后缀的,就是全路径名。
如清单那里举的例子,character预制体。反正这里怎么写,使用时就怎么填。
在这里插入图片描述
在这里插入图片描述

我们日常开发时通常不使用assetBundle,因为一旦改变了原资源就需要重新打一遍才能同步到最新。这时通常是会直接使用原文件。所以最好是支持编辑器模式下加载原资源。
为了方便开发测试,不管资源到底是读assetbundle,还是走编辑器,用户输入的名字一定都是一样的。所以遵循AssetBundle的模式进行输入。
AssetBundle模式下,首先加载全清单文件,得到依赖数据。然后在业务请求时,就能根据清单找到对应的bundle信息了。
编辑器模式下,加载AssetBundle打包的配置,知道哪个文件夹/文件是会被打包的。然后在业务请求时,找到文件夹,匹配一开始记录的文件夹信息,这样就可以找到资源了。

//bundle
1.AssetBundle.LoadFromFile<T>(AssetBundleName)
2.AssetBundle.LoadAsset<T>(AssetName)

// 编辑器
AssetDatabase.LoadAssetAtPath(ResourcePath)//不需要后缀

猜你喜欢

转载自blog.csdn.net/sinat_34870723/article/details/104610084