上一章:【Unity3D技术文档翻译】第1.5篇 使用 AssetBundles

本章原文所在章节:【Unity Manual】→【Working in Unity】→【Advanced Development】→【AssetBundles】→【AssetBundle Manager】

AssetBundle Manager

AssetBundle Manager 是一个可以让你更简单地使用 AssetBundle 的工具,点击链接下载。(这里要吐槽一下,官方文档给的链接是 AssetStore 里的老版本,最近更新日期是15年11月,根本无法使用。最新版需要去官方 bitbucket 上下载,上面的链接我已经替换成 bitbucket 上 AssetBundle Manager 的链接)

下载并导入 AssetBundle Manager 安装包,这不仅添加了一套加载和使用 AssetBundle 的API,还增加了一些编辑器功能,使 AssetBundle 工作流更简单。增加的编辑器功能可以在 Assets 菜单按钮下找到。

增加的按钮选项包含以下几个部分:

模拟模式(Simulation Mode)

使用模拟模式,AssetBundle Manager 不用实际创建就可以使用 AssetBundle。编辑器会查看哪些资源被分配给 AssetBundles,然后直接使用这些资源,而不是真的从 AssetBundle 中获取。

使用模拟模式主要的好处是资源可以直接被修改、更新、添加和删除,而不需要每次都重新创建和部署 AssetBundles。

需要注意的是,AssetBundle 版本变量在模拟模式中不能使用。如果你要使用版本变量,你需要选择“本地 AssetBundle 服务器(Local AssetBundle Server)”选项。

本地 AssetBundle 服务器(Local AssetBundle Server)

AssetBundle Manager 可以开启“本地 AssetBundle 服务器”模式,这样你就可以在编辑器或者本地设备(包括移动设备)上测试 AssetBundles。

使用“本地 AssetBundle 服务器”模式的前提是,你必须在根目录下创建一个名为“AssetBundles”的文件夹(与 Assets 文件夹同级)。如下:

创建好文件夹后,你就需要将你的 AssetBundles 编译构建到该文件夹。在上面提到的 Assets > AssetBundles 菜单项中选择 Build AssetBundles 选项,它将把你的 AssetBundles 构建到上面创建的文件夹内。

现在,你的 AssetBundles 已经构建好了(或者你使用了模拟模式),是时候开始加载 AssetBundles。我们来看一下 AssetBundle Manager 提供的新 API。

AssetBundleManager.Initialize()

该方法将加载 AssetBundleManifest 对象。在开始使用 AssetBundle Manager 加载资源之前,你需要先调用该方法。如下:

IEnumerator Start()
{
yield return StartCoroutine(Initialize());
}
IEnumerator Initialize()
{
var request = AssetBundleManager.Initialize();
if (request != null)
yield return StartCoroutine(request);
}

AssetBundle Manager 将使用 Initialize() 方法加载好的 manifest,在幕后提供一些有帮助的特性,包括依赖管理。

加载资源(Assets)

让我们来认真思考一下。我们正在使用 AssetBundle Manager,我们已经初始化(initialize)了它,现在是时候准备加载一些资源。下面一段代码展示了如何加载 AssetBundle 并实例化一个对象:

IEnumerator InstantiateGameObjectAsync (string assetBundleName, string assetName)
{
// Load asset from assetBundle.
AssetBundleLoadAssetOperation request = AssetBundleManager.LoadAssetAsync(assetBundleName, assetName, typeof(GameObject) );
if (request == null)
yield break;
yield return StartCoroutine(request);
// Get the asset.
GameObject prefab = request.GetAsset<GameObject> ();
if (prefab != null)
GameObject.Instantiate(prefab);
}

AssetBundle Manager 将异步处理加载,并返回一个加载请求,我们需要通过调用 yield return StartCoroutine(request) 来加载 AssetBundle。之后,我们就可以调用 GetAsset() 方法来从 AssetBundle 中加载游戏对象。

加载场景(Scenes)

如果你的 AssetBundle 是一个场景,那么加载的代码会有些不同。使用方法基本是相同的,只有细微的区别。如下:

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive)
{
// Load level from assetBundle.
AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(sceneAssetBundle, levelName, isAdditive);
if (request == null)
yield break;
yield return StartCoroutine(request);
}

正如你看到的,AssetBundle Manager 同样是异步处理加载,LoadLevelAsync 方法返回一个加载请求,我们需要将请求传入 StartCoroutine 方法来加载场景。

加载版本变量(Variants)

加载版本变量和加载场景、资源没什么实际上的不同。我们只需要设置一下 AssetBundleManagerActiveVariants 属性即可。

ActiveVariants 属性是一个字符串数组。简单地创建一个包含版本变量名称的数组即可(版本变量名称是你自己分配给资源的)。如下:

IEnumerator InitializeLevelAsync (string levelName, bool isAdditive, string[] variants)
{
//Set the activeVariants.
AssetBundleManager.ActiveVariants = variants;
// Load level from assetBundle.
AssetBundleLoadOperation request = AssetBundleManager.LoadLevelAsync(variantSceneAssetBundle, levelName, isAdditive);
if (request == null)
yield break;
yield return StartCoroutine(request);
}

传入一个你在代码的其他地方创建的字符串数组(可能来自按键点击,或者其他情况)。如果版本变量是有效的,这段代码将加载和版本变量一致的 AssetBundles。

如果本文对你有帮助的话,点个赞或者评论一下吧!

下一章:【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新

【Unity3D技术文档翻译】第1.6篇 使用 AssetBundle Manager的更多相关文章

  1. 【Unity3D技术文档翻译】第1.8篇 AssetBundles 问题及解决方法

    上一章:[Unity3D技术文档翻译]第1.7篇 AssetBundles 补丁更新 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Deve ...

  2. 【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)

    上一章:[Unity3D技术文档翻译]第1.8篇 AssetBundles 问题及解决方法 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced D ...

  3. 【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新

    上一章:[Unity3D技术文档翻译]第1.6篇 使用 AssetBundle Manager 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced ...

  4. 【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系

    上一章:[Unity3D技术文档翻译]第1.3篇 创建 AssetBundles 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Develo ...

  5. 【Unity3D技术文档翻译】第1.5篇 本地使用 AssetBundles

    上一章:[Unity3D技术文档翻译]第1.4篇 AssetBundle 依赖关系 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Devel ...

  6. 【Unity3D技术文档翻译】第1.3篇 创建 AssetBundles

    上一章:[Unity3D技术文档翻译]第1.2篇 为打包 AssetBundles 准备资产 本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced ...

  7. 【Unity3D技术文档翻译】第1.0篇 AssetBundles

    前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...

  8. 【Unity3D技术文档翻译】第1.2篇 为打包 AssetBundles 准备资产

    本章原文所在章节:[Unity Manual]→[Working in Unity]→[Advanced Development]→[AssetBundles]→[Preparing Assets f ...

  9. 【Unity3D技术文档翻译】第1.1篇 AssetBundle 工作流

    译者前言:本章是关于从创建到加载,再到使用 AssetBundle 的整个流程的概述.阅读本章将对 AssetBundle 的工作流程有个简单而全面的了解. 本章原文所在章节:[Unity Manua ...

随机推荐

  1. jQuery 表单

    1.一般输入信息的提示用<span>   属性为text 2.<input>只有设置了 name 属性的表单元素才能在提交表单时传递它们的值. 3.blur 失去焦点 4.$. ...

  2. Android知识点剖析系列:深入了解layout_weight属性

    摘录自:http://www.cnblogs.com/net168/p/4227144.html 前言 Android中layout_weight这个属性对于经常捣鼓UI的我们来说,肯定不会陌生.但是 ...

  3. 如何将阿里云mysql RDS备份文件恢复到自建数据库

    参考地址:https://help.aliyun.com/knowledge_detail/41817.html PS:目前恢复只支持 Linux 下进行.Linux下恢复的数据文件,无论 Windo ...

  4. sp_getAppLock使用

    sp_getAppLock  获取程序资源锁,简单的说就是调用此函数可以达到我们程序中.NET的lock锁的作用. 作用域是当前数据库下 四个参数: @resource(必填):资源名称,类型nvar ...

  5. java从文件中读取json

    wangxiaoer.json里面存放了json数据 需要依赖common-io.jar

  6. Struts2 (三)

    1 Struts2的拦截器 Struts2拦截器在访问某个Action方法之前或之后实施拦截,拦截器是可插拔的,拦截器是AOP的一种实现. Struts2拦截器栈:将拦截器按一定顺序联结成一条链,在访 ...

  7. 【转】 要做linux运维工程师的朋友,必须要掌握以下几个工具才行

          本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入 ...

  8. cell数组

     问题: (注意,matlab判断一个数的类型的函数是class(var)) 如果p为一个数,那么h(1)=p,是没有问题的. 如果p为一个向量,那么h(1,:)=p是没有问题的. 如果p是一个矩阵的 ...

  9. 【转】Shell执行MySql操作

    mysql  -hhostname -Pport -uusername -ppassword  -e  相关mysql的sql语句,不用在mysql的提示符下运行mysql,即可以在shell中操作m ...

  10. [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.9_归一化normalization

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9 归一化Normaliation 训练神经网络,其中一个加速训练的方法就是归一化输入(normalize inputs). 假设我们有一个 ...