【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事

时间:2022-02-07 09:46:05

一、简介

  马三在公司大部分时间做的都是游戏业务逻辑和编辑器工具等相关工作,因此对Unity AssetBundle这块的知识点并不是很熟悉,自己也是有打算想了解并熟悉一下AssetBundle,掌握一下Unity资源管理方面的知识,因此有了这篇博客。

  我会在博客中整理出一些自己学习时收集到的一些比较好的AssetBundle学习资料,并且结合现在正在参与开发的商业项目随时写下一些自己的拙见。本篇博客权当是马三自己的笔记和一些杂谈,会不断地随时随地的更新一些内容。

二、收集整理的一些AssetBundle资料

1.Unity AssetBundle5讲系列

Unity5-ABSystem(一):AssetBundle原理

Unity5-ABSystem(二):AssetBundle导出

Unity5-ABSystem(三):AssetBundle加载

Unity5-ABSystem(四):AssetBundle依赖

Unity5-ABSystem(五):AssetBundle内存

2.慕容小匹夫系列

Unity3D 5.3 新版AssetBundle使用方案及策略

进击的AssetBundles和它的工具们

3.何三思译Unity AssetBundle官方文档系列

【Unity3D技术文档翻译】第1.0篇 AssetBundles

【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流

【Unity3D技术文档翻译】第1.2篇 为打包 AssetBundles 准备资产

【Unity3D技术文档翻译】第1.3篇 创建 AssetBundles

【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系

【Unity3D技术文档翻译】第1.5篇 本地使用 AssetBundles

【Unity3D技术文档翻译】第1.6篇 使用 AssetBundle Manager

【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新

【Unity3D技术文档翻译】第1.8篇 AssetBundles 问题及解决方法

【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)

4.Unity AssetBundle官方文档

AssetBundlesManual

A guide to AssetBundles and Resources

5.Unity Assetbundles官方说明系列

Unity5.4 Assetbundles官方说明一(AssetBundles打包详解)

Unity5.4 Assetbundles官方说明二(AssetBundle压缩与解压)

Unity5.4 Assetbundles官方说明三(AssetBundle资源包的内部结构)

Unity5.4 Assetbundles官方说明四(AssetBundles的下载和加载)

Unity5.4 Assetbundles官方说明五(从AssetBundles的加载和卸载资源对象)

Unity5.4 Assetbundles官方说明六(保留下载的AssetBundle)

Unity5.4 Assetbundles官方说明七(在AssetBundle中存储和加载二进制数据)

Unity5.4 Assetbundles官方说明八(数据安全方面的处理)

Unity5.4 Assetbundles官方说明九(资源包中包含脚本文件)

Unity5.4 Assetbundles官方说明十(官方疑难问题解答)

Unity5.4 Assetbundles十一:遇到的坑和整理的打包和加载流程(资源包更新的简易框架)

6.杂

Unity5 如何做资源管理和增量更新

Unity资源处理机制(Assets/WWW/AssetBundle/...)读取和加载资源方式详解

Unity3D中实现按资源名称自动化命名打包AssetBundle

Unity动态加载和内存管理(三合一)

Unity手游之路<十二>手游资源热更新策略探讨

Unity5 资源打包控制

Unity AssetBundle加载音频,无法播放音效并报错的坑

三、AssetBundle踩坑与经验集锦

  1、先说一个遇到的坑,当大量(几百个)AssetBundle加载的时候(可能是WWW加载的时候,也可能是AssetBundle.LoadAsset的时候),Android手机上会闪退。看崩溃log是多线程文件访问的时候崩溃了。解决方法是减少同时加载的AB数量(这个是纯逻辑控制),使用AssetBundle.LoadFromFile接口。

  2、打包AssetBundle使用LZ4压缩(BuildPipeline.BuildAssetBundles,第二个参数传递BuildAssetBundleOptions.ChunkBasedCompression),默认是LZMA压缩的,具有最高的压缩比。而替换为LZ4压缩,压缩比没有LZMA高,但是加载速度大幅提高。加载AssetBundle使用AssetBundle.LoadFromFile(Async),在Unity4的时候,只能使用WWW的接口来加载AB,因为CreateFromFile不支持压缩的AB。而Unity5的LoadFromFile是支持任意压缩格式的AB的。所以没有太大必要使用WWW了,而且这个接口像WWW.LoadFromCacheOrDownload接口一样,加载不压缩或者LZ4压缩格式的AB的时候是不会有额外的内存开销的。具体关于内存、加载速度的细节可以参考上面第三篇文章里面的介绍。

3、资源规划好一个独立的资源工程。规划好一系列的文件夹,在导入相应资源的时候自动通过AssetImporter设置好AB的名字。监测资源导入可以用AssetPostprocessor 。带动画的模型需要创建好prefab,而不带动画只是用于换装的模型可以直接导出,不需要创建prefab,因为这些模型我们只是取它的mesh数据。如果有打包图集,需要注意它和AB的匹配关系,举例来说,如果三张图片指定了同一个图集,而又分别指定了不同的AB名,则三个AB里面都包含了此图集(三张图片),这样就会造成严重的资源浪费。

4、AssetBundle.LoadFromFile接口在Android平台下也是可以直接访问StreamingAssets文件夹里面的内容的。5.4版本可以直接使用Application.streamingAssetsPath。而之前的版本需要使用 Application.dataPath + "!assets/" + filePath;  因为streamingAssetsPath带了jar://,这个是给WWW用的URL路径,而LoadFromFile接口需要的是实际路径(不带jar://也不带file://)。注意 !assets/ 这个地方叹号后面没有/。网上搜索到的各种写法都有,只有这个是正确的,注意此处细节。

四、项目工程地址

五、未完待续