AssetBundle Load模拟器的实现

问题

游戏开发在进入一定阶段后,必定会导入AssetBundle系统。

修改了AssetBundle的数据后,想看到变化后的内容,开发的流程如下图:
f:id:lvmingbei:20160830161052p:plain

每一次修改Asset之后,都需要重新对AssetBundle进行编译,非常浪费时间。 所以这次想要做一个AssetBundle Load的模拟器。

在使用模拟器后,开发的流程可以变成下图:
f:id:lvmingbei:20160830161050p:plain

其实AssetBundleManager中含有一个类似的功能叫SimulationMode,但是AssetBundleManager由于一些问题,我们没有使用,所以也需要自己实现这个功能。

AssetBundle Load模拟器

功能简介

  1. Asset更新时无需Build AssetBundle即可读取Asset
  2. 可以立即反应出更新后的内容
  3. 支持Variant
  4. 能够简单的在模拟器模式和普通模式间切换5.

实现方法

模拟器主要需要对两种资源的加载进行模拟,一种是Scene,另一种是普通的Asset。
可以使用如下方法,根据AssetBundle名和Asset名来取得本地的文件路径。
AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName(assetBundleName, assetName);

Load Scene

我们知道,在AssetBundle中的Scene是不需要添加入BuildSettings也可以使用SceneManager来进行Load的。
那么在Editor中,我们可以使用如下API来完成同样的功能。无需添加BuildSetting对Scene进行Load。

具体实现如下
f:id:lvmingbei:20160830161057p:plain

Load Asset

读取普通的Asset可以使用以下API
public static Object LoadMainAssetAtPath(string assetPath);

具体实现如下

f:id:lvmingbei:20160830161055p:plain

模拟器中Variant的实现

AssetBundleManager中,实现Variant的方法是通过m_AssetBundleManifest.GetAllAssetBundlesWithVariant()方法来取得所有含有Variant的AssetBundle。 然后去匹配ActiveVariants来决定使用哪个Variant。
在Editor中我们可以使用AssetDatabase.GetAllAssetBundleNames()方法取得所有的AssetBundle,然后过滤出含有Variant的AssetBundle。含有Varinat的AssetBundle的名字是name.variant的形式。
后面的处理就可以沿用AssetBundleManager的了。