using GFramework.Core.extensions;
using GFramework.Core.system;
using Godot;
namespace GFramework.Core.Godot.system;
///
/// 资源工厂系统抽象基类,用于统一管理各类资源的创建与预加载逻辑。
/// 提供注册场景和资源的方法,并通过依赖的资源加载系统和资产目录系统完成实际资源的获取与构造。
///
public abstract class AbstractResourceFactorySystem : AbstractSystem, IResourceFactorySystem
{
private ResourceFactory.Registry? _registry;
private IResourceLoadSystem? _resourceLoadSystem;
private IAssetCatalogSystem? _assetCatalogSystem;
///
/// 系统初始化方法,在系统启动时执行一次。
/// 初始化资源注册表,并获取依赖的资源加载系统和资产目录系统。
/// 最后执行所有已注册资源的预加载操作。
///
protected override void OnInit()
{
_registry = new ResourceFactory.Registry();
_resourceLoadSystem = this.GetSystem();
_assetCatalogSystem = this.GetSystem();
RegisterResources();
// 执行预加载
_registry.PreloadAll();
}
///
/// 注册系统所需的各种资源类型。由子类实现具体注册逻辑。
///
protected abstract void RegisterResources();
///
/// 获取指定类型的资源工厂函数。
///
/// 要获取工厂的资源类型
/// 返回创建指定类型资源的工厂函数
public Func Get() => _registry!.Resolve();
#region Register Helpers(声明式)
///
/// 注册场景资源工厂。
/// 根据场景键名获取场景ID,并将场景加载工厂注册到注册表中。
///
/// 场景节点类型,必须继承自Node
/// 场景在资产目录中的键名
/// 是否需要预加载该场景资源
private void RegisterScene(
string sceneKey,
bool preload = false)
where T : Node
{
var id = _assetCatalogSystem!.GetScene(sceneKey);
_registry!.Register(
_resourceLoadSystem!.GetOrRegisterSceneFactory(id),
preload
);
}
///
/// 注册普通资源工厂。
/// 根据资源键名获取资源ID,并将资源加载工厂注册到注册表中。
///
/// 资源类型,必须继承自Resource
/// 资源在资产目录中的键名
/// 是否需要复制资源实例
/// 是否需要预加载该资源
private void RegisterResource(
string resourceKey,
bool duplicate = false,
bool preload = false)
where T : Resource
{
var id = _assetCatalogSystem!.GetResource(resourceKey);
_registry!.Register(
_resourceLoadSystem!.GetOrRegisterResourceFactory(id, duplicate),
preload
);
}
#endregion
}