你知道的越多,你不知道的越多 🇨🇳🇨🇳🇨🇳
点赞再看,养成习惯,别忘了一键三连哦 👍👍👍
文章持续更新中 📝📝📝
0️⃣AssetBundle介绍🔥🔥🔥
AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。
AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。
AssetBundle 可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。
AssetBundle 中有什么?
“AssetBundle”可以指两种不同但相关的东西。
🚩首先是磁盘上的实际文件。这称为 AssetBundle 存档。AssetBundle 存档是一个容器,就像文件夹一样,可以在其中包含其他文件。这些附加的文件包含两种类型:
📢一个序列化文件,其中包含分解为各个对象并写入此单个文件的资源。
📢资源文件,这是为某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。
🚩“AssetBundle”也可以指代通过代码进行交互以便从特定 AssetBundle 存档加载资源的实际 AssetBundle 对象。该对象包含您添加到此存档文件的资源的所有文件路径的映射。
1️⃣热更打包测策略🔥🔥🔥
Unity已经支持了AB打包
创建编辑器工具脚本 CreateAssetBundle (放在Editor目录下)
创建打包方法BuildAssetBundle,资源相同的打包到一个包里面,打包策略
打包是框架支持,自动化的过程,ClearAll方法,防止误操作进行除错
按照资源目录设置相应的AB的,然后打包
设置
指定到打包目录Assets的AssetBundle目录下,
创建StreamingAssets/AssetBundle目录(条件),之前很多版本的热更丢到此目录,
大版本的版本需要从商店重新下载,之前版本在上面目录之中,就不需要再从资源服务器上进行大流量下载热更。
大版本更新还是需要强制。
🚩CreateBundle方法
🚩ClearAll方法:遍历ABLoacl目录下所有文件,对右下角AssetBundle名称进行置空,防止出错,
🚩AssetDataBase类
🚩按照ab名称会打包到一起,所以先置空,然后再重置
🚩目录设置小写
🚩CreateLuaBundler因为lua脚本内容较小,单独放在Asset/Lua中,设置ab名称lua
🚩CreateXXXBundle
🚩二级目录,二层循环,使用二级目录名AB名称,小写化
🚩打包进度的显示
🚩自动化打包,按照规划好的策略
编辑器工具
资源打包流程,运行环境的客户端运行项目通过UIGameLoading自动判断
确保资源在正确的目录,unity的突然卡顿会导致bug,检查将不需要的文件拖入其它文件夹,检测一级目录,二级目录
生成的文件在设置的目录项目下/AssetBundle
先执行ClearBundler
在一次执行其他的方法
打安卓包,安卓编辑环境,jdk等环境要准备好
字体:一般使用自定义字体,包体的优化!
assetlist文件
时间戳,名称+MD5加密信息+包大小+level值
压缩包,并传送到资源服务器,资源服务器就是一个托管所有的资源的服务器,类似nginx,linux资源服务器
完成简单的服务器访问
分工明确:由服务器端员工来操作上传操作
获取到资源服务器端的唯一的URL地址,IP地址
打包时间可能超过N小时
需要专属的打包服务器!远程去打开电脑,使用Unity去打包
2️⃣热更打包测策略🔥🔥🔥
打包策略和打包思想简述
1、创建编辑器工具脚本,自动化生成AB包
2、创建打包方法
3、设置MenuItem
打包方法
1、先清空
2、打包lua脚本
3、打包Sound、font、sprite、prefab、texture等等各类资源文件
4、生成资源各个依赖性列表
打包完成后
AB包再指定目录下,将其压缩,并上传到资源服务器当中,然后再解压
资源打包策略
1、资源划分目录
2、资源按照功能划分
3、公共资源划分
4、处理依赖关系
打包思想
1、同时加载的资源要放在一起
2、公共资源要打包再一起,独立资源单独打包
3、常跟新和非常更新的资源进行分离打包
4、合并较小的资源且需要同时加载的资源打包再一起
5、包过大,且不同时加载的资源可以拆分打包
6、依赖关系过于复杂的时候,进行分拆
7、字体shader等需要常驻内存的资源打包在一起
3️⃣Unity3D之AssetBundle资源加载封装 (转发)🔥🔥🔥
新书发售《Unity3D高级编程-主程手记》 —陆泽西
Unity3D之AssetBundle资源加载封装。在《临兵斗者三国志》中我使用了U3D的AssetBundle资源动态加载机制,原因是某些画面资源太多,IO阻塞过慢会造成游戏奔溃。在开发过程中,遇到点问题:
1.当资源更改变化时,如何能快速得反应到开发中。
解决方案:
我使用宏定义UNITY_EDITOR来判断是否是开发编辑状态。当处于开发编辑状态时,自动读取指定目录下U3D本身资源,而不使用AssetBundle。这样就达到了当prefb变化时能快速反应到开发编辑中。而当不是处于编辑状态时,则正常使用异步加载读取AssetBundle。这个方式唯一的毛病就是,必须让所有U3D程序员都非常清除明白,如果写错,编辑模式下会没问题,发布后会出问题,所以需要检查。
2.当不同资源之间有重复的资源时如何将AssetBundle空间占有量最小化。
解决方案:
GUI资源之间有特别多的重复的问题,挑出几个重复得特别厉害的,比如ICON图集,公用图集。在打包期间把他们设为共享资源,并在加载时首先加载共享资源,这样既节省了AssetBundle空间占有量,也节省了内存。这个方式的毛病是当你将资源更改要打包某个资源时,需要将所有与共享有关的资源重新打包一遍。
3.如何应对自动释放资源问题。
解决方案:
在游戏中有指定资源释放和自动释放所有AssetBundle资源以销毁内存(这里不是指销毁U3D内存,而是AssetBundle内存,U3D内存管理分图片内存,AssetBundle内存,编译程序)。销毁指定资源就按正常来没有争议。销毁所有资源就要有点措施了,因为有些资源是不能被销毁的,因为它们是共享资源,需要全程跟着游戏走,所以当自动销毁所有资源时,将共享资源排除在外。并且在销毁后调用Resources.UnloadUnusedAssets();和GC.Collect();
4.打包AssetBundle方式。
解决方案:
打包AssetBundle方式有几种:
1.单资源打包,也就是说一个.prefb或Texture打一个包。
2.多个资源打包,将某些资源都打成一个AssetBundle,节省了几个资源包之间的共享资源也减小了多个AssetBundle引起的空间扩大问题。但并不是说所有项目都是多个资源打成一个AssetBundle是好的。《临兵斗者三国志》就是一大部分使用单一打包,而共享资源使用多个资源打成一个AssetBundle的方式。
最后奉上陆泽西对AssetBundle封装的源码。
链接: github源码
转发请注明出自:http://www.luzexi.com
🎁🌻🌼🌸 粉丝福利来喽 🎁🌻🌼🌸
- 免费领取海量资源 🎁
简历自测评分表、Unity职级技能表、面试题库、入行学习路径等- 《Unity游戏开发五天集训营 》50个名额 🎁
我给大家争取到了 50个《游戏开发五天集训营 》名额,原价198,前50个免费
扫码加入,暗号小听歌
即可参加ARPG狼人战斗系统、饥荒生存类游戏开发、回合制RPG口袋妖怪游戏等游戏开发训练营- 额外抽奖机会🎁
参加游戏训练营、还有机会获得大厂老师在线面试指导、或者有机会获得价值1998元的《Unity极速入门与实战》课程