1、定义和应用
- 它是一个存在于硬盘上的文件,可以称之为压缩包,这个压缩包可以认为是一个文件夹,里面包含了多个文件,这些文件可以分为两类:serialized file和resource files(序列化文件和源文件)
- AssetBundle是一个压缩包,包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
- 把下载内容放在AssetBundle里,可以减少安装包的大小。
2、使用流程
2.1、指定资源的AssetBundle属性
格式:左边是AssetBundle名字,默认是None,可以直接New一个新的名字,eg:scenes/grassland(这种写法可用于资源的分类),右面的是后缀,随意写就行。
AssetBundle分组策略 |
---|
把经常更新的资源放到一个单独的包里面 |
把需要同时加载的资源放到一个包里面 |
把其他包共享的资源放到一个单独的包里面 |
把一些需要同时加载的小资源打包成一个包 |
如果同一个资源有两个版本,可以考虑通过后缀来区分 |
2.2、构建AssetBundle包(使用代码打包AssetBundle)
在Assets目录下新建一个Editor特殊文件夹,在Editor文件夹下新建一个脚本,如下:
using System.IO;
using UnityEditor;
public class CreatAssetBundle
{
[MenuItem("MyTool/CreatAssetBundle")]
static void CreatAB()
{
string dir = "AssetBundles";
//判断路径是否存在
if (Directory.Exists(dir) == false)
{
//创建路径
Directory.CreateDirectory(dir);
}
//将所有指定AssetBundle标签的资源打包到dir目录下
//BuildAssetBundleOptions.None 默认使用LZMA的算法压缩,压缩的包更小,但加载时间更长。
BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
3、上传AB包
4、加载AB包和包里面的资源
4.1、本地加载
using UnityEngine;
public class LoadFileFromAssetBundel : MonoBehaviour
{
private string dirPlane;
// Start is called before the first frame update
void Start()
{
dirPlane = "AssetBundles/mymodel/plane.u3d";
AssetBundle loadPlane = AssetBundle.LoadFromFile(dirPlane);
//AssetBundle loadPlane = AssetBundle.LoadFromMemory(File.ReadAllBytes(dirPlane)); //从内存同步加载
//应用1
GameObject plane = loadPlane.LoadAsset<GameObject>("Plane");
Instantiate(plane);
//应用2 //遍历的物体标签和后缀要一样
//Object[] ob = ab.LoadAllAssets();
//foreach(Object o in ob)
//{
//Instantiate(o);
//}
}
}
4.2、内存加载
LoadFromMemory:同步加载;LoadFromMemoryAsync:异步加载
IEnumerator start()
{
dirModel = "AssetBundles/cap.u3d";
//从内存异步加载 同步加载见上
AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(dirModel));
yield return request;
AssetBundle loadModel = request.assetBundle;
GameObject model = loadModel.LoadAsset<GameObject>("Cap");
Instantiate(model);
}
4.3、服务器加载
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class LoadAssetBundles : MonoBehaviour
{
// Start is called before the first frame update
IEnumerator Start()
{
//使用UnityWebRequest获取本地的AssetBundle(获取服务器端的AssetBudle只需把uri路径更改就行了
string uri = @"file:///D:\UnityDocument\AssetBundleProject\AssetBundles\example/greenland.u3d";
UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(uri);
yield return request.SendWebRequest();
AssetBundle ab = DownloadHandlerAssetBundle.GetContent(request);
//使用里面的资源
GameObject go = ab.LoadAsset<GameObject>("land");
Instantiate(go);
}
}
附加:依赖打包:
以下图为例:两个prefab共用材质和贴图,将材质和贴图放到一个包,即名称:share,后缀u3d;prefab1和prefab2分别打一个包,即prefab1,u3d和prefab2,u3d。
using UnityEngine;
public class LoadFileFromAssetBundel : MonoBehaviour
{
private string dirModel; //模型路径
private string dirShare; //共享材质、贴图路径
// Start is called before the first frame update
void Start()
{
dirModel = "AssetBundles/cap.u3d";
dirShare = "AssetBundles/share.u3d";
//加载依赖文件
AssetBundle loadshare = AssetBundle.LoadFromFile(dirShare);
//加载模型文件
AssetBundle loadPlane = AssetBundle.LoadFromFile(dirModel);
//取得物体,并自动找到并添加依赖
Object[] obj = loadPlane.LoadAllAssets();
foreach (Object o in obj)
{
Instantiate(o);
}
}
}
5、搭建简单Server的服务器
1.需要NetBox2.exe以及创建一个index.html的文本文档。
2.准备好之后双击运行。
3.将创建的AssetBundles文件夹也拷到这个目录里来。
6、通过Manifest文件获取某个包的依赖
//通过Manifest文件得到greenland的所有依赖
AssetBundle manifestAb = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");
AssetBundleManifest manifest = manifestAb.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] strs = manifest.GetAllDependencies("cap.u3d");
foreach(string name in strs)
{
print(name);
AssetBundle.LoadFromFile("AssetBundles/" + name);
}
7、AssetBundle的卸载
- AssetBundle.Unload(true) 卸载所有资源,即使有资源被使用着
- AssetBundle.Unload(false) 卸载所有没有被使用的资源
- 通过Resources.UnloadUnusedAssets卸载个别资源,在确保不在使用的时候使用或场景切换的时候自动卸载
- AssetBundle的卸载的优缺点:减少内存的使用,但有可能导致丢失
8、文件校验
CRC MD5 SHA1
都是通过对数据进行计算,生成一个校验值,用来校验数据的完整性。(文件一样则校验值一样) |
---|
CRC 计算效率很高,MD5和 SHA1比较慢 |
CRC的安全性相较于MD5和SHA1较弱,SHA1安全性最高 |
CRC一般用作通信数据的校验,MD5和SHA1用于安全领域 |
9、AssetBundles浏览插件
下载地址:https://github.com/Unity-Technologies/AssetBundles-Browser
将"AssetBundles-Browser-master"文件夹下的"Editor"文件夹复制到unity "Assets"目录下。
它将在Window > AssetBundle Browser中创建一个新的菜单项。