【从零开始游戏开发】Unity3D AssetBundle资源加载和封装 | 全面总结 | 建议收藏

你知道的越多,你不知道的越多 🇨🇳🇨🇳🇨🇳
点赞再看,养成习惯,别忘了一键三连哦 👍👍👍
文章持续更新中 📝📝📝

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


🎁🌻🌼🌸 粉丝福利来喽 🎁🌻🌼🌸

  1. 免费领取海量资源 🎁
    简历自测评分表、Unity职级技能表、面试题库、入行学习路径等
  2. 《Unity游戏开发五天集训营 》50个名额 🎁
    我给大家争取到了 50个《游戏开发五天集训营 》名额,原价198,前50个免费
    扫码加入,暗号小听歌
    即可参加ARPG狼人战斗系统、饥荒生存类游戏开发、回合制RPG口袋妖怪游戏等游戏开发训练营
  3. 额外抽奖机会🎁
    参加游戏训练营、还有机会获得大厂老师在线面试指导、或者有机会获得价值1998元的《Unity极速入门与实战》课程
🔻🔻🔻🔻 扫下方二维码,获取游戏开发福利,暗号小听歌 🔻🔻🔻🔻
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值