XFramework源码
一、ResourceManager
1.介绍
XFramework提供集成了三种资源加载方式,AssetBundle
Resources
AssetDataBase
,一般来说建议在输出之后使用AssetBundle,在开发过程中使用AssetDataBase,尽可能不使用Resources。
Game脚本中存有对ResourceManager的引用
public static ResourceManager ResModule { get; private set; }
在初始化模块的时候需要传入加载辅助类来确定加载方式,除非你明确的知道自己想干什么,否则不要卸载资源模块
#if UNITY_EDITOR
ResModule = GameEntry.AddModule<ResourceManager>(new AssetDataBaseLoadHelper());
#else
ResModule = GameEntry.AddModule<ResourceManager>(new AssetBundleLoadHelper());
#endif
2.使用方式
ResourceManager会在加载资源的时候根据初始化时传入辅助类来决定当前的加载方式,除了内置的AssetBundleLoadHelper和AssetDataBaseLoadHelper以外,使用者可以根据自身需要新增辅助类,继承接口IResourceLoadHelper即可。
假设有一个预制体在工程中的路径为 “Assets/ABRes/Prefabs/obj.prefab”
2.1 同步加载
/// <summary>
/// 同步加载资源
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="assetName"></param>
/// <returns>资源</returns>
public T Load<T>(string assetName) where T : Object
/// <summary>
/// 加载一个路径下的所有资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="path">资源路径</param>
/// <param name="isTopOnly">是否是仅加载本层级的资源</param>
/// <returns>资源组</returns>
public T[] LoadAll<T>(string path, bool isTopOnly = true) where T : Object
如果希望加载Resources文件夹中的资源可以使用以下方式,传入的路径开头"Res"是用来识别是否使用Resources方式加载资源的,异步加载时也是这样
Texture texture = Game.ResModule.Load<Texture>("Res/resPath...");
2.2 异步加载
/// <summary>
/// 异步加载资源
/// </summary>
/// <param name="assetName">资源名称</param>
/// <param name="callBack">回调函数</param>
/// <returns>加载进度</returns>
public IProgress LoadAsync<T>(string assetName, System.Action<T> callBack) where T : Object
/// <summary>
/// 加载一个路径下的所有资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="path">资源路径</param>
/// <param name="isTopOnly">是否是仅加载本层级的资源</param>
/// <returns>资源组</returns>
public IProgress LoadAllAsync<T>(string path, bool isTopOnly, System.Action<T[]> callback) where T : Object
2.3 实例化资源
同样提供同步和异步两种方式,第一次实例化一种资源时,资源管理器会先加载并存到一个字典中然后再实例化,之后就不再加载资源。实体的管理可以使用EntityManager,ResourceManager的实例化一般不使用。
同步和异步的实例化还提供了多个重载,但最后都会执行下面两个函数。
/// <summary>
/// 实例化资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="assetName">资源名称</param>
/// <param name="position">位置</param>
/// <param name="quaternion">方向</param>
/// <param name="parent">父物体</param>
/// <returns>资源的拷贝</returns>
public T Instantiate<T>(string assetName, Vector3 position, Quaternion quaternion, Transform parent) where T : Object
/// <summary>
/// 异步实例化资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="assetName">资源名称</param>
/// <param name="position">位置</param>
/// <param name="quaternion">方向</param>
/// <param name="parent">父物体</param>
/// <param name="callBack">实例化完成回调</param>
public void InstantiateAsync<T>(string assetName, Vector3 position, Quaternion quaternion, Transform parent, System.Action<T> callBack = null) where T : Object
2.4 使用示例
// 同步加载资源
GameObject obj = Game.ResModule.Load<GameObject>("Assets/ABRes/Prefabs/obj.prefab");
//异步加载资源
Game.ResModule.LoadAsync<GameObject>("Assets/ABRes/Prefabs/obj.prefab", (obj) =>
{
// do something
});
// 同步加载一个文件夹/ab包中的所有资源
GameObject[] objs = Game.ResModule.LoadAll<GameObject>("Assets/ABRes/Prefabs");
// 异步加载一个文件夹/ab包中的所有资源
Game.ResModule.LoadAllAsync<GameObject>("Assets/ABRes/Prefabs", false, (objs) =>
{
// do something
});
二、AB包打包
通过上述内容已经可以在编辑器下正常加载资源了,若想在输出的工程中加载资源还需要对资源进行打包
框架的打包工具提供了两种不同的打包方式。先选择 XFramework->Resource->AssetBundleWindow,打开打包窗口。打开后长这样。
1. 默认打包方式
如果某个资源想在输出后环境下通过ResourceManager加载资源,请使用这种打包方式。
1.1 操作
打包窗口如下,上半部分为选择的要打包的文件夹,可以修改ab包分类方式。下半部分为打包后所有ab包及ab包类容的预览。
打包步骤
- 添加要打包的资源文件夹
- 选择打包方式(除非明确知道自己在干什么,否则使用默认的 All Directiony)
到此为止,你就可以在StreamingAssets文件夹下看到打包好的AB包了
1.2 增量包
窗口右下角有一个Toggle可以选择是否是增量包打包,如果之前已经进行过ab包打包,此次只是打包新增资源或者是打包部分修改的资源,可以勾选。增量包打包时会把之前的依赖文件和新的依赖文件进行合并
2.单个资源打包
有的时候,我们可能会希望将一个预制体及其依赖的其他资源打成一个ab包,可以使用Dependence打包方式。它会检索一个预制体所有的依赖文件然后打包在一起。如下:
注意使用这种打包方式时两个预制体不应依赖同一个文件,否则会报错。如果出现这种情况,可以分批打包,只要保证同时打包的多个预制体不会依赖相同文件即可。
使用这种打包方式的资源可以直接使用AssetBundleLoadHelper加载,如果想同过ResourceManager加载,请小心选择ab存放位置。