上一章:【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. 关于VC++中virtual ~的含义

    我知道virtual 的虚函数定义,~CMainFrame( )是析构函数,用来释放内存.C++的继承和派生内容.所有可以被用作基类的类一般都用虚析构函数当基类对象的指针或引用调用派生类对象时,如果基 ...

  2. HTML 5 <embed> 标签

    定义和用法 <embed> 标签定义嵌入的内容,比如插件. 实例 <embed src="helloworld.swf" />

  3. 您是不是奇怪为什么 <script> 标签中没有 type="text/javascript" 属性?

    在 HTML5 中该属性不是必需的.JavaScript 是 HTML5 以及所有现代浏览器中的默认脚本语言!

  4. Java的栈和队列

    package com.ipmotor.sm.db;import java.util.LinkedList;import java.util.Queue;import java.util.Stack; ...

  5. python操作mysql,增,删,改,查

    import MySQLdb conn = MySQLdb.connect(host='192.168.1.21',user='yangqw',passwd='1',db='free')cur = c ...

  6. [转]同一台Windows机器中启动多个Memcached服务

    Memcached的安装后,如果手头上只有一台机器,又想做多节点测试咋办? 这就需要在一台机器上启动多个Memcached服务了. 假设Memcached在如下目录:C:\memcached\memc ...

  7. GPU 实现 RGB -- YUV 转换 (OpenGL)

    GPU 实现 RGB -- YUV 转换 前言 RGB --> YUV 转换的公式是现成的,直接在 CPU 端转换的话,只需要遍历每个像素,得到新的 YUV 值,根据其内存分布规律,合理安排分布 ...

  8. Navicat for MySQL导出表结构脚本的方法

    使用MySQL可视化工具Navicat导出MySQL的表结构脚本的方法. 1.右键Navicat中的数据库→数据传输(Data Transfer). 2.左边数据库对象(Database Object ...

  9. spring 声明式事务管理详解

    前言:spring框架对于事务管理提供了两种方案.一,编程式事务.二,声明式事务.本例主要剖析 声明式事务. 何为声明式事务: 通过spring的配置文件配置事务规则,或使用spring @Trans ...

  10. maven的聚合和继承

    Maven的聚合特性能够把项目的各个模块聚合在一起构建: 而Maven的继承特性则能帮组抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 聚合:新建一个项目demo ...