1.AssetBundle的定义
把一些可以下载的内容放在AssetBundle里面,可以减少安装包的大小
压缩包可以使用LZMA和LZ4压缩算法,减少包的大小,更快的进行网络传输
什么是AssetBundle?
可以称之为压缩包,里面压缩了多个文件。两类:serialized file and resource files
serialized file:资源被打碎放在一个对象中,最后被写进一个单独的文件
resource files:二进制资源被单独保存,方便快速加载
AssetBundle加载到内存的时候,他是一个AssetBundle对象。
2.AssetBundle的使用流程
指定资源的AssetBundle属性
构建AssetBundle包
上传AB包
加载AB包和包里面的资源
3.AssetBundle的打包
(1)在unity中将要打包的AssetBundle包的AssetBundle属性添加上标签,可以通过加上/来划分子目录 eg:scenes/wall ,就会先创建一个scenes文件夹
(2)创建打包的代码
AB打包只会在editor状态的时候进行,使用BuildPipeline中的BuildAssetBundles方法,在目标文件中创建AB文件
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string dir = "AssetBundles";
if (Directory.Exists(dir) == false)
{
Directory.CreateDirectory(dir);
}
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
(3)MenuItem特性让这个方法在Assets中生成
4.AssetBundle的加载和使用
使用AssetBundle类中的LoadFromFile方法,得到AssetBundle对象,加载ab对象中的资源得到GameObject,
实例化GameObject
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/wall.unity3d");
GameObject wallPrefab = ab.LoadAsset<GameObject>("Wall");
Instantiate(wallPrefab);
5.AssetBundle分组策略
逻辑实体分组
一个UI界面或者所有UI界面一个包,一个角色或者所有角色一个包,所有场景共享的部分(贴图和模型)一个包
按照类型分组
所有声音资源、shader打成一个包
按照使用分组
按照关卡分组
6.依赖打包
当不同物体用到同一材质时,将不同物体和材质一起打包,将大大减小整个ab包的大小
7.BuildAssetBundles的参数
(1)dir路径(硬盘上的路径)
(2)BuildAssetBundlesOptions.None:默认LAMA算法压缩,压缩的包更小,但是加载时间更长。需要整体解压,一旦被整体解压,这个包会使用LZ4重新压缩
BuildAssetBundlesOptions.UncompressedAssetBundle:不压缩、包大,加载快
BuildAssetBundlesOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是可以加载指定资源而不用全部解压。
(3)BuildTarget打包的平台
8.Manifest文件
BuildAsset会生成Manifest文件
CRC效验码,校验文件是否完整
Assets说明文件包含哪些资源
Dependencies依赖,当前ab文件依赖了那些包。一个资源有依赖,要先加载依赖
9.AssetBundles的使用
异步的方式读取ab包,从内存中读取
IEnumerator Start () {
string path = "AssetBundles/cube.unity3d";
//第一种加载AB的方式 异步的方式
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
yield return request;
AssetBundle ab = request.assetBundle;
GameObject test1 = ab.LoadAsset<GameObject>("Cube");
Instantiate(test1);
}
从文件中读取
!
10.WWW.LoadFromCacheOrDownload下载并加载AssetBundle
资源如果第一次获取,会先下载到本地,第二次再用就会从缓存直接加载。
file:// file:///才可以加载文件
IEnumerator Start () {
while (Caching.ready == false)
{
yield return null;
}
WWW www = WWW.LoadFromCacheOrDownload(@"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d", 1);
yield return www;
if(string.IsNullOrEmpty(www.error)==false)
{
Debug.Log(www.error);
yield break;
}
AssetBundle ab = www.assetBundle;
GameObject test1 = ab.LoadAsset<GameObject>("Cube");
Instantiate(test1);
}
11.搭建简单的Server服务器
NetBox2 会自动在当前目录下操作,你只要在当前目录下创建一个html,写上文本,你的localhost就会变成你写的东西
12.使用这句话访问远程服务器上的资源
WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetBundles/cube.unity3d", 1);
13.UnityWebRequest下载AssetBundle
异步的接收文件,通过UnityWebRequest中的方法得到UnityWebRequest对象,调用Send方法才会从服务器端下载,
下载完成之后,使用DownloadHandlerAssetBundle.GetContent取得内容
IEnumerator Start () {
//UnityWebRequest
string uri = @"file:///F:\unity project\AssetBundle\AssetBundles\cube.unity3d";
UnityWebRequest request = UnityWebRequest.GetAssetBundle(uri);
yield return request.Send();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
GameObject test1 = ab.LoadAsset<GameObject>("Cube");
Instantiate(test1);
}
14.从AssetBundl加载资源
获取AssetBundleManifest,这个文件中包括了所有的资源的依赖。
通过GetAllDependencies得到我们使用的资源的依赖,再加载资源所依赖的包。
AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] strs = manifest.GetAllDependencies("cube.unity3d");
foreach (string name in strs)
{
print(name);
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
15.AssetBundle的卸载
卸载:减少内存使用,但是卸载不当会导致材质丢失
Unload方法参数为false,只有当资源不被引用的使用才卸载,如果Unload参数为true,不管资源是否引用,都会卸载
一般在场景切换的时候进行AB包的卸载。
16.关于文件校验
CRC、MD5、SHA1
对数据进行计算,来生成一个校验值,用来检测数据的完整性。MD5、SHA1的安全性比较高
17.AssetBundles浏览工具
AssetBundles-Browser通过文档找到github,再releases中可以下载导入到Unity的Editor文件中,再Window菜单栏中就可以查看了。
这个工具可以查看项目中使用到AB包的地方,也可以通过工具进行AB包的打包