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 }