Unity5.4新版AssetBundle资源打包
(1)新版本 唯一打包API Buildpipeline.BuildAssetBundle
(2)在资源的Inpector界面最下方可设置该资源的assetbundleName,
每个assetbundleName对应一个Bundle,即assetbundleName相同的资源会打在一个Bundle中。
(3),我们还可以在Inpector中设置另一个名字,即variant(变体)。在打包时,variant会作为后缀添加在assetbundleName之后。(差异区分,例如相同名字的Normal和HD的区别)
AssetBundleName,名字固定为小写,每个AssetBundle都可以设置一个Variant,其实就是一个后缀,实际上AssetBundle会添加这个后缀。如果有不同分辨率的同名资源,可以使用这个来区分。
值得注意的是:
AssetBundleName是可以带’/’符号的,这是一个很好的设计,因为我们打包的资源会很多,如果打包生成的所有AssetBundle都生成在同一个文件目录里,这肯定是很难管理的。不过名称引入’/’便可以很好解决这个问题。我们通过名字中设置类似”npc/demon/jushiguai.unity3d”这样的名字。那么在生成AssetBundle的时候会自动根据名字生成文件目录。这样生成的AssetBundle有了分类就很好管理了。如下图:
关于Assetbundle 中的脚本,在移动平台下Assetbundle里面放的脚本是不会被执行的,我们打包前给两个Prefab挂上了脚本吗?在手机上将Assetbundle下载到本地后,加载进游戏中Prefab会自动在本地找它身上挂着的脚本,他是根据脚本的名来寻找,如果本地有这条脚本的话,Prefab会把这个脚本重新绑定在自身,并且会把打包前的参数传递进来。如果本地没有,身上挂的条脚本永远都不会被执行。
优化建议:
提供脚本批量对资源设置assetbundleName。
规划好assetBundle所对应的资源类型,规划好assetBundle的数量。
Unity3D引擎为我们提供了三种压缩策略来处理AssetBundle的压缩,即:
LZMA格式
LZ4格式
不压缩
LZMA格式:
在默认情况下,打包生成的AssetBundle都会被压缩。在U3D中,AssetBundle的标准压缩格式便是LZMA(LZMA是一种序列化流文件),因此在默认情况下,打出的AssetBundle包处于LZMA格式的压缩状态,在使用AssetBundle前需要先解压缩。
使用LZMA格式压缩的AssetBundle的包体积最小(高压缩比),但是相应的会增加解压缩时的时间。
LZ4格式:
Unity 5.3之后的版本增加了LZ4格式压缩,由于LZ4的压缩比一般,因此经过压缩后的AssetBundle包体的体积较大(该算法基于chunk)。但是,使用LZ4格式的好处在于解压缩的时间相对要短。
若要使用LZ4格式压缩,只需要在打包的时候开启BuildAssetBundleOptions.ChunkBasedCompression即可。
代码:
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression);
不压缩:
当然,我们也可以不对AssetBundle进行压缩。没有经过压缩的包体积最大,但是访问速度最快。
若要使用不压缩的策略,只需要在打包的时候开启BuildAssetBundleOptions.UncompressedAssetBundle即可。
代码:
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.UncompressedAssetBundle);
加载:
运行时加载AssetBundle对象主要可以分为两大类途径:
先获取WWW对象,再通过WWW.assetBundle获取AssetBundle对象
直接获取AssetBundle
下面我们就具体分析一下这两种途径:
先获取WWW对象,再通过WWW.assetBundle加载AssetBundle对象:
在先获取WWW对象,在获取AssetBundle的这种方式中,我们可以使用以下两个API来实现这个功能。
public WWW(string url),直接调用WWW类的构造函数,目标AssetBundle所在的路径作为其参数,构造WWW对象的过程中会加载Bundle文件并返回一个WWW对象,完成后会在内存中创建较大的WebStream(解压后的内容,通常为原Bundle文件的4~5倍大小,纹理资源比例可能更大),因此后续的AssetBundle.LoadAsset可以直接在内存中进行。(无论是服务器路径还是本地路径下载操作都一样)但是bundle只能保存在内存中,也就是退出游戏在进入还得重新下载:),显然我们实际开发中不会这样用。
public static WWW LoadFromCacheOrDownload(string url, int version, uint crc = 0),WWW类的一个静态方法,调用该方法同样会加载Bundle文件同时返回一个WWW对象,和上一个直接调用WWW的构造函数的区别在于该方法会将解压形式的Bundle内容存入磁盘中作为缓存(如果该Bundle已在缓存中,则省去这一步),完成后只会在内存中创建较小的SerializedFile,而后续的AssetBundle.LoadAsset需要通过IO从磁盘中的缓存获取。
直接加载AssetBundle对象:
在4.x时代,我们可以通过CreateFromFile或CreateFromMemory方法将磁盘上的文件或内存中的流构造成我们需要的AssetBundle对象。但是在5.x版本中,曾经的这两个方法已经被新的LoadFromFile、LoadFromMemory方法所代替(这两个方法还有异步的版本),且机制上也有了一些区别。
public static AssetBundle LoadFromFile(string path, uint crc = 0):新的从文件创建加载AssetBundle方法和4.x中的CreateFromFile方法在机制上有了一些分别,旧的CreateFromFile必须使用未压缩的Bundle文件才能在运行时动态创建AssetBundle对象。而新的LoadFromFile方法则没有这个要求,它支持上一节中提到的几个压缩格式,针对LZ压缩格式和未压缩的磁盘上的bundle文件,该方法会直接加载。针对使用默认的LZMA压缩格式压缩的bundle文件,该方法会在幕后先将bundle文件解压后再加载。这是最快的加载AssetBundle的方式。该方法是同步版本,还有异步版本:LoadFromFileAsync。
public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0):从内存中获取Bundle的二进制数据,同步地创建AssetBundle对象。该方法一般用在经过加密的数据上,经过加密的流数据经过解密之后我们可以调用该方法动态的创建AssetBundle对象。该方法是同步版本,还有异步版本:LoadFromMemoryAsync。
实际使用环境的分析:
(1) 随游戏一同发布的AssetBundle(一般位于StreamingAssets文件夹中):
在打AssetBundle包时,使用LZ4压缩格式进行打包(开启BuildAssetBundleOptions.ChunkBasedCompression即可)。
在运行时需要加载AssetBundle对象时,使用LoadFromFile方法进行加载。
这样做的好处是:即可以将AssetBundle文件压缩,又可以兼顾加载速度,且节约内存。
(2) 作为更新包,需要从服务端下载的AssetBundle:
在打AssetBundle包时,使用默认的LZMA格式压缩。
使用WWW.LoadFromCacheOrDownload方法下载并缓存AssetBundle包文件。
这样做的好处是:获得了最大的压缩率,在下载过程中可以减少数据传输量。同时,在本地磁盘创建缓存之后,又可以兼顾之后的加载速度,且节约内存。
(3) 进行加密的AssetBundle:
在打AssetBundle包时,使用LZ4压缩格式进行打包(开启BuildAssetBundleOptions.ChunkBasedCompression即可)。
在运行时需要加载AssetBundle对象时,使用LoadFromMemory方法进行加载。(这也是从内存中使用流数据加载AssetBundle对象的仅有的使用场景。)
(4)需要自己压缩的AssetBundle:
我们自己也可以使用第三方库或工具对生成的AssetBundle包文件进行压缩,如果需要这样做,则我们最好不要再使用Unity3D对AssetBundle进行压缩,因此在打包时选择开启BuildAssetBundleOptions.UncompressedAssetBundle。
在运行时需要加载AssetBundle对象时,使用LoadFromFileAsync方法进行异步加载。
资源加载:
新版的AssetBundle中,加载资源的API已经变成了以下的几个:
LoadAsset:从资源包中加载指定的资源
LoadAllAsset:加载当前资源包中所有的资源
LoadAssetAsync:从资源包中异步加载资源
卸载资源:
资源卸载部分的变化不大,使用的仍然是Unload方法。
Unload()
该方法会卸载运行时内存中包含在bundle中的所有资源。
当传入的参数为true,则不仅仅内存中的AssetBundle对象包含的资源会被销毁。根据这些资源实例化而来的游戏内的对象也会销毁。
当传入的参数为false,则仅仅销毁内存中的AssetBundle对象包含的资源。
其他:
新增打包模式
ForceRebuildAssetBundle : 强制重新打包所有AssetBundle文件,一般情况只做增量打包。
IgnoreTypeTreeChanges : 用于判断AssetBundle更新时,是否忽略TypeTree的变化。
AppendHashToAssetBundleName : 将Hash值添加在AB包文件名之后,开启后可通过文件名来判断哪些AB进行了更新。
依赖项相关:
虽然Unity说会帮我们处理好依赖关系,但是只是说能够方便获取一个asset的依赖项,并不会帮你自动加载所有依赖项。所以我们加载的代码还是三个部分:加载依赖项和加载自身,卸载依赖项。
Dependencies(资源依赖关系):当某个资源依赖其它AB 包中的文件时候,manifes(清单)文件中显示依赖关系。
Unity5.4新版AssetBundle资源打包的更多相关文章
- Unity5.X 新版AssetBundle打包控制
一.什么是AssetBundle 估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载出来用.那么AssetBund ...
- AssetBundle资源打包与加载
AssetBundle资源打包 1.AssetLabels资源标签 文件名:资源打包成AssetBundle后的文件名,类似于压缩包的名字 后缀:自定义 文件名和后缀名都是小写格式(大写会自动转为小 ...
- Unity5.X 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...
- Unity5自动命名Assetbundle并打包
http://www.shihuanjue.com/?p=57 using UnityEngine; using System.Collections; using UnityEditor; usin ...
- 17 Resources AssetBundle资源打包
Resources在Unity中可以使用www类加载远程文件或本地文件,或是在脚本中定义字段或数组从外部拖入. 在Unity中提供了Resources类读取资源要通过Resources类读取的文件必须 ...
- unity-------------------Unity5.X 新版AssetBundle使用方案及策略
Unity5.X 新版AssetBundle使用方案及策略 1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使 ...
- Unity中AB资源打包简单的脚本
脚本应该放在Editor文件夹下 using System.Collections; using System.Collections.Generic; using UnityEngine; usin ...
- Unity5.x版本AssetBundle打包研究
Unity5的AssetBundle打包机制和以前版本不太一样.简单的说就是,只要给你要打包的资源设置一个AssetBundleName ,Unity自身会对这些设置了名字的资源进行打包,如果一个资源 ...
- Unity资源打包学习笔记(一)、详解AssetBundle的流程
转载请标明出处:http://www.cnblogs.com/zblade/ 本文参照unity官网上对于assetBundle的一系列讲解,主要针对assetbundle的知识点做一个梳理笔记,也为 ...
随机推荐
- 按“块”的方式写dom以及代码注释
前言 首先这个文档中主要记述了自己在编写html代码时如何构建良好的dom结构的一些所思所想,在这一部分主要说明按“块”构建dom结构的思路.同时在这篇文档中也记述了自己对代码注释的理解,在这一部分主 ...
- oracle 存储过程实现数据CURD操作
1.创建数据库表: -- Create table create table TEST_TABLE ( userid NUMBER not null, username NVARCHAR2(50), ...
- iOS Emoji
iOS Emoji 前言:我比较喜欢有趣的东西,有一些有趣的小东西,可能不是多么多么牛逼,也可能不需要多高深的技巧,也不会为其他什么强大的功能而服务,但是有时候将很多有趣的小东西组合起来运用,比如在你 ...
- Oracle PLSQL Demo - 08.定义显式游标[Define CURSOR, Open, Fetch, Close CURSOR]
declare v_empno scott.emp.empno%type; v_sal scott.emp.sal%type; cursor cur_emp is select t.empno, t. ...
- c++之五谷杂粮---3
3.1如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载函数. 3.1.1不允许两个函数除了返回类型外所有的要素都相同.(这也是很好解释的) #include<iostream&g ...
- linux查找系统中占用磁盘空间最大的文件
Q:下午有一客户磁盘空间占用很大,使用df查看磁盘剩余空间很小了,客户想知道是哪些文件占满了文件. Q1:在Linux下如何查看系统占用磁盘空间最大的文件? Q2:在Linux下如何让文件夹下的文件让 ...
- vim同时打开多个文件进行编辑
在A文件中用:tabedit B 就打开了B文件,然后用gt来切换进入A 或B文件中: 如果打开多个,就用 1gt ,2gt来切换至不同的文件:返回上一个文件用gT
- 也来看看hadoop的WordCount
其实这个例子都是书上的,我也只是拿过来理解学习下. WordCount是Hadoop中的Hello, world,这是我听得最多的一个表述. 下面是WordCount.java的源码 package ...
- mysql合并查询结果及为表和字段取别名
利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...
- JSON对应的maven依赖包
常用有三种json解析jackson.fastjson.gson. jackson依赖包 <!-- https://mvnrepository.com/artifact/com.fasterxm ...