AssetBundle Load模拟器的实现
问题
游戏开发在进入一定阶段后,必定会导入AssetBundle系统。
修改了AssetBundle的数据后,想看到变化后的内容,开发的流程如下图:
每一次修改Asset之后,都需要重新对AssetBundle进行编译,非常浪费时间。 所以这次想要做一个AssetBundle Load的模拟器。
在使用模拟器后,开发的流程可以变成下图:
其实AssetBundleManager中含有一个类似的功能叫SimulationMode,但是AssetBundleManager由于一些问题,我们没有使用,所以也需要自己实现这个功能。
AssetBundle Load模拟器
功能简介
- Asset更新时无需Build AssetBundle即可读取Asset
- 可以立即反应出更新后的内容
- 支持Variant
- 能够简单的在模拟器模式和普通模式间切换5.
实现方法
模拟器主要需要对两种资源的加载进行模拟,一种是Scene,另一种是普通的Asset。
可以使用如下方法,根据AssetBundle名和Asset名来取得本地的文件路径。
AssetDatabase.GetAssetPathsFromAssetBundleAndAssetName(assetBundleName, assetName);
Load Scene
我们知道,在AssetBundle中的Scene是不需要添加入BuildSettings也可以使用SceneManager来进行Load的。
那么在Editor中,我们可以使用如下API来完成同样的功能。无需添加BuildSetting对Scene进行Load。
- EditorApplication.LoadLevelAdditiveInPlayMode
- EditorApplication.LoadLevelAdditiveAsyncInPlayMode
- EditorApplication.LoadLevelAsyncInPlayMode
- EditorApplication.LoadLevelInPlayMode
具体实现如下
Load Asset
读取普通的Asset可以使用以下API。
public static Object LoadMainAssetAtPath(string assetPath);
具体实现如下
模拟器中Variant的实现
在AssetBundleManager中,实现Variant的方法是通过m_AssetBundleManifest.GetAllAssetBundlesWithVariant()方法来取得所有含有Variant的AssetBundle。 然后去匹配ActiveVariants来决定使用哪个Variant。
在Editor中我们可以使用AssetDatabase.GetAllAssetBundleNames()方法取得所有的AssetBundle,然后过滤出含有Variant的AssetBundle。含有Varinat的AssetBundle的名字是name.variant的形式。
后面的处理就可以沿用AssetBundleManager的了。