上一章:【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——动态给表格添加序号

    摘录自:http://www.cnblogs.com/picaso/archive/2012/10/08/2715564.html 很多时候遇到需要对表格动态操作,而且一般都会有表格的序号,但是有时候 ...

  2. Django将request对象传入模板配置

    对于很多时候,需要从模板中获取很请求中很多内容,比如当前请求的url,当前的session变量中的某个值,这时候我们可以通过配置可将request对象传递进模板. django1.10版本: sett ...

  3. excel生成sql语句

    很多时候,我们想把excel中数据导入到数据库中. 方法有很多种,比如直接拷贝然后黏贴进编辑状态的框中,这种情况有个弊端,就是excel中每列的数据必须和数据库中一一对应,这个很难,基本上不太可能,数 ...

  4. 懒人小技巧, Toad 常用偷懒方法

    用toad很久了, 感叹它的功能强大的同时整理了一些相关技巧,  有以前在网上看到的也有自己平时用的时候偶尔发现的, 分享一下, 它对用户体验方面做的真的很到位, 通过各种方式来方便用户的操作. 菜鸟 ...

  5. jquery判断数据类型和相同字符串不相等

    typeof object返回object对象数据类型 encodeURIComponent(str)//可把字符串作为URI 组件进行编码. 若str1和str2字符串数值相同,encodeURIC ...

  6. Windows脚本相关

    1 获取IP地址 echo StartChangeIPFile echo 获取主机名 for /f %%i in ('hostname') do (set pcName=%%i) ::ping %pc ...

  7. java判断网页的编码格式

    在爬取内容时,遇到乱码问题.故需对网页内容编码格式做判断,方式大体分为三种:一.从header标签中获取Content-Type=#Charset:二.从meta标签中获取Content-Type=# ...

  8. php 通过curl获取远程数据,返回的是一个数组型的字符串,高手帮忙如何将这个数组类型的字符串变成数组。

    如 Array([0] => Array([0] => Array([kd_status] => 已签收[kd_time] => 2014-04-30 18:59:43 [b] ...

  9. Selenium+java+idea的安装与配置

    当前操作系统:Windows10pro x64 一.安装JDK 1.到jdk官网下载一个对应当前系统的安装包(Selenium仅支持JDK1.8及以上版本) 网址:http://www.oracle. ...

  10. nagios中监测dns 227.7.128.68的网络状态

    [root@nhserver2 ~]# cd /usr/local/nagios/etc/objects [root@nhserver2 objects]# vim hosts_dns.cfgdefi ...