「翻译」Unity中的AssetBundle详解(一)

AssetBundles

AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景)。AssetBundles能够表示彼此之间的依赖关系;例如AssetBundle A中的一个材质能够引用AssetBundle B中的一个纹理。为了经过网络进行有效的传递,能够根据用例要求,选择内置算法(LZMA和LZ4)来对AssetBundles进行压缩。
AssetBundles可用于可下载内容(DLC),减小初始安装大小,加载为最终用户平台优化的资产,并下降运行时内存压力。html

一个AssetBundle文件中有什么?

好的问题,实际上“AssetBundle”能够指两个不一样但有关的事情。git

第一个是磁盘上的实际文件。咱们把这叫作AssetBundle存档,或在本文档只是短时间档案。存档能够被认为是一个容器,就像一个文件夹,在其中保存其余文件。这些附加文件包括两种类型:序列化文件和资源文件。序列化的文件将您的资产分红各自的对象,并写入这个文件。资源文件只是存储在某些资产(纹理和音频)中的二进制数据块,容许咱们在另外一个线程上有效地将其从磁盘加载到内存。github

第二个是您经过代码从特定存档加载资源的实际的AssetBundle对象。此对象包含您添加到此存档的资源的全部文件路径的映射到属于该资产的对象,该对象在须要时须要加载。(This object contains a map of all the file paths of the assets you added to this archive to the objects that belong to that asset that need to be loaded when you ask for it.)算法

AssetBundle工做流程

要开始使用AssetBundles,请按照下列步骤操做。有关每一个工做流程的更详细信息,请参见本部分文档中的其余页面。网络

将资产分配给AssetBundles

要将一个给定的资产分配给一个AssetBundle,请按照下列步骤操做:优化

  1. 从“项目视图”中选中要分配给一个bundle的资产
  2. 检查Inspector视图中的对象
  3. 在Inspector视图的底部,能够看到一个部分来分配AssetBundles和Variants
  4. 左侧的下拉菜单分配AssetBundle,而右侧的下拉菜单则指定Variants
  5. 点击左侧的下拉菜单,其中显示“None”以显示当前注册的AssetBundle名称
  6. 若是还没有建立,你将看到上面的图像中的列表
  7. 点击“New...”建立一个新的AssetBundle
  8. 键入所需的AssetBundle名称。请注意,AssetBundle名称支持一种类型的文件夹结构,具体取决于你键入的内容。要添加子文件夹,请使用“/”分隔文件夹名称。例如:AssetBundle名称“environment/forest”将在environment子文件夹下建立一个名为forest的bundle
  9. 一旦你选择或建立了一个AssetBundle名称,你能够重复此过程,为右侧下拉菜单分配或建立一个不一样的名称,以分配或建立一个Variant名称,若是你愿意的话。在构建AssetBundles时,Variant名称不是必需的。

要了解有关AssetBundle分配和随附策略的更多信息,请参阅Preparing Assets for AssetBundles的文档。网站

构建AssetBundles

在项目中的Assets文件夹下建立一个名为Editor的文件夹,并在文件夹中放置如下内容的脚本:ui

using UnityEditor;

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.Standalone);
    }
}

该脚本将在Assets菜单的底部建立一个名为“Build AssetBundles”的菜单项,该菜单项将执行与该标记关联的功能中的代码。当您单击Build AssetBundles时,进度条将显示一个构建对话框。这将使那些用AssetBundle名称标记的全部资产打包进同一个文件,并将它们放在由assetBundleDirectory定义的路径上的文件夹中。this

有关此代码正在执行的更多详细信息,请参阅有关Building AssetBundles的文档。线程

上传AssetBundles到非本地存储

这一步对于每一个用户都是独一无二的,而不是一步一步能够告诉你如何作。若是您打算将AssetBundles上传到第三方托管网站,请在此处进行。若是您正在严格执行本地开发,并打算将全部AssetBundles都放在磁盘上,请跳到下一步。

加载AssetBundles和Assets

对于有意从本地存储加载的用户,您将对AssetBundles.LoadFromFile API感兴趣。看起来像这样:

public class LoadFromFileExample extends MonoBehaviour {
    function Start() {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));
        if (myLoadedAssetBundle == null) {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = myLoadedAssetBundle.LoadAsset.<GameObject>("MyObject");
        Instantiate(prefab);
    }
}

LoadFromFile获取包文件的路径。

若是您本身托管AssetBundles而且须要将其下载到游戏中,那么您将对UnityWebRequest API感兴趣。这里有一个例子:

IEnumerator InstantiateObject()
{
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName;
    UnityEngine.Networking.UnityWebRequest request = UnityEngine.Networking.UnityWebRequest.GetAssetBundle(uri, 0);
    yield return request.Send();
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
    GameObject cube = bundle.LoadAsset<GameObject>("Cube");
    GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
    Instantiate(cube);
    Instantiate(sprite);
}

GetAssetBundle(string, int)获取AssetBundle的位置的uri以及要下载的包的版本。在这个例子中,咱们仍然指向一个本地文件,可是字符串uri能够指向你托管AssetBundles的任何URL。

UnityWebRequest具备处理AssetBundles的特定句柄(DownloadHandlerAssetBundle),DownloadHandlerAssetBundle从请求中获取AssetBundle。

不管使用的方法如何,你如今均可以访问AssetBundle对象。从该对象中加载资源,你将须要使用LoadAsset<T>(string)方法,该方法中泛型类型T表示你所要加载的Asset的类型,方法参数为所要加载的Asset对象的名称。这将返回您从AssetBundle加载的任何对象。您能够像Unity中的任何对象同样使用这些返回的对象。例如,若是要在场景中建立一个GameObject,则只须要调用Instantiate(gameObjectFromAssetBundle)。
有关加载AssetBundles的API的更多信息,请参阅Using AssetBundles Natively文档。

原文连接:

  1. AssetBundles
  2. AssetBundle Workflow

同系列文章

「翻译」Unity中的AssetBundle详解(一)

「翻译」Unity中的AssetBundle详解(二)

「翻译」Unity中的AssetBundle详解(三)

「翻译」Unity中的AssetBundle详解(四)


本文做者: Sheh伟伟
本文连接: http://davidsheh.github.io/2017/07/14/「翻译」Unity中的AssetBundle详解(一)/
版权声明: 本博客全部文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

相关文章
相关标签/搜索