上一章:【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. ::在c++中什么意思

    (1)表示“域操作符” 例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时, 就要写成void A::f(),表示这个f()函数是类A的成 ...

  2. 谷歌扩展程序设置ajax请求允许跨域(极少人知道的解决方案)

    前言: 跨域问题一直是个老生常谈的问题,在实际开发过程中,跨域的问题常常会让开发者非常的头疼. 常用的几种跨域解决方案: 1.代理 2.XHR2 HTML5中提供的XMLHTTPREQUEST Lev ...

  3. eclipse启动报错the catalog could not be loaded please ensure that you have network access and if needed have configured your network proxy

    搜索关键词不对在网上查了一圈没找到合适的解决办法 去看报错的日志文件 然并卵.不过下面有个config.ini,想着以前能用现在不能用,肯定是配置问题,打开该文件 转载请注明出处http://www. ...

  4. 渲染引擎(The rendering engine)

    渲染引擎的职责就是渲染,即在浏览器窗口中显示所请求的内容.这是每一个浏览器的核心部分,所以渲染引擎也称为浏览器内核. 渲染引擎一开始会从网络层获取请求文档的内容. 获取文档后,渲染引擎开始解析 htm ...

  5. js执行函数报错Cannot set property 'value' of null怎么解决?

    js执行函数报错Cannot set property 'value' of null 的解决方案: 原因:dom还没有完全加载 第一步:所以js建议放在body下面执行, 第二步:window.on ...

  6. Android Studio打包APK时出现 is not translated in "en" (English) [MissingTranslation]

    错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...

  7. cursor的moveToNext()与moveToFirst()

    String sql = "select count(*) as c from sqlite_master where type ='table' and name ='" + t ...

  8. tomcat无法打开8080页面

    tomcat已启动 app已经正常执行 但不能打开8080管理页面 可能是在webapps目录下没有ROOT目录

  9. python脚本获取主机Mac地址

    #!/usr/bin/python import re import subprocess ARP = "arp" IP = "192.168.128.27" ...

  10. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...