Unity 5:使用 Asset Bundle 和 Asset Bundle Manager (2)

http://blog.shuiguzi.com/2015/11/11/AssetBundleAndABManage_2/

介绍

使用 AssetBundle 中一个关键的地方是编译和测试 bundles。一般情况下,资源在开发过程中是会变的。正常地,可能需要要求有规律的编译 AssetBundle, 上传到服务器和然后通过网络连接在当前项目中测试远程的 AssetBundle.

这节主要关注 AssetBundle Manager 使用 AssetBundle。相对利用基础的低层 API 来操作 AssetBundle, AssetBundle Manager 为太幅改进的流程提供了高层的 API。

使用 AssetBundle

在编辑器中使用 AssetBundle 的大体步骤:- 在编辑器中组织 & 设置 AssetBundle。 - 编译 AssetBundle。 - 上传 AssetBundle 到外部存储 - 运行期下载 AssetBundle - 从 AssetBundle 加载对象。

值得注意的一点,有些 AssetBundle 可以存储在本地作为即时加载的默认设置。这样对不能访问远程存储下载期望的资源的安装特别有用。比如,当不能访问可下载内容的时候,程序可以从本地的 AssetBundle 中加载默认的语言和本地化数据。

值得注意的是一个 AssetBundle 包括平台准备资源。AssetBundle 的内容会根据 Import Settings 里设置的当前平台和 Build Settings 里面的目标平台做编译和优化。因为这样,需要为每个平台编译 AssetBundle。

在接下来的简单的场景中, 为了AssetBundle 最大的用途,有个合理的组织 AssetBundle 场景内容的方式就是把草地,沙丘,岩石柱,树和仙人掌都打包到一个基础场景里面。这个基础场景可能包含依赖的材质,因为他们很简单,以后不太可能会基于分辨率或者设备而改变。坦克模型将需要一个自己的 AssetBundle, 这样允许改变或者更新玩家资源。为了实现坦克游戏对象,还需要两个额外的 AssetBundle. 一个是独立的材质资源,另外是独立的纹理资源。这将会给需要给纹理和材质的更改和更新时带来最小的麻烦。这个特别的组织方式也允许有其他版本或者基于平台、位置或者目标设备分辨率选择 AssetBundle 的变体。

simpleScene


一个简单的示例场景

为了在编辑器中组织和设置 AssetBundle, 资源需要指定一个 AssetBundle。 查看资源的时候,可以在 Inspector 的底部查看 AssetBundle 的名字和变体。在打开的预览窗口中能看到他们。

assetbundleName

一个还没有指定 AssetBundle 的资源

使用 AssetBundle 名字下拉菜单来给资源指定 AssetBundle。在这可以创建一个新的 AssetBundle 或者选择已经存在的 AssetBundle。教程的后面会谈到 AssetBundle 变体和 AssetBundle 变体名字。

abmenu2

给一个资源指定 AssetBundle

创建新的 AssetBundle, 选择 New,文本区域将会激活用来命名新的 AssetBundle。

从 AssetBundle 中删除资源,选择 None,资源现在就变成为没有指定 AssetBundle 了。

要从列表中删除一个 AssetBundle 名字,需要把所有指定到这个 AssetBundle 中的资源从 AssetBundle 名字中删除,然后选择 Remove Unused Names。这会删除所有没有被使用的 AssetBundle 名字。

creat a new name

创建一个新的 AssetBundle 名字(注意 大写的 “T” 在 AssetBundle 名字中非法)

资源将会指定到在 AssetBundle 名字菜单中选择的 AssetBundle。AssetBundle 名字是严格小写的。如果使用了大写字母,就像上面的例子一样,Unity 将会用小写字母来代替。

tank assign to ab

坦克资源现在已经被指定到 “tanke” AssetBundle 上了

注意 AssetBundle 的名字已经被自动纠正到了小写字母。

使用 AssetBundle 变体

从 AssetBundle 中按需加载资源的可能让很多困难问题有很多创意的解决方案,比如加载,存储和更新资源。一个典型的 AssetBunle 能有帮助的用例就是需要基于设备,位置或者用户习惯加载资源的项目。这个可以用 AssetBundle 变体来实现。

AssetBundle 变体提供场景中指定到一个对象上同一个资源的不同版本。AssetBundle 变体完全是重新映射不同的资源到同一个对象上。在同一时间只能有一种 AssetBundle 被加载。我们可以为不同的方案创建资源变体。同一个资源可以有不同分辨率的资源变体:标准图形 VS 高清图形或者不同多边形数的模型。可以为一个对象创建不同内容的资源变体:为每个支持语言,区域或主题的文字,图片,纹理和字体。这些资源都可以存储到一系列统一构建的 AssetBundle 中并用名字来区分他们。

为了这些可以工作,所有匹配的 AssetBundle 变体必须构建和命名都一样。AssetBundle 变体间仅仅不同的地方就是 AssetBundle 内的资源和 加到 AssetBudle 后面的用来区分 AssetBundle 变体的名字。为了 AssetBundle 变体的兼容性,AssetBundle 的文件夹结构和内容需要匹配。所有的资源都要在 AssetBundle 里,具有相同的名字和在相同的分级顺利(hierarchial order)。

下面的示例可以在 AssetBundle 示例中找到。

variant structure

AssetBundle 变体示例

在上面的例子中,MyAsset-HD 和 MyAssets-SD 两个文件夹都被指定了 AssetBundle 名字 “myassets”。每个都给予了 AssetBundle 变体名字去区分他们,在这里分别是 hd 和 sd。注意两个资源集都有相同的名字和分级结构。父目录被指定到了一个 AssetBundle 而它所有的子对象都没有指定到 AssetBundle 中,当父目录被编译的时候,所有的子对象都会加到父目录的 AssetBundle 中。

variant name hd

MyAsset-HD 设置了 AssetBundle 名字和变体名字

variant name sd

MyAssets-SD 设置了 AssetBundle 名字和变体名字

注意,我们可以为 AssetBundle 名字创建层级菜单。上面的图片中 AssetBundle 名字有个路径:variant/myassets。 这会为 “myassets” 名字的 AssetBundle 创建一个 “variants” 名字为父级的新菜单项。

层级菜单的 AssetBundle 名字

一旦资源被指定到 AssetBundle, 这个 AssetBundle 将要被编译和测试。

使用 AssetBundle Manager

Unity 提供了直接使用 AssetBundle 的底层 API. 但是这篇教程不会覆盖这些底层 API。关于底层 API 的更多信息,请阅读这个链接。

关于编译,测试和管理 AssetBundle,这篇教程会专注到 AssetBundle Manager 和它的高层 API 上。

AssetBundle Manager 是一个可下载的,可以安装在当前 Unity 项目中的包,它提供高层 API 和改进了 AssetBundle 的流程。AssetBundle Manager 可以再 这里 下载。要在项目中使用 AssetBundle Manager,简单的将它加到当前的项目的 Asset 文件夹中。

编译和测试 AssetBundle 可能是在开发过程中的一个痛点。资源会时常的改变。使用底层 AssetBunle API 时,测试需要规律的编译和上传 AssetBundle 到一个远程服务器上,然后从当我的项目建立一个网络连接来测试远程服务器上的 AssetBundle。相对于直接操作 AssetBundle 的底层 API, AssetBundle Manager 大幅度的优化了流程。AssetBundle Manager 提供的最核心的功能是一个模拟模式,一个本地的 AssetBundle 服务器和一些快捷的菜单去编译 AssetBundle 和无间隙地和本地 AssetBundle 服务器合作。

把 AssetBundle Manager 加入到项目之后将会在 Asset 菜单中创建一个叫 AssetBundles 的新菜单项。

assetbundle

Assets > AssetBundles

选中 AssetBundles 菜单将会显示一个小菜单选项。

assetbundle menu item

Assets > AssetBundles 菜单项

模拟模式开启后,允许编辑器不用实际编译就可以模拟 AssetBundle。要打开模拟模式,选择 Simulation Mode 菜单项。对勾符号表示模拟模式已经开启。要关闭模拟模式就再选择一次菜单项目。然后对勾符号会被移除,模拟模式会被禁用。

当模拟模式开启后,编辑器会查看哪些资源被指定到了 AssetBundle,然后从项目的 hierarchy 中直接使用他们,就像他们在 AssetBundle 中一样。但是这些 AssetBundle 不需要编译。从这点来看,在编辑可以工作到了 AssetBundle 编译后放到远程服务器上一样可以工作。

开启模拟模式最大的好处是,只要资源被正确地指定到 AssetBundle ,在当前运行的项目测试前不需要停下来去编译和重新部署 AssetBundle 就可以修改,操作,导入,删除资源。当开启模拟模式之后,测试是马上生效的。

注意 AssetBundle 变体在模拟模式下不支持。测试 AssetBundle 变体,AssetBundle 需要重新编译和部署。但是,本地的资源服务器支持 AssetBundle 变体。

AssetBundle Manager 也可以开启一个本地资源服务器来从编辑器或者本地或移动端的 build 来测试。当本地资源服务器开启后,AssetBundle 必须编译,然后放到项目跟目录中,跟 Assets 文件夹同级的 AssetBundles 文件夹里。

assetbundles folder

本地资源服务器要求的 AssetBundes 文件夹位置

AssetBundles 本地托管之后, 从当前项目中访问本地资源服务器只需要几行的代码就可以方便的访问。请阅读 AssetBundle 示例项目中的示例,我们会在教程的下面覆盖到。

编译和保存到 AssetBundle 到项目根目录的 AssetBundles 文件夹中可以从 Assets/AssetBundles 菜单中选择 Build AssetBundles 来完成。当 Build AssetBundles 被选择之后, Unity 将会编译所有有资源指定的 AssetBundle, 然后为当前的平台编译和优化他们,最后保存他们和一个主清单到项目根目录下的 AssetBundles 文件夹下。如果没有AssetBundles文件夹,Unity 会创建一个。在 AssetBundles 文件夹里,AssetBudle 按照编译目标平台来组织。

grouped by target

“AssetBundles” 文件夹,按照编译目标平台来分组

AssetBundle 被编译后部署到远程服务器或者开始本地资源服务器,这些 AssetBundles 可以在运行期下载和插入到项目中。

AssetBundle 练习

练习 AssetBundle, 这教程将会使用 AssetBundle Manager。AssetBundle Manager 会应付 AssetBundle 的加载和他们相关的资源依赖。利用 AssetBundle Manager 来从 AssetBundle 中加载资源,脚本需要使用 AssetBundle Manager 提供的 API。

AssetBundle Manager 的 API 包括:

  • Initialize() 初始化 AssetBundle 清单对象
  • LoadAssetAsync() 从指定的一个 AssetBundle 中加载资源并处理所有的依赖
  • LoadLevelAsync() 从指定的一个 AssetBundle 中加载场景并处理所有的依赖
  • LoadDependencies() 加载指定的 AssetBundle 的所有独立的 AssetBundle
  • BaseDownloadingURL 设置用来自动下载依赖的基本地址
  • SimulateAssetBundleInEditor 在编辑器中设置模拟模式
  • Vraiants 设置当前的变体
  • RemapVariantName() 根据当前的变体决定正确的 AssetBundle

示例文件放置在 AssetBundle Manager 内的 AssetBundle Sample 文件加下。有 3 个基础的示例场景和一个高级的示例场景在 AssetBundleSample/Scenes 文件夹下:

  • “AssetLoader” 演示了怎么样从 AssetBundle 加载普通资源
  • “SceneLoader” 演示了怎么样从 AssetBundle 加载场景
  • “VariantLoader” 演示了怎么样加载 AssetBundle 变体
  • “LoadTanks” 更高级,演示了复杂一点的,从同一个场景中加载场景,资源,和 AssetBundle 变体的示例。

每个场景都各个被非常基础的脚本驱动着:LoadAsset.cs,LoadScenes.cs,LoadVariants.cs 和 LoadTanks.cs。

当前重申一下 AssetBundle Manager 提供的流程还是很重要的。

为了能成功的试验 AssetBundle 的使用,这里有三种可能的情景:

第一个情景,没有使用 AssetBundle Manager, AssetBundle 将需要被编译和部署,所有的测试都会在最终完整准备后完成。在这个场景中,每次项目中资源的改变,都需要编译和部署新的 AssetBundle。

AssetBundle Manager 在流程上提供了两个改进。他们是本地资源服务器和模拟模式。

在模拟模式中,编辑器内运行项目时,AssetBundle Manager 会模拟编译后的 AssetBundles。这是使用 AssetBundle 的最快的流程。只需简单的使用 “Assets/AssetBundles/Simulation Mode” 菜单打开 “模拟模式”, 然后测试项目。没有 AssetBundle 会被编译。尽管如此,要注意 AssetBundle 变体在模拟模式下不工作。还有要注意的是,模拟模式开始后,资源可以再项目中操作,并且改变后的效果在 Sence 视图中可以看到,而这使用部署后的 AssetBundle 是不行的。

本地资源服务器提供了部署的 AssetBundle 更精确的演示,但是需要 AssetBundle 被编译和存储到项目中的默认文件夹。当本地资源服务器开启之后,被编译的 AssetBundle 将可以被编辑器和所有运行在本地的,可以通过本地网络连接编辑器的 build 使用。注意这个是能本地测试 AssetBundle 变体的唯一方式。

要运行示例场景,AssetBundle Manager 必须运行在这些模式中的一种。要成功运行 AssetBundle 变体,AssetBundle 必须被编译并且本地资源服务器必须被开启。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值