加载中…
个人资料
侑虎科技
侑虎科技 新浪机构认证
  • 博客等级:
  • 博客积分:0
  • 博客访问:74,206
  • 关注人气:29
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
正文 字体大小:

​【厚积薄发】揭开Unity AssetBundle庐山真面目(二)

(2016-02-03 19:19:36)
标签:

杂谈


昨天的分享揭开AssetBundle庐山真面目(一,我们主要剖析了4.x版本下的AssetBundle管理机制,那5.x版本究竟有些什么变化呢?今天我们来一探究竟。

同时如果你恰有相关疑问,欢迎加入QQ群(465082844)讨论,当然也不要忘记关注UWA哦。


AssetBundle打包(5.x)基础



唯一API

public static AssetBundleManifest BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions = BuildAssetBundleOptions.None, BuildTarget targetPlatform = BuildTarget.WebPlayer);

调用BuildPipeline.BuildAssetBundles,引擎将自动根据资源的assetbundleName属性(以下简称abName)批量打包,自动建立Bundle以及资源之间的依赖关系。

 
打包规则

在资源的Inpector界面最下方可设置一个abName,每个abName(包含路径)对应一个Bundle,即abName相同的资源会打在一个Bundle中。如果所依赖的资源设置了不同的abName,则会与之建立依赖关系,避免出现冗余。

​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)

支持增量式发布,即在资源内容改变并重新打包时,会自动跳过内容未变的Bundle。因此,相比4.x,会极大地缩短更新Bundle的时间。

 
新打包选项
 
除了前文提到的,5.x下默认开启的三个选项(CompleteAssets ,用于保证资源的完备性;CollectDependencies,用于收集资源的依赖项;DeterministicAssetBundle,用于为资源维护固定ID)之外,5.x中新增了以下选项:

● ForceRebuildAssetBundle,用于强制重打所有AssetBundle文件;

● IgnoreTypeTreeChanges,用于判断AssetBundle更新时,是否忽略TypeTree的变化;

● AppendHashToAssetBundleName,用于将Hash值添加在AssetBundle文件名之后,开启这个选项,可以直接通过文件名来判断哪些Bundle的内容进行了更新(4.x下普遍需要通过比较二进制等方法来判断,但在某些情况下即使内容不变重新打包,Bundle的二进制也会变化)。


与4.x不同的是,对于移动平台,5.x下默认会将TypeTree信息写入AssetBundle,因此在移动平台上DisableWriteTypeTree选项也变得有意义了。

Manifest文件在4.x版本中,我们通常需要自行维护配置文件,以记录AssetBundle之间的依赖关系,并供运行时使用。而在5.x版本中,Manifest文件可以免去这一过程。

Variant参数
Variant参数能够让AssetBundle方便地进行“多分辨率支持”,相关详解请移步下文。


AssetBundle 打包(5.x)进阶


在新系统中,添加了以下两个实用的新特性,也许能够给开发者带来事半功倍的效果。
 
 
Manifest文件
 
在打包后生成的文件夹中,每个Bundle都会对应一个manifest文件,记录了Bundle的一些信息,但这类manifest只在增量式打包时才用到;同时,根目录下还会生成一个同名manifest文件及其对应的Bundle文件,通过该Bundle可以在运行时得到一个AssetbundleManifest对象,而所有的Bundle以及各自依赖的Bundle都可以通过该对象提供的接口进行获取。
 
Variant参数
 
在资源的Inspector界面最下方,除了可以指定abName,在其后方还可以指定Variant。打包时,Variant会作为后缀添加在Bundle名字之后。相同abName,不同variant的Bundle中,资源必须是一一对应的,且他们在Bundle中的ID也是相同的,从而可以起到相互替换的作用。

​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)当需要为手机和平板上的某个UI界面使用两套分辨率不同的纹理、Shader,以及文字提示时,借助Variant的特性,只需创建两个文件夹,分别放置两套不同的资源,且资源名一一对应,然后给两个文件夹设置相同的abName和不同的variant,再给UI界面设置abName,然后进行打包即可。运行时,先选择合适的依赖包加载,那么后续加载UI界面时,会根据已加载的依赖包,呈现出相对应的版本。


开发者注意事项


● abName可通过脚本进行设置和清除,也可以通过构造一个AssetBundleBuild数组来打包。

 

新机制打包无法指定Assetbundle.mainAsset,因此无法再通过mainAsset来直接获取资源。

 

开启DisableWriteTypeTree可能造成AssetBundle对Unity版本的兼容问题,但会使Bundle更小,同时也会略微提高加载速度。

 

● Prefab之间不会建立依赖,即如果Prefab-A和Prefab-B引用了同一张纹理,而他们设置了不同的abName,而共享的纹理并未设置abName,那么Prefab-A和Prefab-B可视为分别打包,各自Bundle中都包含共享的纹理。因此在使用UGUI,开启Sprite Packer时,由于Atlas无法标记abName,在设置UI界面Prefab的abName时就需要注意这个问题。

​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)

● 5.x中加入了Shader stripping功能,在打包时,默认情况下会根据当前场景的Lightmap及Fog设置对资源中的Shader进行代码剥离。这意味着,如果在一个空场景下进行打包,则Bundle中的Shader会失去对Lightmap和Fog的支持,从而出现运行时Lightmap和Fog丢失的情况.而通过将Edit->Project Settings->Graphics下shader Stripping中的modes改为Manual,并勾选相应的mode即可避免这一问题。

​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)

UWA即将推出AssetBundle资源检测功能,高效检测AssettBundle文件的创建是否合理,包括具体资源信息检索、冗余资源检测等,敬请期待!

拜托向朋友们推荐UWA​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)

​【厚积薄发】揭开Unity <wbr>AssetBundle庐山真面目(二)

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有