上一章:【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. async函数解析

    转载请注明出处:async函数解析 async函数是基于Generator函数实现的,也就是说是Generator函数的语法糖.在之前的文章有介绍过Generator函数语法和异步应用,如果对其不了解 ...

  2. Objective-C基础教程学习笔记(附录)从Java转向Objective-C

    Java接口与Objective- C正式协议类似,因为它们都需要实现一组方法.Java具有抽象类,但Objective-C没有.Java具有类变量,但在Objective-C中, 可以使用文件范围内 ...

  3. Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)

    Java8内存模型—永久代(PermGen)和元空间(Metaspace) 查看原文点击传送门:http://www.cnblogs.com/paddix/p/5309550.html 提示:本文做了 ...

  4. MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  5. node 在控制台打印有色彩的输出

    在学习 node 过程中,因为没有找到有断点的调试方法,只能退而次之,在控制台打印调试. 但整个控制台的输出都是一种颜色,有时候很难找到自己需要的信息,这时,有颜色的打印就会帮上很大的忙. conso ...

  6. wepy 初探

    此篇文章仅仅是对自身项目的一个总结,并对一些遇到的问题给出解决方法 一,安装 wepy安装 二,使用 wepy的文档已经写的很清晰了,遇到的问题大多在issues和wiki中也能找到,具体就不概述了, ...

  7. JavaScript动画:offset家族和匀速动画详解(含轮播图的实现)

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. offset家族简介 我们知道,三大家族包括:offset/scroll ...

  8. Struts2中拦截器的使用与配置

    一,拦截器是什么? 拦截器是在Action执行之前和之后执行的代码,是一个类似于过滤器的类: 二,拦截器的作用 拦截器拦截Action的请求,在Action之前或之后实现某项功能: 三,拦截器的特点 ...

  9. docker之NGINX镜像构建

    Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...

  10. windows免费?linux免费?赶紧过来看吧

    1.今天分享大家一个免费申请linux的网站,可以用来做学习使用! 1.链接地址:https://linuxzoo.net 一次性邮箱:https://temp-mail.org   打开网址申请一个 ...