AssetBundle

  • 基本概念和知识
  • 基本流程
  • 代码打包
  • 为 AssetBundle 分配资源
  • 本地资源加载与卸载


基本概念和知识

定义:

顾名思义,资源包,是Unity提供的一种以压缩格式打包后存储资源的集合。类似于压缩文件,可压缩资源包括:模型,贴图,预制体,音效,材质球等,唯独不能将C#代码打包进去。

作用:

1、可用于可下载内容(DLC),减小初始安装大小,加载针对最终用户平台优化的资源,以及减轻运行时内存压力。4

2、压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输。

3、存储位置,存储方式可以自定义,后期可以动态更新。

4、资源热更新

安装官方打包工具:

Window->packageManager->Asset Bundle Browser

assembly插件打包descriptors assetbundle打包工具_加载


Asset Bundle主要结构 根据官方文档描述,主要分为两种类型:

一个序列化文件:
包含分解为各个对象并写入此单个文件的资源。

资源文件:
某些资源(纹理和音频)单独存储的二进制数据块,允许 Unity 高效地在另一个线程上从磁盘加载它们。

基本流程

代码打包

为 AssetBundle 分配资源

1、从 Project 视图中选择要为捆绑包分配的资源

2、选中指定资源目标,分配 AssetBundle 和变体。

assembly插件打包descriptors assetbundle打包工具_加载_02

点击New创建,输入想要的名称,不区分大小写,大写默认转换为小写,第二个为后缀,后缀名可以随便取,但是不可以是某种特定的文件格式,如rar,jpg等等。

AssetBundle支持文件夹结构,使用“/”来划分文件夹,例如MyAssets/01就是在MyAssets文件夹下面创建一个01文件夹。

基本代码:
首先需要在Assets下创建一个Editor特殊文件夹并在文件夹内创建以下脚本文件。

using UnityEditor;
using System.IO;

public class CreateAssetBundles
{
    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string assetBundleDirectory = "Assets/AssetBundles";
        //检查路径是否存在不存在就创建
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory,
                                BuildAssetBundleOptions.None,
                                BuildTarget.StandaloneWindows64);
        //参数
        //1、要打包到的路径   Assets/AssetBundles
        //2、打包的设置       无
        //3、要打包到的平台   windows64位
    }
}


assembly插件打包descriptors assetbundle打包工具_加载_03

点击对应按钮即可打包

本地资源加载与卸载

1、创建空物体并创建相应脚本挂载到物体上。
2、创建脚本如下:

using UnityEngine;

public class LoadRes : MonoBehaviour
{
    void Start()
    {
        //从指定路径加载AssetBundle对象
      AssetBundle asset= AssetBundle.LoadFromFile("Assets/AssetBundles/turret.ab");
      GameObject turret= 
      asset.LoadAsset<GameObject>("Turret 1a"); //参数为之前创建AssetBundle的物体的名字
      Instantiate(turret);
    }
}

如果你忘记自己打包资源的名字,可以参考一下做法:

using UnityEngine;
public class CheckRes : MonoBehaviour
{
    void Start()
    {
        //从指定路径加载AssetBundle对象
      AssetBundle asset= AssetBundle.LoadFromFile("Assets/AssetBundles/turret.ab");
        //加载所有的资源
      Object[] objects = asset.LoadAllAssets<GameObject>();
        //遍历所有资源名称
        foreach (var item in objects)
        {
            Debug.Log(item.name);
        }
    }
}