设为首页收藏本站

微软Hololens全息现实网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

一键登录:

查看: 937|回复: 0

Unity之关于AssetBundles必须明白的基本原则

[复制链接]
发表于 2017-3-4 10:31:48 | 显示全部楼层 |阅读模式

本帖最后由 HoloLens全息现实网 于 2017-3-5 17:35 编辑 关于AssetBundles必须明白的基本原则: AssetBundles完整地下载和缓存。AssetBundles不需要全部加载。AssetBundles中的Assets可以依赖于其他Assets。AssetBundles的Assets可与其他Assets共享依赖。每个AssetBundle有一些技术开销,包括文件...

本帖最后由 HoloLens全息现实网 于 2017-3-5 17:35 编辑

关于AssetBundles必须明白的基本原则:

  • AssetBundles完整地下载和缓存。
  • AssetBundles不需要全部加载。
  • AssetBundles中的Assets可以依赖于其他Assets。
  • AssetBundles的Assets可与其他Assets共享依赖。
  • 每个AssetBundle有一些技术开销,包括文件的大小和需要管理的文件。
  • AssetBundles 应该为每个目标平台分别构建。


   AssetBundles完整地下载。如果一个AssetBundle包含资产不会立即需要,即使他们不一定会加载到场景,他们也会占用带宽来下载和磁盘空间来存储。


   AssetBundles不需要加载的内容完整。一旦AssetBundle已经下载,资产可以有选择地从AssetBundle加载。

    资产可以依赖于其他资产。例如,一个模型可以有几个依赖性。游戏中最后的模型不只是mesh数据,也包括GameObject与它的所有组件和组件的所有依赖项。


    模型依赖于模型的Mesh Renderer组件中的Material资产,Material资产依赖于材质的 Albedo Texture 。
dependencies2.png

    Assets可与其他Assets共享依赖。例如,两个不同的模型可共享相同的材质,进而可以依赖一个纹理。
two_rock_columns.png




     每个AssetBundle有一些技术开销。AssetBundles 是包裹Assets的文件。


      这个包装器增加了AssetBundle的总体规模。尽管这不是一个显著增加的大小,但它是可以衡量的。AssetBundles还需要一定的管理组织,创建、上传和维护。AssetBundles使用增加开销的项目越多,越需要技术和管理。

      组织AssetBundles时,必须在需要跟踪、产生开销的较多小AssetBundles和太大且包含不必要或冗余数据的较少AssetBundles之间达成一种平衡。准确的平衡将严重依赖于项目的需要。


      AssetBundle 的内容为通过导入设置和当前“Target Platform”的当前目标平台被编译和组织。因此,AssetBundles应为每个平台分别构建。


清单和依赖(Manifests and Dependency )管理



    关于依赖和依赖关系管理有几个要点需要理解。


Asset 的依赖永远不会被丢失。当AssetBundles被构架师,如果依赖资产没被色绘制到任何AssetBundle,那么依赖的Asset连同被选择的Asset将被自动添加到AssetBundle。这是非常方便的,也防止了依赖资产的丢失。但是,这也可能导致Assets的重复。例如,上面两个石阵使用和共享相同的材质,如果两个石阵在不同的AssetBundles中,并且材质没被明确的设置到一个AssetBundle,那这个材质将被分别添加到包含两个石阵的AssetBundles中。值得注意的是,当这一切发生的时候,两个重复的资产存储在各自AssetBundles中,并且资产依赖现在被分裂。每个模型资产现在将依赖于本地材质资产去啊的副本,移除共享资产的任何优势。这些Material需显式地指定一个AssetBundle。这可以是一个他自身拥有的AssetBundle或与其他资产共享的AssetBundle。在这两种情况下,岩石的两个AssetBundles现都将依赖于有岩石Material的AssetBundle。



依赖关系和工程的AssetBundles的其他信息被存储在Manifest(清单)中。该清单非常像工程的AssetBundles的目录或内容列表。当AssetBundles被构建时,Unity生成大量数据。这些数据的细节被存储在Manifest清单中。并且该Manifest清单文件为每个目标平台分别创建。所有AssetBundles的Manifest清单列表被从工程为当前目标平台创建,并且存储和追踪他们的所有依赖。清单列出所有被从工程为当前目标平台创建的AssetBundles,并存储和跟踪所有它们的依赖项。Manifest清单可能要查询所有AssetBundles和它们的依赖项。


AssetBundles有一个特别设置叫AssetBundle变体(AssetBundle Variants)。AssetBundle变体(AssetBundle Variants)被设计用以支持一个特定的用例——重新映射资产的选择到项目中的单个对象。当需要从基于标准,例如分辨率、语言、定位、或用户偏好(user preference)等各种不同的可能的选择中选择一个资产的项目一起工作时,这是特别有用的。AssetBundle Variants可以容纳为一个对象和能被从所选AssetBundle Variant映射的期望的大量需要覆盖所有支持选项的Asset。


AssetBundles是容纳诸如模型,材质、纹理和场景的资产文件的文件。AssetBundles被Unity编辑器在编辑期间创建,并在之后的运行时被一个已构建的应用程序所使用。AssetBundles被设计用来从一个本地或远端资源按需加载Assets。AssetBundles可以有变体,这些变体被映射到依赖于用户偏好的场景中的对象。




使用AssetBundles

在编辑器中使用AssetBundles粗略分为以下几步


在编辑器中组织和装配AssetBundles-》构建AssetBundles-》上传AssetBundles到扩展的外部存储-》在运行时下载AssetBundles-》从AssetBundles加载对象。


值得注意的是,为了即时加载默认设置,一些AssetBundles可以存储在本地。这有助于防止一个应用程序的安装不能到达远程外部存储器下载所需AssetBundles。例如,当应用程序访问不到可下载内容时,可能从一个本地AssetBundle加载默认语言和和定位数据。


同样值得注意的是,AssetBundle包含已经准备好资产的平台。AssetBundle的内容通过导入设置和Build Settings中设置的Target Platform为当前目标平台编译和优化。


      在下面的简单场景中,将场景组织到AssetBundles中以获得最大的多功能性的一种合理方式是具有基本场景,其包括地面,沙丘,岩石柱,树和仙人掌。该场景允许包括依赖的材质,因为这些是相当简单的,并且可能不需要根据分辨率或设备而改变。 坦克模型将包括进它自己的AssetBundle中,这将允许更改或更新玩家Asset。 两个额外的AssetBundles将用于完成坦克GameObject。一个包括模型所依赖的材质,另一个则是所依赖的纹理。 这将允许根据需要对纹理和材料进行更改和更新,同时花最少的麻烦。 此特定组织还将允许根据需要(例如目标设备的平台,位置或分辨率)从所选的AssetBundle变体中加载这些资产的替代版本或变体。
       simple_scene.png




要在编辑器中组织和设置AssetBundles,资产本身需要分配给AssetBundle。 查看资产时,AssetBundle名称和AssetBundle变体可以在检查器中预览窗口的底部找到。 必须打开预览窗口才能看到它们。


assetbundlename.png



AssetBundle名严格要求使用小写字母。大写会被自动纠正。



AssetBundle Variants的使用

能够根据需要从AssetBundles加载资产对于加载,存储和更新资产的相关难题允许许多创造性的解决方案。 AssetBundles可以帮忙的一个特定情况是需要根据设备,位置或用户偏好将不同的Assets集合加载到项目中。 这是通过使用AssetBundle Variants来完成的。如下图的资产示例:

matching_variant_structure.png


      在上面的示例中,两个文件夹 - MyAssets-HD和MyAssets-SD已分配给AssetBundle名称“myassets”。 然后每个都被赋予一个AssetBundle变体名称来标识它,在这些情况下,分别是hd和sd。 请注意两组资产如何具有相同的名称并共享相同的层次结构。 由于父目录已分配给AssetBundle,并且没有任何子项分配给AssetBundle,因此所有子项将在构建时添加到父项的AssetBundle。
variant_name_hd.png


MyAssets-HD with AssetBundle Name and AssetBundle Variant Name set.

variant_name_sd.png

MyAssets-SD with AssetBundle Name and AssetBundle Variant Name set.


值得注意的是,可以为AssetBundle名称创建层次化菜单结构。 注意在上面的图像中AssetBundle名称有一个路径:variant / myassets。 这将创建一个新的菜单项作为父级,即“variant”,AssetBundle名称为“myassets”。

ab-variant-menu2.png

一旦Assets被色绘制到AssetBundles,AssetBundles将需要被构建和测试。



论坛(HoloLens全息现实网): http://hololens8.cn

VR/AR/HoloLens开发者QQ群:220104582
VR/AR资源分享QQ群:281921834
HoloLens/VR/AR交流QQ群:433190386




上一篇:让你的三星Gear VR运行其它平台的虚拟现实app
下一篇:Unity之AssetBundles低级API探究(一)难度: 高级
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

注册验证邮件查收提醒:

由于各大邮箱政策原因,

如果没收到邮件提醒,

您的注册验证邮件可能

被投送到您邮箱的垃圾箱,

请注意查收验证哦


QQ|小黑屋|Hololens全息现实网 ( 京ICP备15026232号   点击这里给我发消息

GMT+8, 2018-11-21 20:33 , Processed in 0.534626 second(s), 31 queries .

Powered by Hololens全息现实网 X3.2

© 2001-2017 Hololens全息现实网

快速回复 返回顶部 返回列表