深入Unity实际开发中,AssetBundle打包加载使用

1.本文实例操作在Unity5.x中资源打ab包。

2.其他的不多介绍,新建工程创建好工程目录,这里我建立一个uia的模块,还有其对应用到的美术资源目录。aUI是一个ui预制,其引用了美术uia目录中的资源。
 


3.实际开发中,我们也可以根据功能模块来按上面这样分目录结构,比较清晰。进入正题现在开始对uia的预制进行打ab包,打包代码如下:
 


4.打包菜单触发后,我们可以看到输出目录StreamingAssets下新增的数据文件,如下图:
 


首先打包之后根目录也会生成一个同目录名的ab包,其中的manifest作用就是供开发人员查看ab中的依赖关系等信息,加载根目录这个ab,可以得到一个AssetBundleManifest 对象如下图,然后就可以通过这个对象得到ab直接的依赖关系。
 


5.查看ab包大小,后面会有比较。
 


6.加载ab包,并实例化aUI的预制,显示出来如下图:
 


加载可以从本地也可以从cdn上加载ab包,下面是本地的示例代码:
 


注意:

一.加载完记得Unload,或者字典存起来,按已所需。

二.以上删除掉Extra Resources目录下uia里的美术资源,同样可正常显示,二手游戏账号拍卖平台因为aUI预制在打包时其引用的资源也打包进去了。由于未对资源设置packing tag,如果在多个预制用到了同一份贴图资源,这种情况贴图会和预制分别被打包到多个ab,会造成内存空间浪费。

三.在实际开发中我们会给贴图设置好packing tag,使其打包到一个包,然后预制再分别打包,这样预制体打包会减小空间。这样我们每次使用的话要先加载其依赖资源,再加载实例化。

7.对资源设置packing tag,再打ab包。


上图操作可在导入资源后脚本来自动化完成,详细可参考AssetPostprocessor。

新打包出来的由593KB变成了157KB,打包的预制体减小了空间。如下图:
 


8.实际开发中,可能我们的aui模块里的aUI预制、bui模块里的bUI预制等等都引用了相同一份资源,这样我们提出一个公共目录,用来放这些被多个引用的资源,打包的时候会先把这个公共目录打包,新版Unity会自动处理好依赖关系,接下来过程里我们会说明。具体目录结构如下图:
 


9.修改aUI预制,使其引用一个公共目录common里的黄色按钮资源,如下图:
 


10.修改打ab包脚本,增加对公共目录common里的资源打包处理。上面有贴了预制打包的代码,这里节省篇幅不再贴了原理一样,主要就是遍历该目录,将文件名记录到数组,设置好assetNames,assetBundleName即可。执行脚本,我们将会看到如下图:
 


以上其实我们就已经完成了依赖包的自动处理过程了,为了能更清晰的展现,这里将根目录的manifest贴出如下图:
 


以上内容表示我们上面成功输出有两个ab包,common_res和ui_aui,其中依赖关系清晰可见,ui_aui依赖了公共包common_res,因为我们aUI预制引用了公共包的资源。这里就是Unity新版打ab包的好处,你不用在麻烦的用Push/Pop维持一个依赖的堆栈。

11.上面都已经准备好了,那么继续通过第6步骤的加载过程,我们可以看到效果如下图:
 


我们先获得ui/ui_aui的依赖,然后加载其依赖包common_res,在加载包ui_aui,

在实例化预制体即上图显示效果。整个流程日志输出如下:
 


以上动动手,带你深入Unity实际开发中,资源目录结构的整理,资源的打ab包,ab包依赖关系的处理,ab包加载使用,欢迎阅读指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值