1,它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)
serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个),通常主观上不可见的,在unity使用的如Prefabs,Material....
resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载
2,它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
1,AssetBundle是一个压缩包包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载;
2,AssetBundle自身保存着互相的依赖关系;
3,压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输;4,把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小;
1,指定资源的AssetBundle属性
前者(xxxa/xxx)这里xxxa会生成文件夹,名字为xxx,后者为后缀名(无具体限制,但最后取有意义的后缀名)
2,构建AssetBundle包
2.1先创建脚本代码。
2.2点击生成AssetsBundle
在项目文件夹中会生成如下文件。
3,上传AB包(上传到本地)
4,加载AB包和包里面的资源(官方api中的4种)
4.1,AssetBundle.LoadFromMemoryAsync(从内存加载)
//首先通过File,读取本地资源并转化为2进制数组。
byte[] assetByte = File.ReadAllBytes("AssetsBundle/capsule.unity");
//2.1同步加载 从内存中加载2进制数组,加载AB.
AssetBundle ab = AssetBundle.LoadFromMemory(assetByte);
//2.2异步加载。返回一个Request,再通过request得到Assetbundle.
//AssetBundleCreateRequest request = AssetBundle.LoadFromMemoryAsync(assetByte);
//异步等待request 加载完成。(需要把方法标记为IEnumerable)
//yield return request;
//AssetBundle ab = request.assetBundle;
//GameObject go = ab.LoadAsset("Capsule");
//Instantiate(go);
4.2,AssetBundle.LoadFromFile(从本地加载)
//1.从本地加载AB AssetBundle.LoadFromFile("AssetsBundle/share.unity");
//AssetBundle ab = AssetBundle.LoadFromFile("AssetsBundle/capsule.unity");
//1.2异步加载本地AB,LoadFromFileAsync
//AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync("AssetsBundle/capsule.unity");
//yield return request;
//GameObject go = ab.LoadAsset("Capsule");
//Instantiate(go);
4.3,WWW.LoadFromCacheOrDownload(使用WWW类加载)
//判断caching是否准备好。
//while(Caching.ready == false){
//暂停一帧。
//yield return null;
//}
//url 格式为:@“file:// @“file:///
WWW从本地加载
//WWW www = WWW.LoadFromCacheOrDownload(@"file://D:\Users\Administrator\Documents\AssetBundle\AssetsBundle\capsule.unity",1);
////localhost 后跟AssetBundle资源的路径。
WWW服务器加载
//WWW www = WWW.LoadFromCacheOrDownload(@"http://localhost/AssetsBundle/capsule.unity", 1);
//yield return www; //判读是否有错误。 //if(string.IsNullOrEmpty(www.error) == false){ // Debug.Log(www.error); //// //有错误就停止协程。 // yield break; //} //AssetBundle ab = www.assetBundle;
//GameObject go = ab.LoadAsset("Capsule");
//Instantiate(go);
4.4,UnityWebRequest
//(从本地路径)string uri = @"file://D:\Users\Administrator\Documents\AssetBundle\AssetsBundle\capsule.unity";
//服务器下载路径。
string uri = @"http://localhost/AssetsBundle/capsule.unity";
UnityWebRequest webRequest = UnityWebRequest.GetAssetBundle(uri);
yield return webRequest.Send();
//4.1 DownloadHandlerAssetBundle获取assetbundle;
//AssetBundle ab = DownloadHandlerAssetBundle.GetContent(webRequest);
//4.2 webRequest.downloadHandler 获取DownloadHandlerAssetBundle 再得到assetbundle.
AssetBundle ab = (webRequest.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
//加载assetbundle中的具体资源。
GameObject go = ab.LoadAsset("Capsule");
Instantiate(go);