Unity 5.x中的AssetBundle(一)

接触了下AssetBundle,恩,记录下学习心得吧。
官方文档:https://docs.unity3d.com/Manual/AssetBundlesIntro.html


一、为AssetBundle起名字,并打包

官方的图,在Inspector检查器窗口的底部是AssetBundle菜单,从第一个下拉框中选择或设置AssetBundle的名称,第二个下拉框是附加选项,来定义一个Variant, AssetBundle名称可以使用“/”符号进行分级,便于管理。
这里写图片描述

或者可以在代码中定义AssetBundle的名称和Variant,代码如下:

    [MenuItem("Tool/SetBundleName")]
    static void SetBundleName()
    {
        Object[] selects = Selection.objects;

        foreach (var select in selects)
        {
            string path = AssetDatabase.GetAssetPath(select);
            AssetImporter importer = AssetImporter.GetAtPath(path);
            importer.assetBundleName = select.name;
            importer.assetBundleVariant = "unity3d";
            importer.SaveAndReimport();
        }

        AssetDatabase.Refresh();
    }

AssetBundle名称设置好了,就可以进行打包操作了,来看看代码:

    [MenuItem("Tool/Build AssetBundle")]
    static void BuildAssetBundles()
    {
        string path = Application.dataPath + "/StreamingAssets";

        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);

        BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);

        AssetDatabase.Refresh();
    }

代码很简单,唯一API:
public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform);
outputPath,打包输出路径。
assetBundleOptions,打包参数,详细介绍
targetPlatform,打包平台。


Manifest文件说明
简单的说,unity打包时,会为每个文件创建一个.Unity3D文件和.manifest文件。其中.unity3d文件包含了被打包的资源,.manifest文件记录该资源的依赖关系。然后所有.manifest文件汇总到一个总的依赖文件中,在游戏最开始运行的时候需要加载这个总的依赖文件,然后加载assetbundle的时候,从中获取到依赖关系来加载依赖。在操作中,实际操作的还是.unity3d文件,而.manifest文件主要的作用就是查看依赖关系。我们可以使用任何文本编辑器打开Manifest文件,查看相关信息。


AssetBundle编辑工具:

using UnityEngine;
using UnityEditor;

public class MyPostprocessor : AssetPostprocessor 
{
    public void OnPostprocessAssetbundleNameChanged(string assetPath, string previousAssetBundleName, string newAssetBundleName)
    {
        Debug.Log("Asset " + assetPath + " has been moved from assetBundle " + previousAssetBundleName +
                  " to assetBundle " + newAssetBundleName);
    }
}

使用AssetPostprocessor类定义的函数OnPostprocessAssetbundleNameChanged回调,当AssetBundle的名称发生变化时,编辑器会自动执行以下函数,返回变化信息。


在AssetDatabase资源库中操作AssetBundle相关API:

AssetDatabase.GetAllAssetBundleNames
public static string[] GetAllAssetBundleNames();
返回所有AssetBundle名称。

    [MenuItem("Tool/Get AssetBundle names")]
    static void GetNames()
    {
        var names = AssetDatabase.GetAllAssetBundleNames();
        foreach (var name in names)
        {
            Debug.LogError(name);
        }
    }

AssetDatabase.GetAssetPathsFromAssetBundle
public static string[] GetAssetPathsFromAssetBundle(string assetBundleName);
返回名称为assetBundleName的所有资源路径。

    [MenuItem("Tool/GetAssetPathsFromAssetBundle")]
    static void GetAssetPathsFromAssetBundle()
    {
        var paths = AssetDatabase.GetAssetPathsFromAssetBundle("a.unity3d");
        foreach (var path in paths)
        {
            Debug.Log(path);
        }
    }

AssetDatabase.RemoveAssetBundleName
public static bool RemoveAssetBundleName(string assetBundleName, bool forceRemove);
移除名称为assetBundleName,当forceRemove为true时,表示即使有资源引用也删除。

    [MenuItem("Tool/RemoveAssetBundleName")]
    static void RemoveAssetBundleName()
    {
        AssetDatabase.RemoveAssetBundleName("2.unity3d", true);
    }

AssetDatabase.GetUnusedAssetBundleNames
public static string[] GetUnusedAssetBundleNames();
返回所有未被使用的assetBundleName。

AssetDatabase.RemoveUnusedAssetBundleNames
public static void RemoveUnusedAssetBundleNames();
移除所有未被使用的assetBundleName。


AssetBundle的压缩方式:

在讲加载之前我们先来看看AssetBundle压缩

1、LZMA压缩方式
默认的压缩形式,这种标准压缩格式是一个单一LZMA流序列化数据文件,并且在使用前需要解压整个包体。LZMA压缩是比较流行的压缩格式,能使压缩后文件达到最小,但是解压相对缓慢,导致加载时需要较长的解压时间。

2、LZ4压缩方式
Unity支持LZ4压缩,能使得压缩量更大,而且在使用资源包前不需要解压整个包体。LZ4压缩是一种“Chunk-based”算法,因此当对象从LZ4压缩包中加载时,只有这个对象的对应模块被解压即可,这速度更快,意味着不需要等待解压整个包体。LZ4压缩格式是在Unity5.3版本中开始引入的,之前的版本不可用。

3、不压缩的方式
不压缩的方式打包后包体会很大,导致很占用空间,但是一旦下载Assetbundle,访问非常快。不推荐。

官方给出的一些建议:

1、把资源包部署在StreamingAssets中——使用
BuildAssetBundleOptions.ChunkBasedCompression方式打包并用
AssetBundle.LoadFromFileAsync来加载它,这提供了数据压缩和最快加载的性能,并且内存开销等于读取缓冲器。

2、下载资源包为DLCs——使用默认的打包选项(LZMA压缩),并且用LoadFromCacheOrDownload/WebRequest来下载和缓存它。这样为了进一步加载,会有最好的压缩比和AssetBundle.LoadFromFile加载性能。

3、加密包——使用BuildAssetBundleOptions.ChunkBasedCompression选项打包,并且用LoadFromMemoryAsync加载。(这基本是唯一使用LoadFromMemoryAsync加载的情况)

4、自定义压缩——使用BuildAssetBundleOptions.UncompressedAssetBundle选项来打包,并且在用自定义的压缩方式解压资源包后,使用AssetBundle.LoadFromFileAsync来加载。

嗯,打包这块差不多可以了,应该都理解了,接下来会继续讲加载这块。

未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值