【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)//不需要后缀
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AssetBundle 引用计数是指在使用 AssetBundle 打包资源的时候,记录每个 AssetBundle 被使用的次数,以便在使用完后及时释放资源,从而避免内存泄漏。在使用 AssetBundle 加载资源时,会对加载的 AssetBundle 进行引用计数的增加,使用完后再进行引用计数的减少,当引用计数为 0 时,就可以释放该 AssetBundle资源。 AssetBundle打包加载一般分为以下几个步骤: 1. 打包资源文件:使用 Unity Editor 自带的 AssetBundle 打包工具,将需要打包资源文件进行打包,生成 AssetBundle 文件。 2. 加载 AssetBundle 文件:在游戏运行时,使用 Unity 提供的 AssetBundle.LoadFromFile 或 AssetBundle.LoadFromMemory 函数来加载 AssetBundle 文件。 3. 加载资源文件:使用加载的 AssetBundle,使用 AssetBundle.LoadAsset 或 AssetBundle.LoadAssetAsync 函数加载需要使用的资源文件。 4. 使用完成后,释放资源:使用 AssetBundle.Unload(false) 函数来释放 AssetBundle 中的资源,同时进行引用计数的减少。如果不再需要该 AssetBundle 中的任何资源,可以使用 AssetBundle.Unload(true) 函数来彻底释放该 AssetBundle,包括清除 AssetBundle 的缓存。 使用 AssetBundle 打包加载资源可以有效地减少应用程序的内存占用,提高应用程序的性能。同时,在使用 AssetBundle 的时候,需要注意避免重复加载同一个 AssetBundle,以及及时释放不再使用的 AssetBundle 资源,避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值