Skip to the content.

资源管理

目录

ResMgr介绍

ResMgr提供了统一的本地游戏资源获取接口,它可以对本地AssetBundle文件或者是Resources目录中的资源进行加载/释放。

初始化管理器

资源管理器的初始化工作会在Preload中根据Runtime配置自动完成,这里我们只是了解下就可以了。

/// <summary>
/// 初始化管理器
/// </summary>
/// <param name="type">资源管理器类型</param>
/// <param name="manifestFilePath">Manifest文件地址</param>
public void Init(EResMgrType type, string manifestFilePath)

目前可以通过资源管理器管理的资源类型有三种

Manifest文件

指的并不是后缀名为.manifest的文件,而是打包AB时生成的描述所有AB资源依赖的AB包。

获取资源

同步方式获取资源

/// <summary>
/// 加载资源
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="abName">资源包名称</param>
/// <param name="assetName">资源名称</param>
/// <returns></returns>
public T Load<T>(string abName, string assetName) where T : UnityEngine.Object

或者

public T Load<T>(string assetPath) where T : UnityEngine.Object

异步方式获取资源

/// <summary>
/// 异步加载一个资源
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="abName">资源包名称</param>
/// <param name="assetName">资源名称</param>
/// <param name="onLoaded">资源加载完成的回调</param>
/// <param name="onProgress">资源加载的进度</param>
public void LoadAsync(string abName, string assetName, Action<UnityEngine.Object> onLoaded, Action<float> onProgress = null)

或者

public void LoadAsync(string assetPath,  Action<UnityEngine.Object> onLoaded, Action<float> onProgress = null)

资源路径的格式

假设我们打包的ab资源目录下有assetbundle文件ab/hot_res/audios.ab,其中有个声音资源叫click。那么我们通过以下三种格式的写法来获取该资源:

<font color=#4EB170>

1.ResMgr.Ins.Load("hot_res/audios.ab", "click");

2.ResMgr.Ins.Load("hot_res/audios", "click");

3.ResMgr.Ins.Load("hot_res/audios/click");

</font>

获取资源的依赖

/// <summary>
/// 得到AB资源的依赖
/// </summary>
/// <param name="abName"></param>
/// <returns></returns>
public string[] GetDepends(string abName)

释放资源

不是用的资源可以释放掉以避免内存泄漏以及回收闲置内存

/// <summary>
/// 卸载资源
/// </summary>
/// <param name="abName">资源包名称</param>
/// <param name="isUnloadAllLoaded">是否卸载Hierarchy中的资源</param>
/// <param name="isUnloadDepends">是否卸载关联的资源</param>
public void Unload(string abName, bool isUnloadAllLoaded = false, bool isUnloadDepends = true)
/// <summary>
/// 卸载所有资源
/// </summary>
/// <param name="isUnloadAllLoaded">是否卸载Hierarchy中的资源</param>
public void UnloadAll(bool isUnloadAllLoaded = false)

GC

为了避免APP占用内存过大,我们在适当的时候可以释放掉APP占用的闲置内存。
调用的频率不能太快,GC会有一定的CPU开销。

/// <summary>
/// 执行一次内存回收(该接口开销大,可能引起卡顿)
/// </summary>
public void DoGC()
{
    //移除没有引用的资源
    Resources.UnloadUnusedAssets();
    GC.Collect();
}