AssetBundles

AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景)。AssetBundles可以表示彼此之间的依赖关系;例如AssetBundle A中的一个材质可以引用AssetBundle B中的一个纹理。为了通过网络进行有效的传递,可以根据用例要求,选择内置算法(LZMA和LZ4)来对AssetBundles进行压缩。

AssetBundles可用于可下载内容(DLC),减少初始安装大小,加载为最终用户平台优化的资产,并降低运行时内存压力。

一个AssetBundle文件中有什么?

好的问题,实际上“AssetBundle”可以指两个不同但有关的事情。

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

第二个是您通过代码从特定存档加载资源的实际的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的文件夹,并在文件夹中放置以下内容的脚本:

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定义的路径上的文件夹中。

有关此代码正在执行的更多详细信息,请参阅有关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 许可协议。转载请注明出处!

「翻译」Unity中的AssetBundle详解(一)的更多相关文章

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

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  2. [翻译]Unity中的AssetBundle详解(三)

    构建AssetBundles 在AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数.让我们更深入地了解我们 ...

  3. 「MoreThanJava」Day 7:接口详解

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. 「JSOI2013」游戏中的学问

    「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...

  5. MyBatis中@MapKey使用详解

    MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象 ...

  6. Java中日志组件详解

    avalon-logkit Java中日志组件详解 lanhy 发布于 2020-9-1 11:35 224浏览 0收藏 作为开发人员,我相信您对日志记录工具并不陌生. Java还具有功能强大且功能强 ...

  7. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  8. Android中Service(服务)详解

    http://blog.csdn.net/ryantang03/article/details/7770939 Android中Service(服务)详解 标签: serviceandroidappl ...

  9. Android中Intent组件详解

    Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...

随机推荐

  1. HDU——1045Fire Net(最大匹配)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  2. BZOJ 4566 [Haoi2016]找相同字符 ——广义后缀自动机

    建立广义后缀自动机. 然后统计子树中的siz,需要分开统计 然后对(l[i]-l[fa[i]])*siz[i][0]*siz[i][1]求和即可. #include <cstdio> #i ...

  3. 刷题总结——弹飞绵羊(bzoj2002)

    题目: Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置, ...

  4. 浅谈Oracle数据库分区表

    Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,之前,只听过分区的大名,却总未用过,最近简单学习了一下,总结如下,不对之处,还希望朋友们多多指点,交流! 1.表空间及分区 ...

  5. ngrinder的idea脚本开发环境配置

    1.安装toriseSvn,安装一定要选择comandline (默认是没选择的) 2.下载groovy,解压缩,在开发工具(ps:idea,eclipse)中设置groovy安装路径 3.在网站处创 ...

  6. jenkins使用流程

    jenkins使用流程 看下面那个连接的吧. http://www.cnblogs.com/zz0412/p/jenkins02.html 1.设置git库 2.点击add添加github用户名.密码 ...

  7. 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  8. AnyChart图表仪表控件在Flex环境下使用

    AnyChart控件是一款当前流行的数据可视化解决方案,使客户可以创建交互地.生动的图表.实时仪表和地图.同时支持Flash和HTML5显示,控件提供极好的视觉外观和配色方案能够使客户根据不同的需求设 ...

  9. Scrapy学习-4-Items类&Pipelines类

    items类使用 作用 能使得我们非常方便的操作字段名 在items.py中定制我们的类 class ArticleItem(scrapy.Item): title = scrapy.Field() ...

  10. Python 和 Elasticsearch 构建简易搜索

    Python 和 Elasticsearch 构建简易搜索 作者:白宁超 2019年5月24日17:22:41 导读:件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正 ...