一、AssetBundle的定义和作用
1、AssetBundle是一个压缩包,这个包包含模型、贴图、预制体、声音、甚至是整个场景,可以再游戏运行的时候被加载。
2、AssetBundle自身保存着互相的依赖关系。比如,一个包保存模型的,另一个包保存贴图的,那模型就有可能依赖于贴图。
3、压缩包可以使用LZMA和LZ4压缩算法,减少包大小,这样可以更快的进行网络传输(游戏内的资源跟新)。
4、把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小。
二、什么是AssetBundle
可以归为两点:
1、它是一个存在于硬盘上的文件,可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file和resource files(序列化文件和源文件)。
serialized file:资源被打碎放在一个对象中,最后统一呗写进一个单独的文件(只有一个)。只有在unity场景,被实例化出来才能看到。
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载。
2、它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象,这个对象包含了所有我们当初添加到这个压缩包里面的内容。我们可以把这个对象加载出来使用。
三、AssetBundle使用流程
1、指定资源的AssetBundle属性
2、构建AssetBundle包
3、上传AB(服务器)
4、加载AB包和包里面的资源
注意:不要把这个AB包直接放到apk里面,这样会导致包很大,影响用户的安装和体验,没办法更新资源。
using UnityEditor;
using System.IO;
public class CreatAssetBundles {
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
//文件夹路径
string path = "Assets/AssetBundles";
//是否存在这个文件
if (!Directory.Exists(path))
{
//创建该文件夹
Directory.CreateDirectory(path);
}
//打ab包
//参数1:路径;
//参数2:压缩方式
/*BuildAssetBundleOptions.None
* 使用LAMA算法压缩,压缩的包更小,但是加载时间长。
* 使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。
* 使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,他会使用LZ4算法保存到本地
*/
//BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
/*BuildAssetBundleOptions.ChunkBasedCompression
使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部
可以获得跟不压缩相媲美的加载速度,而且比不压缩文件要小
*/
//参数3:要使用的平台
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadFromFileLocal : MonoBehaviour {
//从本地加载ab资源
void Start ()
{
//在使用资源的时候要先把它所依赖的一些资源加载出来,这样才不会导致材质丢失
AssetBundle ab_share = AssetBundle.LoadFromFile("Assets/AssetBundles/share.lanyue");
AssetBundle ab = AssetBundle.LoadFromFile("Assets/AssetBundles/cubewall1.lanyue");
if (ab == null)
{
Debug.LogError("Failed to load AssetBundle!");
return;
}
//加载这个预制
GameObject prefab = ab.LoadAsset<GameObject>("cubewall1");
//实例化生成这个预制
Instantiate(prefab);
}
}
三种压缩方式的结果: