您的位置:首页 > 移动开发 > Unity3D

Unity 5.x中的AssetBundle(一)

2017-01-19 15:49 344 查看
接触了下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、把资源包部署在StreamingAs
9c85
sets中——使用

BuildAssetBundleOptions.ChunkBasedCompression方式打包并用

AssetBundle.LoadFromFileAsync来加载它,这提供了数据压缩和最快加载的性能,并且内存开销等于读取缓冲器。

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

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

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

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

未完待续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: