AssetBundle(AB)学习笔记

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中创建一个新的菜单项。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值