using GFramework.Core.system;
namespace GFramework.Godot.system;
///
/// 资源目录系统抽象基类,用于管理和注册游戏中的场景和资源
///
public abstract class AbstractAssetCatalogSystem : AbstractSystem, IAssetCatalogSystem
{
private readonly Dictionary _scenes = new();
private readonly Dictionary _resources = new();
///
/// 系统初始化时调用,用于注册所有资产
///
protected override void OnInit()
{
RegisterAssets();
}
///
/// 抽象方法,由子类实现具体的资产注册逻辑
///
protected abstract void RegisterAssets();
#region Register(内部 or Module 使用)
///
/// 注册场景资源
///
/// 场景的唯一标识键
/// 场景资源的路径
/// 当场景键已存在时抛出异常
public void RegisterScene(string key, string path)
{
if (_scenes.ContainsKey(key))
throw new InvalidOperationException($"Scene key duplicated: {key}");
_scenes[key] = new AssetCatalog.SceneId(path);
}
///
/// 注册场景资源
///
/// 包含键和场景标识符的映射对象
/// 当场景键已存在时抛出异常
public void RegisterScene(AssetCatalog.AssetCatalogMapping mapping)
{
if (mapping.Id is not AssetCatalog.SceneId sceneId)
throw new InvalidOperationException("Mapping ID is not a SceneId");
if (!_scenes.TryAdd(mapping.Key, sceneId))
throw new InvalidOperationException($"Scene key duplicated: {mapping.Key}");
}
///
/// 注册普通资源
///
/// 资源的唯一标识键
/// 资源的路径
/// 当资源键已存在时抛出异常
public void RegisterResource(string key, string path)
{
if (_resources.ContainsKey(key))
throw new InvalidOperationException($"Resource key duplicated: {key}");
_resources[key] = new AssetCatalog.ResourceId(path);
}
///
/// 注册普通资源
///
/// 包含键和资源标识符的映射对象
/// 当资源键已存在时抛出异常
public void RegisterResource(AssetCatalog.AssetCatalogMapping mapping)
{
if (mapping.Id is not AssetCatalog.ResourceId resourceId)
throw new InvalidOperationException("Mapping ID is not a ResourceId");
if (!_resources.TryAdd(mapping.Key, resourceId))
throw new InvalidOperationException($"Resource key duplicated: {mapping.Key}");
}
#endregion
#region Query(对外)
///
/// 根据键获取场景ID
///
/// 场景的唯一标识键
/// 对应的场景ID
public AssetCatalog.SceneId GetScene(string key) => _scenes[key];
///
/// 根据键获取资源ID
///
/// 资源的唯一标识键
/// 对应的资源ID
public AssetCatalog.ResourceId GetResource(string key) => _resources[key];
///
/// 检查是否存在指定键的场景
///
/// 场景的唯一标识键
/// 如果存在返回true,否则返回false
public bool HasScene(string key) => _scenes.ContainsKey(key);
///
/// 检查是否存在指定键的资源
///
/// 资源的唯一标识键
/// 如果存在返回true,否则返回false
public bool HasResource(string key) => _resources.ContainsKey(key);
#endregion
}