资源管理
简介
资源管理组件(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);
最佳实践
使用建议
资源加载:
- 优先使用异步加载避免卡顿
- 合理使用批量加载接口
- 注意协程锁的使用范围
内存管理:
- 及时卸载不需要的资源
- 使用
using
语句管理协程锁 - 避免重复加载相同资源
场景管理:
- 区分主场景和子场景的加载方式
- 正确处理场景切换时的资源释放
- 合理规划场景资源依赖
注意事项
WARNING
- 异步加载操作需要使用
await
等待完成 - 资源路径(location)必须与打包配置一致
- 注意处理加载失败的异常情况
- 避免在频繁更新的循环中同步加载资源
技术支持
获取帮助
- 💬 加入QQ群讨论交流
(ET框架群)
: 474643097 - ⭐ 在GitHub上关注项目获取最新更新
- 📚 查看 YooAsset文档 了解更多细节