一、AssetBundle概述
用处:用于压缩包括model,texture,material,prefabs,甚至整个scene的资源,在游戏运行时再加载出来
AssetBundle(简称AB)打包特点:
1.保存资源之间相互依赖的关系
2.AB压缩算法分为:LZMA算法和LZ4算法,也可以不压缩
3.可以把下载内容放到AB包中,减少安装包的大小
二、AB打包使用流程:
1.在Unity中指定资源的AB属性
2.编写代码通过Editor Scripts构建AB包(搜索资源是否带有AB标签)
3.上传AB包(服务器)
4.加载AB包
5.通过AB包获取包里面的内容
三、使用代码构建AB包
编写BuildAB.cs完成AB包的构建,代码如下
using System.IO;
using UnityEditor;
public class BuildAB
{
[MenuItem("Asset/Build AB")]//在菜单栏中创建函数入口
static void BuildAllAssetBundles()
{
//判断路径是否存在,system.id命名空间
string dir = "AssetBundles";
if(Directory.Exists(dir)==false)
{
Directory.CreateDirectory(dir);
}
//参数分别为1.path 2.压缩选项 3.目标平台
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneOSX);
}
}
注意:构建AB包的脚本属于编辑器脚本,该脚本引用UnityEditor命名空间,必须放置在Editor/目录下,否则会出现"‘UnityEditor’ can not found"的Error
构建成功后目录下多出一个AssetBundle文件夹,文件夹下的路径根据AB标签以及后缀生成次级目录以及后缀名
四、使用AB包中的内容
当我们的AB包已经下载至本机时,通过代码获得AB包并对其操作,代码如下:
public class LoadAB : MonoBehaviour {
void Start () {
AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/prefabs/capsule.yes");//加载AB时,路径是定义的标签名
GameObject capsulePrefab = ab.LoadAsset<GameObject>("Capsule");//加载GameObject时name是prefab的名字
//对获得到的对象操作
Instantiate(capsulePrefab);
}
}
获取所有资源:
object[] objs = ab.LoadAllAssets();
foreach(object o in objs)
{
Debug.Log(o);
}
五、通过服务器下载AB包
public class LoadAB : MonoBehaviour {
IEnumerable Start () {
string uri = @"127.0.0.1/AssetBundles/capsule.yes";//指定服务器地址
UnityWebRequest unityWebRequest = UnityWebRequest.GetAssetBundle(uri);//引用UnityEngine.Networking
yield return unityWebRequest.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(unityWebRequest);
}
}
六、AB包的卸载
卸载有两点需要注意:
1.能够减少内存的使用
2.对卸载不进行规划的话可能造成丢失(依赖)
ab.Unload(true);//卸载所有资源
ab.Unload(false);//卸载未被使用的资源
七、Manifest文件的信息
构建AB包完成后,主要目录下生成一个主要的manifest文件,包含了该AB包的所有资源以及信息以及它们的依赖
而相同AB标签的物品中也能生成一个manifest,包含了该物品自身的依赖
manifest都包含CRC校验码用于校验文件是否完整