Skip to content

资源管理

简介

资源管理组件(ResourcesComponent)是基于YooAsset的资源管理系统,提供了统一的资源加载、卸载和生命周期管理机制。主要特点:

  • 基于YooAsset框架
  • 支持同步/异步加载
  • 自动引用计数管理
  • 场景加载支持
  • 协程锁保护

核心功能

1. 组件生命周期

csharp
// 默认包初始化
public class ResourcesComponentAwakeSystem : AwakeSystem<ResourcesComponent>
{
    protected override void Awake(ResourcesComponent self)
    {
        self.package = YooAssets.GetPackage("DefaultPackage");
    }
}

// 自定义包初始化
public class ResourcesComponentAwakeASystem : AwakeSystem<ResourcesComponent, string>
{
    protected override void Awake(ResourcesComponent self, string packageName)
    {
        self.package = YooAssets.GetPackage(packageName);
    }
}

2. 资源加载接口

同步加载

csharp
// 加载单个资源
T asset = resourcesComponent.LoadAssetSync<T>(string location);

异步加载

csharp
// 加载单个资源
T asset = await resourcesComponent.LoadAssetAsync<T>(string location);

// 加载同类型资源集合
Dictionary<string, T> assets = await resourcesComponent.LoadAllAssetsAsync<T>(string location);

// 加载场景
await resourcesComponent.LoadSceneAsync(string location, LoadSceneMode loadSceneMode);

3. 资源卸载

csharp
// 卸载指定资源
resourcesComponent.UnLoadAssetSync(string location);

特性说明

1. 引用计数管理

  • 自动管理资源句柄的生命周期
  • 支持多种类型的资源句柄:
    • AssetOperationHandle
    • AllAssetsOperationHandle
    • SubAssetsOperationHandle
    • RawFileOperationHandle
    • SceneOperationHandle

2. 自动资源释放

csharp
// 组件销毁时自动释放所有资源
public class ResourcesComponentDestroySystem : DestroySystem<ResourcesComponent>
{
    protected override void Destroy(ResourcesComponent self)
    {
        foreach (var kv in self.handlers)
        {
            switch (kv.Value)
            {
                case AssetOperationHandle handle:
                    handle.Release();
                    break;
                case AllAssetsOperationHandle handle:
                    handle.Release();
                    break;
                case SubAssetsOperationHandle handle:
                    handle.Release();
                    break;
                case RawFileOperationHandle handle:
                    handle.Release();
                    break;
                case SceneOperationHandle handle:
                    if (!handle.IsMainScene())
                        handle.UnloadAsync();
                    break;
            }
        }
    }
}

这样的好处在于:

当创建了一个CurrentScene战斗场景,给其挂载上资源组件,然后战斗的资源都通过这个组件加载,这时候当战斗结束的时候,战斗场景销毁了,这个组件就会调用Dispose的生命周期销毁方法,释放掉当时加载的资源。

特点说明:

  • 组件销毁时自动释放所有资源句柄
  • 支持所有类型资源的正确释放
  • 防止资源泄露

3. 协程锁保护

  • 使用 CoroutineLock 确保资源加载的线程安全
  • 基于位置哈希值的锁定机制
  • 防止重复加载同一资源

4. 场景管理

  • 支持异步场景加载
  • 自动处理主场景和子场景的关系
  • 场景卸载时自动处理资源释放

使用示例

1. 基础资源加载

csharp
// 同步加载预制体
GameObject prefab = self.ResourcesComponent.LoadAssetSync<GameObject>("Character");

// 异步加载贴图
Texture2D texture = await self.ResourcesComponent.LoadAssetAsync<Texture2D>("Background");

2. 批量资源加载

csharp
// 加载某目录下所有精灵
Dictionary<string, Sprite> sprites = await self.ResourcesComponent.LoadAllAssetsAsync<Sprite>("Icons");
foreach (var sprite in sprites.Values)
{
    // 使用精灵
}

3. 场景加载

csharp
// 异步加载新场景
await self.ResourcesComponent.LoadSceneAsync("Level1", LoadSceneMode.Single);

// 异步加载附加场景
await self.ResourcesComponent.LoadSceneAsync("UI", LoadSceneMode.Additive);

最佳实践

使用建议

  1. 资源加载

    • 优先使用异步加载避免卡顿
    • 合理使用批量加载接口
    • 注意协程锁的使用范围
  2. 内存管理

    • 及时卸载不需要的资源
    • 使用 using 语句管理协程锁
    • 避免重复加载相同资源
  3. 场景管理

    • 区分主场景和子场景的加载方式
    • 正确处理场景切换时的资源释放
    • 合理规划场景资源依赖

注意事项

WARNING

  1. 异步加载操作需要使用 await 等待完成
  2. 资源路径(location)必须与打包配置一致
  3. 注意处理加载失败的异常情况
  4. 避免在频繁更新的循环中同步加载资源

技术支持

获取帮助

  • 💬 加入QQ群讨论交流(ET框架群) : 474643097
  • ⭐ 在GitHub上关注项目获取最新更新
  • 📚 查看 YooAsset文档 了解更多细节

Released under the MIT License.