1.什么是Assetbundle

1.1 AssetBundle(简称AB包)是一个资源压缩包,包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
1.2 AssetBundle自身保存着互相的依赖关系;
1.3 压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;
1.4 把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;

1.5 它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
1.6 serialized file 序列化:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)
1.7 resource files 源文件:某些二进制资源(图片、声音)被单独保存,方便快速加载,可以Editor上读取,方便查看
1.8 它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。

2.为什么要有Assetbundle

用压缩减少包大小,方便管理和加载。并且把资源用网络加载的形式下载下来,缩减了游戏包的体积。

3.如何使用Assetbundle,使用Assetbundle的不同方案比较

  1. 指定资源的AssetBundle属性
    (xxxa/xxx)这里xxxa会生成目录,名字为xxx。’/'可以用于目录划分,Remove UnUsed name 可以移除没有使用的属性名
  2. 构建AssetBundle包
  3. 上传AB包
  4. 加载AB包和包里面的资源

4.源码实现

使用编辑器扩展方法,将打包按钮Build AssetBundles放于Asset菜单下

using UnityEngine;
using UnityEditor;/// <summary>
/// 自动打包所有资源(设置了Assetbundle Name的资源)
/// </summary>
public class CreateAssetBundles : MonoBehaviour
{[MenuItem("AssetBundle/Build AssetBundles")]static void BuildAllAssetBundles(){BuildPipeline.BuildAssetBundles("Assets/AssetBundles", BuildAssetBundleOptions.ForceRebuildAssetBundle, BuildTarget.StandaloneWindows);}}

实际使用:

生成一个List,List中包含UnityEditor.AssetBundleBuild项,这些项包含要打包的资源的信息

资源地址和名称assetBundle名称variant名称等等。

再通过生成AssetBundle的核心方法BuildPipeline.BuildAssetBundles,以及List作为参数,把assetBundle生成到指定目录。

压缩方式

Build的路径(随意只要是在硬盘上都可以的)
BuildAssetBundleOptions
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。
注意:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。

依赖打包
将需要同时加载的资源放在同一个包里,各个包之间会保存相互依赖的信息

 AB的加载

在开发阶段将AB包放在本地,开发结束后再上传到服务器,本地下载会放在\Assets\StreamingAssets\目录

AB加载方式:

AssetBundle.LoadFromFile 从本地加载
AssetBundle.LoadFromMemory 从内存加载
WWW.LoadFromCacheOrDownload 下载后放在缓存中备用(该方法逐渐被弃用)
UnityWebRequest 从服务器下载

AssetBundle分组策略总结(重点)

决定如何将项目内的资产分配到 AssetBundle 是不容易的。光使用简单的规则,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle 中,但是这些方案都有明显的缺点:

AssetBundle 数量太少
会增加运行时内存使用
会增加加载时间
需要下载更多数据
有太多的 AssetBundle
会增加编译的时间
会加大开发的复杂性
会增加总的下载时间
关键之处的如何将对象分组到 AssetBundle 中。主要的策略有:

逻辑实体,对象类型,并行的内容
注意一个项目对于不同的内容分类可以将这些并且应该将这些策略混合地使用。比如一个项目可能需要将 UI 元素分组到不同平台的 AssetBundle 中,但是靠关卡或者场景来分组他们项目关联的内容。关于使用的策略,有一些好的指导去遵循:

1.相比不经常更新的内容,将经常更新的对象拆分到不同的 AssetBundle 中
2.将可能同时加载的对象分组到一起。比如模型和他的动画与纹理
3.如果一个对象被多个 AssetBundle 中的多个对象依赖,将它分配到单独的 AssetBundle 中
4.如果两个对象不太可能同时加载,比如一个纹理的高清和标清版本,可以将他们分配到不同的 AssetBundle 中
5.如果是同一个对象的不同导入设置或者数据的不同版本,考虑使用 AssetBundle 变体来替代
一旦遵循上面的指导,考虑将规定时间内小于 50% 能被加载的 AssetBundle 拆分。也可以考虑将一些小的 AssetBundle (资产数量小于 5 - 10 个) 合并。

逻辑实体分组
逻辑实体分组是一个通过项目功能来分组对象的策略。当采用这种策略时,应用不同部分会单独分组进不同的 AssetBundle 中。

例如:

一个 UI 屏幕中的所有纹理和布局数据打包在一起
一个角色的纹理、模型和动画打包在一起
被多个关卡共享的场景碎片的纹理和模型打包在一起
逻辑实体分组是最常用的 AssetBundle 策略,特别适用于:DLC (Downloadable Content)实体在应用生命周期内多处被用到
例如:

通用的角色或者基本 UI 元素
完全不依赖于平台或者性能设置的实体
逻辑实体分组的优点是不需要从新下载不变内容的情况下轻松的更新实体。这就是它为什么特别适合 DLC (Downloadable Content)的原因。这个策略也是内存效率最高的,因为应用只需要加载当前使用的实体的 AssetBundle。

尽管如此,这也是最难实现的策略,因为分配对象给 AssetBundle 的开发者必须精确地熟悉单个对象是怎么样和如何被项目使用的。

类型分组
类型分组是最简单的策略。在这个策略中,相似或者相同类型的对象被放置到同一个 AssetBundle 中。比如,将不同的音轨放置到同一个 AssetBundle 或者不同的语言文件放置到同一个 AssetBundle。

这个策略简单的同时,它却经常是在编译时,加载时和升级时最低效的。它最常用的对象需要同时升级的小文件,比如本地化文件。

比如这种结构:

并行内容分组
并行内容分组是将需要同时加载和使用内容分组到同一个 AssetBundle 的策略。这种策略最常用在具有较强本地属性的内容上,也就是说内容很少或者基本不可能在应用特定的位置或者时间外出现。举个例子,关卡游戏中没一关卡都独一无二的艺术呈现,角色和声效。

实现并行内容分组的最常用的方法是通过场景来构建 AssetBundle,每个 AssetBundle 包括了场景中的几乎所有的依赖。

对没有较强本地属性的项目,和在应用声明周期内很少出现的内容,应该通过逻辑实体策略来分组。这两种都是最大化使用 AssetBundle 内容的大体策略。

这个场景的一个例子就是,一个角色在世界中随机生成的开发世界游戏。这种情况中,很难预测交个角色会同时出现,所以他们一般需要使用不同的策略。

5.关键点,重要节点,疑难杂症场景

1.图集和打包策略(重点)

可以建一个excel表,在总体策略的基础上,规定细节的策略。

Assetbundle分包策略总结_钢与铁的博客-CSDN博客_assetbundle分包决定如何将项目内的资产分配到 AssetBundle 是不容易的。光使用简单的规则,比如将所有对象都放置到他们自己的 AssetBundle 中或者将所有对象都放到一个 AssetBundle 中,但是这些方案都有明显的缺点:AssetBundle 数量太少会增加运行时内存使用会增加加载时间需要下载更多数据有太多的 AssetBundle会增加编译的时间会加大...https://blog.csdn.net/qq_14914623/article/details/89394354【内存优化】图集整理策略 - 知乎前言 游戏开发,肯定会有一堆的图片,游戏运行时,unity会把小图整合到1张大图上,方便渲染合批,降低渲染消耗。 但是,随着游戏开发的进行,图片越来越多,我们总不能所有的图片都塞进这张大图里,那加载的时候,…https://zhuanlan.zhihu.com/p/90494264

2.文件校验(需要再来一篇?)

CRC、MD5、SHA1都是通过对数据进行计算,来生成一个校验值,该校验值用来校验数据的完整性。
CRC一般用于通信数据的校验,MD5和SHA1用于安全领域,例如文件校验,密码加密等。

3.AssetBundles浏览工具

GitHub下载地址

6.引用

Unity AssetBundle 从入门到掌握(适合初学者)_胖胖的橘猫君-CSDN博客_assetbundle

Unity5.X 新版AssetBundle使用方案及策略 - 凉城旧巷旧少年 - 博客园

unity游戏框架学习-AssetBundle - 柯腾_wjf - 博客园 (这篇最强)

Unity中的Assetbundle,Unity基础知识学习一相关推荐

  1. Unity中的MonoBehaviour脚本-基础知识和继承关系

    本文分享Unity中的MonoBehaviour脚本-基础知识和继承关系 作为一个程序员, 在Unity中开发, 我们接触最多的对象之里一定有MonoBehaviour, 所以作为Unity基础知识学 ...

  2. 【Unity】6.1 Unity中的C#脚本基础知识

    分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 1.常用的C#数据类型 这里简单介绍用Unity开发游戏时,最常用的一些数据类型. (1)基本类型 int.float. ...

  3. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  4. Linux-C基础知识学习:C语言作业-将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印。

    Linux基础知识学习 C语言作业:将5个学生成绩保存在一个数组中,单独实现一个计算平均成绩的average函数, 在main函数中获取该函数返回的平均值,并打印. #include <stdi ...

  5. 计算机二级二叉树基础知识,2017年计算机二级公共基础知识学习教程:树与二叉树...

    (六)树与二叉树 1.树的基本概念 树是一种简单的非线性结构.在树结构中,数据元素之间有着明显的层次结构.在树的图形表示中,用直线连接两端的结点,上端点为前件,下端点为后件. 在树结构中,每一个结点只 ...

  6. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  7. Python 基础知识学习笔记——OpenCV(1)

    Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...

  8. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  9. python基础知识学习笔记(2)

    python基础知识学习笔记(2) 整理一下python基础知识,以防忘记 文章目录 python基础知识学习笔记(2) python简洁的一行代码 python简洁的一行代码 1.交换两个变量 # ...

  10. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

最新文章

  1. 阿里云免费申请免费SSL证书
  2. select计数语句_从零开始学 MySQL SELECT 语句详解
  3. python按列输出字符_如何根据条件在Pandas中构建新列(新列应输出字符串)
  4. javascript学习系列(8):数组中的splice方法
  5. SecureCRT 中文乱码问题
  6. MaxCompute 实现增量数据推送(全量比对增量逻辑)
  7. ROS笔记(23) Move_base
  8. csv导入mysql phpmyadmin_关于mysql:使用phpMyAdmin导入大型csv文件
  9. 13 年 29 款手机,从激进到求稳,iPhone 都经历什么?
  10. MySQL redis如何实现_如何保障mysql和redis之间的数据一致性?(转发)
  11. 13_新闻客户端界面搭建
  12. 什么是分布式微服务架构?-开课吧
  13. LINUX运维之道_摘要
  14. 串口通信实例vb.net serialport
  15. 机器学习防止模型过拟合的方法知识汇总
  16. MFC中List控件
  17. 微信网页版打不开怎么办?这里有官方解决办法!
  18. 基于JAVA毕业生交流学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
  19. 【御剑问情】外网手工外网端+游戏后台
  20. 浅谈策略交易、系统交易和程式交易

热门文章

  1. html页面数学公式添加(附图)
  2. Gpower软件真不错
  3. 金蝶KIS旗舰版直接新增销售出库单使用说明,金蝶盘点机PDA仓库条码管理
  4. 求大佬解决0x00881340 处有未经处理的异常(在 ConsoleApplication1.exe 中): 0xC0000005: 写入位置 0x00993B8C 时发生访问冲突。
  5. 软件测试-----经常问道的面试题目
  6. Veritas Backup Exec 21 下载 百度网盘
  7. JS 中样式显示(clientWidth和clientHeight、offsetLeft、scrollHeight )
  8. 关于DiskFileUpload的杂谈
  9. sir模型初始值_经典传染病的SIR模型(基于MATLAB)
  10. 数据库连接池c3p0